目录
1 INIT 容器的介绍
官方文档
Pod | Kuberneteshttps://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
-
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
-
Init 容器与普通的容器非常像,除了如下两点:
-
它们总是运行到完成
-
init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 Init 容器必须运行成功,下一个才能够运行。
-
-
如果Pod的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。但是,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
2 INIT 容器的功能
-
Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
-
Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
-
应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
-
Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
-
由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
3 INIT容器的示例
[root@k8s-master yaml]# kubectl run shuyan --image myapp:v1 \
--dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: shuyan
name: shuyan
spec:
containers:
- image: myapp:v1
name: shuyan
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
[root@k8s-master yaml]# kubectl run shuyan --image myapp:v1 \
--dry-run=client -o yaml > shuyan.yml
[root@k8s-master yaml]# vim shuyan.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: shuyan
name: shuyan
spec:
containers:
- image: myapp:v1
name: shuyan
initContainers: # 定义就绪容器,只有这个容器运行成功之后才能运行其他容器
- image: busyboxplus:latest
name: initnode
# 定义了一个循环测试testfile文件是否存在,如不存在会一直死循环输出打印语句
command: ["sh","-c","until test -e /testfile;do echo wating for myservice;sleep 2;done"]
3.1 以yml格式启动容器并查看其状态
[root@k8s-master yaml]# kubectl apply -f shuyan.yml
pod/shuyan created
[root@k8s-master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
shuyan 0/1 Init:0/1 0 7s
# 查看状态发现一直显示init容器没有运行完成
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan 0/1 Init:0/1 0 14s 10.244.2.17 k8s-node2 <none> <none>
3.2 查询init容器的日志
查看init容器的系统日志,发现其一直在输出打印的语句,证明在这个系统当中的根目录下并没有一个testfile文件
[root@k8s-master yaml]# kubectl logs pods/shuyan initnode
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
wating for myservice
3.3 进入容器创建文件
[root@k8s-master yaml]# kubectl exec -it pods/shuyan -c initnode -- /bin/sh
/ # ls
bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var
/ # touch testfile
3.4 退出容器查看状态
# ctrl + pq 退出容器
/ # command terminated with exit code 137
# 查看pods状态,发现容器已经成功运行
[root@k8s-master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
shuyan 1/1 Running 0 2m27s
# 查看详细信息
[root@k8s-master yaml]# kubectl describe pods shuyan
3.5 测试容器是否可用
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan 1/1 Running 0 25m 10.244.2.17 k8s-node2 <none> <none>
[root@k8s-master yaml]# curl 10.244.2.17
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>