Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • 每个都必须在下一个启动之前成功完成。

如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。
然而,如果 Pod 对应的 restartPolicy 值为 “Never”,Kubernetes 不会重新启动 Pod。
为 Pod 设置 Init 容器需要在 Pod 的 spec 中添加 initContainers 字段, 该字段以 Container 类型对象数组的形式组织,和应用的 containers 数组同级相邻。 Init 容器的状态在 status.initContainerStatuses 字段中以容器状态数组的格式返回 (类似 status.containerStatuses 字段)。

与普通容器的不同之处

Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。
然而,Init 容器对资源请求和限制的处理稍有不同。
同时 Init 容器不支持 lifecyclelivenessProbereadinessProbestartupProbe, 因为它们必须在 Pod 就绪之前运行完成。
如果为一个 Pod 指定了多个 Init 容器,这些容器会按顺序逐个运行。 每个 Init 容器必须运行成功,下一个才能够运行。
当所有的 Init 容器运行完成时, Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。

创建一个包含Init容器的pod

等init容器启动之后pod才会启动
vim initpod.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: myapp
  5. spec:
  6. containers:
  7. - name: myapp
  8. image: busybox
  9. command: ['sh','-c','date && sleep 1800']
  10. ports:
  11. - containerPort: 80
  12. initContainers:
  13. - name: init
  14. image: busybox
  15. command: ['sh','-c','date && sleep 10']

构建pod

kubectl apply -f initpod.yaml

然后监控一下pod

kubectl get po -w

查看pod里指定容器的日志

kubectl logs myapp -c init