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

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

学习笔记:node

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

主要应用场景如:web

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

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

在IC容器中也能够设置资源限制,但与应用容器存在以下不一样:docker

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

当Pod被重启时,IC容器将会从新执行,常见的Pod重启场景以下:数据库

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

阿里云大学云原生公开课对于IC容器做以下介绍:api

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

在启动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:          <none>
    Host Port:     <none>
    Command:
      wget
      -O
      /work-dir/index.html
      http://kubernetes.io

......

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

Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  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
<!doctype html><html id=home lang=en><head><meta name=generator content="Hugo 0.59.1"><script async src="https://www.googletagmanager.com/gtag/js?id=

......