D15 kubernetes 初始化容器(initContainers)

	初始化容器(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
posted @ 2024-09-05 17:04  Hello_worlds  阅读(20)  评论(0编辑  收藏  举报