【Kubernetes】Pod学习(十三)Init Container:初始化容器

此文为学习《Kubernetes权威指南》的相关笔记

学习笔记:

初始化容器Init Container(后称IC)用于在启动应用容器前进行初始化,完成应用容器所需的预置条件。

主要应用场景如:

  • 等待其他关联组件正确运行(如数据库或后台某个服务)
  • 基于环境变量或配置模板生成配置文件
  • 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库中
  • 下载相关依赖包,或者对系统进行一些预配置操作

作为初始化的工具, IC容器仅运行一次就结束,且不能设置readinessProbe探针,多个IC容器将依次执行,系统要求必需在所有IC执行成功后才能继续执行下一个容器。

在IC容器中也可以设置资源限制,但与应用容器存在如下不同:

  • 如果多个IC容器都定义了资源请求/限制,则取最大值作为所有IC容器的资源请求值/限制值
  • Pod的有效资源请求值/限制值则取(应用容器值之和/IC容器最大值)中的较大值
  • Pod的有效资源请求值/限制值是调度算法、真实资源配额和cgroup设置真正使用的值,也就是说,IC容器可以为初始化操作预留系统资源

当Pod被重启时,IC容器将会重新执行,常见的Pod重启场景如下:

  • IC容器被更新时,整个Pod将会重启(应用容器被更新时,只有该应用容器会被重启)
  • Pod的infrustructure容器更新时,Pod将会被重启
  • Pod中所有容器都终止,且RestartPolicy=Always,Pod将会被重启。

阿里云大学云原生公开课对于IC容器作如下介绍:

【Kubernetes】Pod学习(十三)Init Container:初始化容器_第1张图片

在下面的实例中,新建Pod运行一个nginx应用容器

在启动nginx前,通过初始化容器创建一个Nginx启动主页

不难想到的是,大多数初始化操作都需要对应用容器文件进行修改,势必要给IC容器与应用容器设置共享Volume

apiVersion: v1
kind: Pod
metadata:
 name: nginx
 annotations:
spec:
 initContainers:
 - name: install
   image: busybox
   imagePullPolicy: IfNotPresent
   command:     #拉取一个网页到共享的Volume下
   - wget
   - "-O"
   - "/work-dir/index.html"
   - http://kubernetes.io
   volumeMounts:
   - name: workdir
     mountPath: "/work-dir"

 containers:
 - name: nginx
   image: nginx
   ports:
   - containerPort: 80
   volumeMounts:                 #把共享的workdir挂载到nginx容器的默认web页面存储文件夹下
   - name: workdir
     mountPath: /usr/share/nginx/html

 dnsPolicy: Default
 volumes:
 - name: workdir
   emptyDir: {}

 

启动该Pod

# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          87s

查看Pod信息,可以看到配置的IC信息也存在于Pod详情中

# kubectl describe pod nginx
Name:         nginx

......

Init Containers:
  install:
    Container ID:  docker://2f245864a6823fc943eaa03ee2d8935b21bf1874e11c095225a690d3b9ea0d8f
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
    Port:         
    Host Port:    
    Command:
      wget
      -O
      /work-dir/index.html
      http://kubernetes.io

......

使用kubectl describe命令可以看到Pod事件中先创建并运行了IC容器(名为install)

Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled    default-scheduler  Successfully assigned default/nginx to xu.node1
  Normal  Pulled     2m10s      kubelet, xu.node1  Container image "busybox" already present on machine
  Normal  Created    2m10s      kubelet, xu.node1  Created container install
  Normal  Started    2m9s       kubelet, xu.node1  Started container install

  Normal  Pulling    2m7s       kubelet, xu.node1  Pulling image "nginx"
  Normal  Pulled     2m5s       kubelet, xu.node1  Successfully pulled image "nginx"
  Normal  Created    2m5s       kubelet, xu.node1  Created container nginx
  Normal  Started    2m5s       kubelet, xu.node1  Started container nginx

不出意外,在nginx容器的挂载目录中,我们可以找到IC容器为它初始化好的index.html

# kubectl exec -it nginx -c nginx /bin/sh

$ cat /usr/share/nginx/html/index.html

你可能感兴趣的:(kubernetes)