初始化容器 ¶
Pod 可以有多个容器在其中运行应用程序,但它也可以有一个或多个 init 容器,这些容器在应用程序容器启动之前运行。
Init 容器与常规容器完全相同,除了:
-
初始化容器始终运行至完成。
-
每个初始化容器必须在下一个容器启动之前成功完成。
如果 Pod 的 init 容器失败,kubelet 会重复重新启动该 init 容器,直到成功。但是,如果 Pod 的值为restartPolicyNever,并且 init 容器在该 Pod 启动期间失败,则 Kubernetes 会将整个 Pod 视为失败。
要为 Pod 指定 init 容器,请将字段作为项目数组添加initContainers到Pod 规范container中
初始化正在使用的容器
此示例定义了一个简单的 Pod,它有两个 init 容器。第一个等待myservice,第二个等待mydb。一旦两个 init 容器完成,Pod 就会从其spec部分运行应用程序容器。
init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
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', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
[1. ]使用该配置文件创建一个 Pod:
kubectl apply -f init.yaml
[2. ]并通过以下方式检查其状态:
kubectl get -f init.yaml
[3. ]了解更多详情
kubectl describe -f init.yaml
[4.] 要查看此 Pod 中 init 容器的日志,请运行:
kubectl logs myapp-pod -c init-myservice # Inspect the first init container
kubectl logs myapp-pod -c init-mydb # Inspect the second init container
此时,那些初始化容器将等待发现服务命名为 mydb和myservice。
[5.] 可以使用以下配置来显示这些服务:
pod.yaml
创建mydb和myservice服务:
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
kubectl apply -f services.yaml
[6.] 看到这些 init 容器已完成,并且 Podmyapp-pod 进入 Running 状态:
kubectl get -f init.yaml