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 容器不支持 lifecycle
、livenessProbe
、readinessProbe
和 startupProbe
, 因为它们必须在 Pod 就绪之前运行完成。
如果为一个 Pod 指定了多个 Init 容器,这些容器会按顺序逐个运行。 每个 Init 容器必须运行成功,下一个才能够运行。
当所有的 Init 容器运行完成时, Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。
创建一个包含Init容器的pod
等init容器启动之后pod才会启动
vim initpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: busybox
command: ['sh','-c','date && sleep 1800']
ports:
- containerPort: 80
initContainers:
- name: init
image: busybox
command: ['sh','-c','date && sleep 10']
构建pod
kubectl apply -f initpod.yaml
然后监控一下pod
kubectl get po -w
查看pod里指定容器的日志
kubectl logs myapp -c init