Kubernetes 设计解读 – Replication Controller

By | 9月 13, 2020

Replication Controller 是 Kubernetes 为了解决 “如何构造完全同质的 Pod 副本” 问题而引入的资源对象。

Replication Controller 决定了一个 Pod 有多少同时运行的副本,并保证这些副本的期望状态与当前状态一致。在设计上依然体现出了“旁路控制”的思想,为每个 Pod “外挂” 了一个控制器进程,从而避免了该组件成为性能瓶颈,即使这个控制器进程失效,容器依然可以正常运行。

在上述过程中, Pod 的状态可以说是 Replication Controller 进行上述控制的唯一依据。

Pod 的状态转换

状态值及含义:

  • PENDING:Pod 的创建请求已经被系统接受,但 Pod 内还有一个或多个容器未启动。这个时间可能包括:下载 Docker 镜像的网络传输时间和 Pod 的调度时间等
  • RUNNING:Pod 已经被绑定到工作节点上而且 Pod 内所有容器均已被创建。最重要的是至少有一个容器还处于运行状态,正在启动或者重启的过程中
  • SUCCEEDED:Pod 内所有容器均成功正常退出,并且不会发生重启
  • FAILED:Pod 内所有容器均已退出且至少有一个容器因为发生错误而退出(退出码不为 0)
  • UNKNOWN:因为某些未知的原因,主机上的 kubelet 目前无法获得 Pod 的状态

描述文件

一个 Replication Controller 的资源控制文件主要由 3 个方面组成:

  • 一个用于创建 Pod 的 Pod 模板(Pod Template)
  • 一个期望副本数
  • 一个用于选择被控制的 Pod 集合的 label selector

工作描述

对于当前的 Replication Controller 来说,能够识别的 Pod 重启策略只有 Always 一种,这是因为它的设计目标是保证本身状态为 Running 且容器一切正常的 Pod 数量永远跟预设的数目一致。

推荐使用 Replication Controller,只负责选择指定的 Pod 然后保证这个 Pod 的数量和状态正确,而调整这些已经在运行的 Pod 的 CPU MEM 参数应该直接更新 Pod 本身而不是更新 Replication Controller。这依然是旁路控制和解耦的思想。

Replication Controller 只能与容器策略为 Always 的 Pod 进行协作。

可以通过修改 Pod 的 labels 将一个 Pod 从 Replication Controller 的控制集中移除,比如一个典型的场景是:可以将出现了故障的 Pod 从工作集群中移除,然后针对这个 Pod 进行 Debug、数据恢复等操作。与此同时,Replication Controller 会自动重启一个新的 Pod 来替换被移除的那个 Pod。

需要注意的是,删除一个 Replication Controller 不会影响它已经创建的 Pod,如果想删除一个 Replication Controller 控制的 Pod,需要将该 Replication Controller 的副本数 (replicas) 字段置为 0,这样所有的 Pod 都会被自动删除。

在使用时,用户需要保证任意一个 Pod 只对应了一个 Replication Controller,否则可能会产生冲突。

核心职责

  • 维护它所控制的 Pod 的数量,如果需要调整 Pod 的数量,则通过修改它的副本数(replicas)字段来实现
  • 在 Pod 模板中定义 Replication Controller 所控制的 Pod 的 labels,使用 replica selector 匹配 Pod 集,实现对 Pod 的管理

典型使用场景

  • 重调度。保障指定数目的 Pod 正常运行,只要任何 Pod 运行终止,Kubernetes 就会进行相应 Pod 的重调度
  • 弹性伸缩。只要 replicas 字段被更改,Replication Controller 就会实现 Pod 数量的弹性伸缩
  • 滚动更新(灰度发布)。Replication Controller 被设计成通过逐个替换 Pod 的方式来进行副本增删操作,这使得容器的滚动更新会非常简单
    • 假设服务器集群中已经有一个旧的 Replication Controller 负责管理旧版本容器的数量,现在需要启动一个新的 Replication Controller,将其初始副本数设置为 1,这个新的 Replication Controller 负责管理新版本容器的数量
    • 逐步将新的 Replication Controller 的副本数+1,将旧的 Replication Controller 副本数-1,直到旧的 Replication Controller 的副本数减为 0,然后将旧的 Replication Controller 删除,就完成了一个 Replication Controller 对应的所有的 Pod 的更新
  • 应用多版本 release 追踪。通过 replica selector 即可通过 label 对应用的多版本 release 进行管理

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注