initContainer

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/