init Container
初始化容器是一类只运行一次的容器,本质是也是容器,不同容器间启动有先后顺序,只有前面的容器运行成功了,后面的容器才能运行
初始化容器的场景:
- 在其他容器运行之前做个初始化,比如配置文件生成、环境变量生成
- 有先后顺序的运行容器,比如像启动数据库容器、再启动服务容器
- 下载依赖文件或依赖包,对系统做一些预制的操作
-
apiVersion: v1 kind: Pod metadata: name: nginx annotations: spec: #初始化容器,只会执行一次 initContainers: - name: busybox image: busybox command: - wget - "-O" - "/work-dir/index.html" - http://kubernetes.io volumeMounts: - name: workdir mountPath: "/work-dir" containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html dnsPolicy: Default restartPolicy: Always volumes: - name: workdir emptyDir: {}
已上配置文件,首先要运行一个busybox,并且下载一个文件到/work-dir中,然后启动nginx容器,在/usr/share/nginx/html中就有了文件index.html
//查看nginx容器的index.html文件 kubectl exec -it nginx -- cat /usr/share/nginx/html/index.html
kubectl describe pod nginx Name: nginx Namespace: default Priority: 0 Service Account: default Node: scms01/172.16.2.220 Start Time: Fri, 21 Apr 2023 17:55:46 +0800 Labels: <none> Annotations: cni.projectcalico.org/containerID: a41631bbfb14e42f600f44841550a2ccaa7977e22d19142033ce19f7ee7a69fc cni.projectcalico.org/podIP: 192.168.61.43/32 cni.projectcalico.org/podIPs: 192.168.61.43/32 Status: Running IP: 192.168.61.43 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 33m default-scheduler Successfully assigned default/nginx to scms01 Normal Pulling 33m kubelet Pulling image "busybox" Normal Pulled 33m kubelet Successfully pulled image "busybox" in 1.648537736s (1.648546748s including waiting) Normal Created 33m kubelet Created container busybox Normal Started 33m kubelet Started container busybox Normal Pulling 33m kubelet Pulling image "nginx" Normal Pulled 33m kubelet Successfully pulled image "nginx" in 1.695249999s (1.695256875s including waiting) Normal Created 33m kubelet Created container nginx Normal Started 33m kubelet Started container nginx
可见先启动了buysbox,然后又启动了nginx容器。
init container与应用容器的区别
- init container 必须在应用容器启动之前运行,但设置了多个init container ,将按顺序执行,只有前面的成功后,后面的才能运行
- 在init container的定义中也可以设置资源限制、Volume的使用和安全策略。