初始化容器(initContainers)是Pod中一种特殊类型的容器,专用于在主容器启动之前执行一些初始化任务和操作,以满足主容器所需的环境。
初始化容器在整个pod的生命周期内仅运行一次,并且在主容器启动之前完成它们的任务,既初始化容器一旦任务完成,就必须退出。
数据库初始化:在主容器启动之前执行数据库的初始化操作,如创建数据库、执行数据迁移、初始化表结构等
文件准备:在主容器启动之前准备好应用程序使用的文件,如二进制文件、配置文件、证书等
依赖其他服务:如果主容器依赖其他服务,可以在启动主容器之前检查依赖服务准备就绪。如果未准备就绪,则初始化容器不退出,以确保依赖的服务启动后再启动主容器
例如:有一个nginx提供网站服务,其网站程序托管在代码平台上。我们希望在启动容器之前自动将完整程序下载到nginx的网站根目录中,以便提供网站服务。这一需求可以通过配置初始化容器来实现。
[root@k8s-master k8s]# cat pod-init.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: pod-init
name: pod-init
spec:
# 初始化容器
initContainers:
- name: clone
image: bitnami/git
command: ["/bin/sh", "-c", "git clone https://gitee.com/zhenliangli/web-demo /data"]
volumeMounts:
- name: data
mountPath: /data
# 主容器
containers:
- name: web
image: nginx:1.23
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
emptyDir: {}
在上述配置中,initcontainers部分定义了一个初始化容器,该容器使用bitami/git镜像启动。当这个pod被创建时,启动初始化容器并执行git clone https://gitee.com/zhenliangli/web-demo /data命令将网站程序下载到/data目录中。由于/data目录通过卷与主容器中的/usr/share/nginx/html目录是共享的,因此下载的网站程序也能被nginx访问和使用
创建pod资源
[root@k8s-master k8s]# kubectl apply -f pod-init.yaml
pod/pod-init created
查看pod的时候,会发现status列显示为Init:0/1,这表示pod中有一个初始化容器在工作。
[root@k8s-master k8s]# kubectl get pod -A -o wide | grep ini
default pod-init 0/1 Init:0/1 0 21s <none> k8s-node02 <none> <none>
当初始化容器执行完成退出后,会继续启动主容器
[root@k8s-master k8s]# kubectl get pod -A -o wide | grep ini
default pod-init 0/1 PodInitializing 0 35s 10.244.58.239 k8s-node02 <none> <none>
[root@k8s-master k8s]# kubectl get pod -A -o wide | grep ini
default pod-init 1/1 Running 0 37s 10.244.58.239 k8s-node02 <none> <none>
pod启动后,在nginx容器的目录/usr/local/nginx/html中看到网站程序文件
[root@k8s-master k8s]# kubectl exec -it pod-init -c web -- ls /usr/share/nginx/html
Dockerfile README.md css img index.html
- 我们也可以做这样的配置:在启动主容器之前,需要确保某http服务(访问地址为http://192.168.1.1)已启动,配置示例如下
initContainers:
- name: check
image: busybox:1.28
command: ['/bin/sh', '-c', "while true;do [[ $(curl https://192.168.1.1 -o /dev/null -s -w '%{http_code}') -eq 200 ]] && break || sleep 1;done"]
这个初始化容器执行了一个无限循环,每间隔1s向地址http://192.168.1.1发送http请求,并获取响应的http状态码。如果状态码等于200,则表示http服务已经启动,退出循环,初始化容器工作完成,继续启动主容器
这个初始化容器执行了一个授权命令,用于将目录授权给www用户
initContainers:
- command:
- sh
- '-c'
- >-
chown -R www.www /data/logs && chown -R
www.www /data/cache
image: 192.168.1.1/pay/pay-nginx:master_helloworld
imagePullPolicy: IfNotPresent
name: chown
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi