Kubernetes Init Container

在很多场景中,应用在启动之前都需要进行如下初始化操作。

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

Kubernetes v1.3 引入了一个 Alpha 版本的新特新 init container(在 Kubernetes v1.5 时被更新为 Beta 版本),用于在启动应用容器(app container)之前启动一个或多个 “初始化” 容器,完成应用容器所需的预置条件。Init container 与应用容器本质上一样的,但它们是仅运行一次就结束的任务,而且必须在成功执行完成之后,系统才会继续执行下一个容器。根据 Pod 的重启策略(RestartPolicy),当 init container 执行失败,在设置了 RestartPolicy=Never 时,Pod 将会启动失败;而设置 RestartPolicy=Always 时,Pod 将会被启动自动重启。

v1.8 版本之后,Init Container 特性完全成熟,其定义被放入了 Pod 的 spec.initContainers。

下面以 Nginx 应用为例,在启动 Nginx 之前,通过初始化容器 busybox 为 Nginx 创建一个 index.html 主页文件。这里为 init container 和 Nginx 设置了一个共享的 volume,以提供 Nginx 访问 init container 设置的 index.html。

nginx-init-containers.yaml

apiVersion: v1

kind: Pod

metadata:

  name: nginx

  annotations:

spec:

  initContainers:

  - name: install

    image: busybox

    command:

    - wget

    "-O"

    "/work-dir/index.html"

    - http://kubernetes.io

    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: {}

创建这个 Pod:

$ kubectl apply -f nginx-init-containers.yaml

在运行 init container 的过程中,查看 Pod 的状态,可见 init 过程还未完成:

$ kubectl get po nginx

NAME      READY     STATUS     RESTARTS   AGE

nginx     0/1       Init:0/1   0          23s

# or

$ kubectl get po

NAME      READY     STATUS            RESTARTS   AGE

nginx     0/1       PodInitializing   0          1m

在 init container 成功执行完成之后,系统继续期待 Nginx 容器,再次查看 Pod 的状态:

$  kubectl get po nginx

NAME      READY     STATUS    RESTARTS   AGE

nginx     1/1       Running   0          1m

查看 Pod 的时间,可以看到系统首先创建并运行 init container 容器(名为 install),成功之后继续创建运行 Nginx 容器:

$ kubectl describe po nginx

执行过程 展开源码

启动完成之后,进入 Nginx 容器,可以看到挂载的目录下已经有了 index.html 文件为 init container 所生产,其内容为:

$ kubectl exec -it nginx cat /usr/share/nginx/html/index.html

执行结果 展开源码

init container 与应用容器的区别如下:

(1)init container 的运行方式与应用容器不同,它们必须先于应用容器执行完成,当设置了多个 init container 时,将按顺序逐个运行,并且只有前一个 init container 运行成功之后才能运行后一个 init container。当所有 init container 都成功运行后,Kubernetes 才会初始化 Pod 的各种信息,并开始创建和运行应用容器。

(2)在 init container 的定义中也可以设置资源限制、volume 的使用和安全策略,等等。但资源限制的设置与应用容器略有不同。

  • 如果多个 init container 都定义了资源请求/资源限制,则取最大的值作为所有 init container 的资源请求值/资源限制值。
  • Pod 的有效 (efective) 资源请求值/资源限制值取以下二者中的较大值。
    a)所有应用容器的资源请求值/资源限制值之和。
    b)init container 的有效资源请求值/资源限制值。
  • 调度算法将基于 Pod 的有效资源请求值/资源限制值进行计算,也就是说 init container 可以为初始化操作预留系统资源,及时后续应用容器无须使用这些资源。
  • Pod 的有效 QoS 等级适用于 init container 和应用容器。
  • 资源配额和限制将根据 Pod 的有效资源请求/限制,与调度机制一致。
  • init container 不能设置 readinessProbe 探针,因为必须在它们成功运行后才能继续运行 Pod 中定义的普通容器。

在 Pod 重新启动(Restart)时,init container 将会重新运行,场景的 Pod 重启场景如下:

  • init container 的镜像被更新时,init container 将会重新运行,导致 Pod 重启。仅更新应用容器的进行只会应用容器被重启。
  • Pod 的 infrastructure 容器(pause)更新时,Pod 将会重启。
  • 若 Pod 中的所有应用容器都停止了,并且 RestartPolicy=Always,则 Pod 将会重启。

Kubernetes Init Container相关推荐

  1. ABAP和Go语言的初始化操作, Kubernetes的Init Container

    ABAP Go 作用同上: Kubernetes Init Container在所有容器运行之前执行(run-to-completion),常用来初始化配置. YMAL文件里的具体用法: 要获取更多J ...

  2. k8s 查看mysql 日志_k8s 使用 Init Container 确保依赖的服务已经启动

    k8s 使用 Init Container 确保依赖的服务已经启动 Intro 最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目 ...

  3. k8s 使用 Init Container 确保依赖的服务已经启动

    k8s 使用 Init Container 确保依赖的服务已经启动 Intro 最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目 ...

  4. init container

    文章目录 应用场景 介绍 示例 init container 与普通应用容器区别 init container 中的资源请求/限制 应用场景 等待其他关联组件正确运行 基于环境变量或配置模板生产配置文 ...

  5. CoreOS 和 Kubernetes 1.5 自主运行 Kubernetes、Container Linux

    CoreOS 的成立初衷是网络安全保护.显然,这是一个比较大的目标,但是毫无疑问对于隐私策略.商务和政府来说是十分必要的.而且这个目标也是可以完成的. 为了达到这个目标,我们在 Tectonic 大会 ...

  6. 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代

    Linkerd 提供了许多功能,如:自动 mTLS.自动代理注入.分布式追踪.故障注入.高可用性.HTTP/2 和 gRPC 代理.负载均衡.多集群通信.重试和超时.遥测和监控.流量拆分(金丝雀.蓝/ ...

  7. 16个概念带你入门 Kubernetes

    Kubernetes是Google开源的容器集群管理系统,是Google多年⼤规模容器管理技术Borg的开源版本,主要功能包括: 基于容器的应用部署.维护和滚动升级 负载均衡和服务发现 跨机器和跨地区 ...

  8. [KubeCon+CloudNativeCon China 2018] 在Kubernetes上运行区块链服务(BaaS)

    笔者注:本文是在2018年11月15日由Linux基金会CNCF主办的KubeCon & CloudNativeCon China 2018大会的"Running Blockchai ...

  9. 阿里云Kubernetes实战2–搭建基础服务

    前言: 在系列的第一篇文章中,我已经介绍过如何在阿里云基于kubeasz搭建K8S集群,通过在K8S上部署gitlab并暴露至集群外来演示服务部署与发现的流程.文章写于4月,忙碌了小半年后,我才有时间 ...

最新文章

  1. 爱送礼成中国好前任,谢谢你让我认识了快递员
  2. 局域网共享的解决方法
  3. ai怎么画循环曲线,怎么用 Adobe Illustrator 画出曲率连续的曲线?
  4. Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略
  5. ANDROID L——Material Design综合应用(Demo)
  6. Flutter StreamBuilder 实现局部刷新 Widget
  7. leetcodepython_LeetCode 答案(python)1-17
  8. Subsequence Count (线段树)
  9. ora创建物化视图 11g版本
  10. 富文本Ueditor
  11. unity如何重新生成解决方案_揭秘Sherman:使用Unity制作影视级光照效果
  12. 如何有效降低网站跳出率
  13. php程序员应具备的7种能力
  14. 程序员的“九阳神功”——设计模式
  15. 输入学生的学号及语文、数学、英语成绩, 输出学生各科成绩及率均成绩信息
  16. SQL 里ESCAPE的用法
  17. 2022年美化UI二开某技术导航天下PHP源码
  18. 语法分析:自上而下分析(递归下降分析法+预测分析法)
  19. 如何读关于设计模式的那几本书
  20. c4d打开没反应_(图文+视频)C4D野教程:来制作一个类似蹦床的布料动画

热门文章

  1. C++ + MFC 写一个程序参数修改器(五、界面交互)
  2. 选择工作,还是生活?
  3. 计算机视觉的图像标注与视觉任务
  4. c语言程序设计实验13文件,C语言程序设计实验指导书
  5. 金融行业如何借助私域流量数字化转型
  6. 【SICP练习】146 练习4.2
  7. 机器学习算法岗面经 | 优化方法总结对比:SGD、Momentum、AdaGrad、RMSProp、Adam
  8. 起薪50w,BATMD抢着要,Python才是程序员最该学习的技能
  9. 生成有箭头的流向Line.shp 并通过ArcMap绘制带箭头的图,根据D8算法,输入Flow Direction
  10. php如何做服务器,如何用php实现一个web服务器