在multi-container Pod
中,每个容器都应该运行一个进程,该进程在 POD 的生命周期内一直保持活动状态。例如,具有 Web 应用程序和日志记录代理的多容器 Pod 中,两个容器都应始终保持活动状态。只要 Web 应用程序正在运行,日志代理容器中运行的进程就应该保持活动状态。如果其中任何一个失败,POD 都会重新启动。
但有时会有这种场景,例如,Web程序加载外部数据。该任务仅在首次创建 Pod 时运行一次,或者在实际应用程序启动之前等待外部服务或数据库启动。这就是 initContainers 发挥作用的地方。
initContainer 与所有其他容器一样在 pod 中进行配置,只不过它是在 initContainers
部分中指定的,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'git clone <some-repository-that-will-be-used-by-application> ; done;']
首次创建 POD 时,会运行 initContainer
,并且 initContainer
中的进程必须在托管应用程序的实际容器启动之前运行完成。
您也可以配置多个这样的 initContainer
,就像我们对multi-container Pod
所做的那样。在这种情况下,每个初始化容器都会按顺序一次运行一个。
如果任何 initContainer
无法完成,Kubernetes 会重复重新启动 Pod,直到 InitContainer
运行成功。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
参考:
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/