Pod 生命周期的回调

最近项目组里讨论两个问题

1、容器启动先后顺序的问题

2、pilot-wait 阻塞了容器的启动

一、容器启动顺序

关于第一个问题出现了两个观点

第一个观点,容器启动中golang是多个协程运行起的,无法控制顺序

第二个观点,容器是根据yaml 顺序启动的

最后同事阅读代码,论证了第二个观点的正确性,容器启动中没有用协程,其实也没必要用协程,docker 底层api 用的是clone,这个函数本身就不会有任何io阻塞,没有协程必要性

kubernetes/kuberuntime_container.go at b591acca57f918404f35b8905021f2bda0e42866 · kubernetes/kubernetes · GitHub

 

 

二、pilot-wait阻塞问题

经过排查是跟k8s生命周期回调有关

K8s 中暴露了两个接口

PostStart和PreStop

PostStart:

这个回调在容器被创建之后立即被执行。 但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。 没有参数传递给处理程序。

PreStop:

在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此回调会被调用。 如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。 在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。 Pod 的终止宽限周期在 PreStop 回调被执行之前即开始计数,所以无论 回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。 没有参数会被传递给处理程序。

具体文档:

demo:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值