Kubernetes 设计模式笔记 —— Init Container

Init Container 为初始化相关的任务提供了区别于主应用程序的独立的生命周期,从而实现关注点分离。

初始化在很多编程语言中都备受关注。比如在 Java 中,为了初始化某个需要配置的对象,我们使用 constructor。
Constructor 会保证在对象中是第一个运行的,且只被 runtime 运行一次。此外,还可以使用构造函数验证强制参数之类的先决条件,传入参数或默认值以初始化实例字段。

Init Container 与构造函数是类似的,只不过是在 Pod 级别而不是类级别。
假如 Pod 中有一个或多个容器代表主应用程序,这些容器可能需要一些启动前的先决条件。比如为文件系统设置特殊的权限,设置数据库 schema,应用程序种子数据的安装等。同时,这些初始化逻辑可能需要主容器镜像中不包含的工具和库。
又或者,用户想要延迟应用的启动,直到可以确认某个外部的依赖满足条件。
所有上述需求都可以通过 Kubernetes 提供的 Init Container 实现。

Kubernetes 中的 Init Container 属于 Pod 定义的一部分,可以将容器划分成两组:init containers 和 application containers。
所有的 init container 会以串行的顺序一个接一个地执行,在应用容器开始启动之前,所有 init container 的执行必须成功完成。
而应用容器是可以并行运行的,启动顺序也是任意的。


Init and application containers

通常情况下,init container 应该是小型快速且能成功完成的,除非它是用来延迟 Pod 的启动以等待某个依赖符合要求。
当 init container 失败时,整个 Pod 会重新启动(除非配置了 RestartNever),导致所有 init container 重新执行一遍。因而令它们符合幂等原则可以避免副作用。
一方面,init container 有着和应用容器一样的能力:位于同一个 Pod 中,共享资源限制、存储卷和安全设置。另一方面,它们的健康检查和资源处理在语义上有些许不同。它们不存在 rediness check,因为只有当所有的 init container 成功结束之后应用容器才会继续启动。

在容器调度、自动伸缩、配额管理方面,Init container 会影响 Pod 请求和计算资源的方式。由于所有的 init container 会先串行执行到终止,接着应用容器并行运行。因而高效的 Pod 级别的资源分配取决于以下两组值中较大的那个:

  • 所有 init container 中资源请求或限制值最大的那个
  • 所有应用容器资源请求或限制的总和

上述行为的限制在于,当 init container 的资源需求非常高而应用容器相对很低时,这种配置对于资源的利用就很低效。因为 init container 一般只运行很短的一段时间,其他 Pod 无法使用 init container 运行结束后空闲下来的资源。

Init container 能够实现关注点分离,从而使容器保持 single-purposed。应用容器可以由只关注应用逻辑的开发工程师创建,而部署工程师可以为其添加 init container 并只关注配置和初始化任务。比如下面的例子。

apiVersion: v1
kind: Pod
metadata:
  name: www
  labels:
    app: www
spec:
  initContainers:
  - name: download
    image: axeclbr/git
    command:
    - git
    - clone
    - https://github.com/mdn/beginner-html-site-scripted
    - /var/lib/data
    volumeMounts:
    - mountPath: /var/lib/data
      name: source
  containers:
  - name: run
    image: docker.io/centos/httpd
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /var/www/html
      name: source
  volumes:
  - emptyDir: {}
    name: source

Init container 克隆外部 Git repo 到挂载的路径,该路径通过 emptyDir 挂载卷实现 init 容器和应用容器间的数据共享。

总结

Init container 将 Pod 中的容器分成两组,拥有不同的生命周期、目的甚至作者。
Init 容器分阶段地执行,且只有当前容器成功完成后才继续进行下一阶段,意味着我们可以确保应用初始化的每一个阶段都是有保障的。
应用容器则可以并行运行,没有提供 init 容器那样的保证。我们可以根据目的在 Pod 中合理地组织关注初始化的 init 容器和关注应用本身的应用容器。

参考资料

Kubernetes Patterns

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容