参考来源: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
简单总结与测试:
- 初始化容器是在 Pod 中的主容器启动之前要运行的容器。每个初始化容器必须要运行完成,主容器才会启动。
- 初始化容器有以下几个主要用途:
- 提供主容器镜像中不存在的工具或文件。例如密钥、配置文件等。
- 初始化容器需要的文件可能在镜像构建阶段无法知晓。使用初始化容器可以延迟到运行时再生成或获取这些文件。
- 可以包含工具来检查主容器运行的前提条件,然后在主容器启动前初始化这些条件。
- Pod 可以有多个初始化容器,它们按顺序执行并将对文件系统产生的改变传递到下一个初始化容器。
- 每个初始化容器都必须在下一初始化容器启动之前成功完成。如果任何一个初始化容器失败了,Kubernetes 会重启该 Pod。
- 初始化容器的资源请求和重启策略与主容器一致。初始化容器支持生命周期声明和生命钩子。
- 使用初始化容器需要在 Pod 配置的
spec.initContainers
字段指定。初始化容器具有和主容器相同的配置选项,例如 image、command、args、ports 等。 - 初始化容器使用 Linux 命名空间,因此具有自主的文件系统视图和网络接口。它们不会在主容器或者其他初始化容器中共享进程空间。
总之,初始化容器为 Pod 提供了一个更强大的初始化和启动配置功能。利用它可以更灵活地来配置和执行一些初始化操作。
cat myapps.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"]
kubectl apply -f myapps.yaml
kubectl get -f myapps.yaml
Pending
runing
waiting
waiting
cat service.yaml
---
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 describe -f myapps.yaml
root@vm-111:~/k8s# kubectl get -f myapps.yaml
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 15m