Kubernetes--初始化容器(Init container)

一、Init container

 在一些场景中应用启动之前需要进行初始化操作

  • 等待其它关联组件正确运行(例如数据或某个后台服务)
  • 基于环境变量或配置模板生成配置文件
  • 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库
  • 下载相关依赖包,或者对系统进行一些预配置操作
     Kubernetes 1.5 加入新特性 init container,用于启动应用容器(app container)之前启动一个或多个初始化容器,完整应用所需的预配置条件。init container与应用容器本质上是一样的,但它们是仅允许一次就结束的任务,并且必须在成功执行完成后,系统才能继续执行下一个容器。根据Pod的重启策略(RestartPolicy),当init container 执行失败,而且设置了RestartPolicy=Never时,Pod将会启动失败;而设置ResterPolicy=Always时,Pod将会被系统自动重启。
Kubernetes--初始化容器(Init container)_第1张图片

    在Nginx启动之前,通过初始化容器busybox为Nginx生成一个index.html主页。这里 init container和Nginx设置共享volume。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  annotations:
spec:
  #these containers arm run during pod initialization
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://www.baidu.com
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}
 

登录到Nginx 容器查看index信息:

Kubernetes--初始化容器(Init container)_第2张图片

 

二、Init container与应用容器的区别:

  • init container的运行方式与应用 container不同,他们必须先于应用容器执行完成,当设置多个init container时,将按顺序逐个运行,并且只有前一个init container运行成功后才能运行后一个init container。当所有的init container都成功运行后,Kubernetes才会初始化Pod的各个信息,并开始创建和运行应用容器
  • init container的定义中也可以设置资源限制、Volume的使用和安全策略,等等。但资源限制的设置与应用容器略有不同

      -> 如果多个init container都定义了资源请求/资源限制,则取最大的值作为init container的资源请求值/资源限制值
      -> Pod的有效资源请求/资源限制值取一下二者中的较大值;(a) 所有应用容器的资源请求值/资源限制值之和;(b) init container的有效资源请求值/资源限制值

  •    调度算法将基于Pod的有效资源请求值/资源限制值进行计算,也就是说init container可以为初始化操作预留系统资源,即使后续应用容器无需使用这些资源
  • Pod的有效QoS等级适用于init container和应用容器
  • 资源配额和限制将根据Pod的有效资源请求值/资源限制值计算生效
  • Pod级别的cgroup将基于Pod的有效资源请求/限制,与调度机制一致
  • init container不能将设置readinessProbe探针,因为必须在它成功运行后才能继续运行在Pod中定义的普通容器
  • 在Pod重启启动时,init container将会重新运行,1. init container的镜像被更新时,init container将会重新运行导致Pod重启,仅更新应用容器的镜像只会使得应用容器重启;2. Pod的infrastructure容器更新时,Pod将会重启;3. 若Pod中的所有应用容器都终止了,并且RestartPolicy=Always,Pod会重启

你可能感兴趣的:(Kubernetes,kubernetes,容器,docker)