init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。
官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
init 容器特点
init 容器与普通的容器非常像,除了如下几点:
- 它们总是运行到完成。如果 Pod 的 init 容器失败,kubelet 会不断地重启该 init 容器直到该容器成功为止。然而,如果 Pod 对应的
restartPolicy
值为Never
,并且 Pod 的 init 容器失败,则 Kubernetes 会将整个 Pod 状态设置为失败。 - 一个 Pod 中的 init 容器可以是多个,按照顺序执行。每个都必须在下一个启动之前成功完成。
- 同时 init 容器不支持
lifecycle
、livenessProbe
、readinessProbe
和startupProbe
,因为它们必须在 Pod 就绪之前运行完成。 - 如果为一个 Pod 指定了多个 init 容器,这些容器会按顺序逐个运行。 每个 init 容器必须运行成功,下一个才能够运行。当所有的 init 容器运行完成时,Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。
- init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。然而,init 容器对资源请求和限制的处理稍有不同。
使用 init 容器
在 Pod 的规约中与用来描述应用容器的 containers
数组平行的位置指定 init 容器。
apiVersion: v1 kind: Pod metadata: name: init-demo 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', 'echo init-myservice is running! && sleep 5'] - name: init-mydb image: busybox:1.28 command: ['sh', '-c', 'echo init-mydb is running! && sleep 10']