作者:mobiledu2502931467 | 来源:互联网 | 2023-09-23 08:26
最近项目组里讨论两个问题1、容器启动先后顺序的问题2、pilot-wait阻塞了容器的启动一、容器启动顺序关于第一个问题出现了两个观点第一个观点,容器启动中g
最近项目组里讨论两个问题
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-containerimage: nginxlifecycle: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"]