1.需要将Proxy指定为中的第一个容器spec.containers,但这只是解决方案的一部分,因为它只能确保首先启动代理容器,而不必等待它准备就绪。其他容器立即启动,从而导致容器之间的竞争状态。我们需要防止Kubelet在代理准备好之前启动其他容器。
2.为第一个容器注入PostStart 生命周期钩子
这样就实现了,如果sidecar容器提供了一个等待该sidecar就绪的可执行文件,则可以在容器的启动后挂钩中调用该文件,以阻止pod中其余容器的启动。 kubelet必须等postStart执行完了之后,再开始启动下一个容器。也就是说,假如容器的 PostStart hook 没有返回,kubelet 便不会去创建下一个容器。 (如果poststart失败了,会kill container)
apiVersion: v1kind: Podmetadata:name: sidecar-starts-firstspec:containers:- name: sidecarimage: my-sidecarlifecycle:postStart:exec:command:- /bin/wait-until-ready.sh- name: applicationimage: my-application
k8s自有的Sidecar container
从Kubernetes 1.18可以将容器标记为sidecar,以便它们在正常容器之前启动,而在所有其他容器终止后关闭。因此它们仍然像普通容器一样工作,唯一的区别在于它们的生命周期。目前istio并未使用该方式保证istio-proxy容器的启动顺序,可能是基于版本考虑,并且Sidecar container。
但是sidecar 容器只能保证sidecar早于业务容器启动,不能保证业务容器的启动先后顺序。有什么方式保证么?
apiVersion: v1kind: Podmetadata:name: bookings-v1-b54bc7c9c-v42f6labels:app: demoappspec:containers:- name: bookingsimage: banzaicloud/allspark:0.1.1...- name: istio-proxyimage: docker.io/istio/proxyv2:1.4.3lifecycle:type: Sidecar
