控制器

在机器人学和自动化领域, 控制回路 是一个持续运行的循环,用于调节系统的状态。

下面是一个控制回路的例子:房间里的恒温器。

当你设定温度时,你就是在告诉恒温器你的 期望状态。实际的室温是 当前状态。恒温器通过开启或关闭设备,使当前状态更接近期望状态。

在 Kubernetes 中,控制器是控制回路,它们监视 集群的状态,然后在需要时进行或请求更改。每个控制器都试图使当前集群状态更接近期望状态。

控制器模式

控制器至少跟踪一种 Kubernetes 资源类型。这些 对象 有一个 spec 字段,表示期望状态。该资源的控制器负责使当前状态接近期望状态。

控制器可能自行执行操作;更常见的是,在 Kubernetes 中,控制器会向 API 服务器 发送具有有用副作用的消息。您将在下面看到这方面的例子。

通过 API 服务器进行控制

Job 控制器是 Kubernetes 内置控制器的一个例子。内置控制器通过与集群 API 服务器交互来管理状态。

Job 是一个 Kubernetes 资源,它运行一个或多个 Pod 来执行任务,然后停止。

(一旦调度,Pod 对象就成为 kubelet 的期望状态的一部分)。

当 Job 控制器看到一个新任务时,它会确保集群中的一组节点上的 kubelet 正在运行正确数量的 Pod 以完成工作。Job 控制器本身不运行任何 Pod 或容器。相反,Job 控制器告诉 API 服务器创建或删除 Pod。控制平面中的其他组件会根据新信息(有新的 Pod 需要调度和运行)采取行动,最终完成工作。

创建新 Job 后,期望状态是该 Job 完成。Job 控制器使该 Job 的当前状态更接近您的期望状态:创建执行该 Job 所需工作的 Pod,从而使该 Job 更接近完成。

控制器还会更新配置它们的 Job。例如:一旦 Job 的工作完成,Job 控制器会更新该 Job 对象以将其标记为 Finished

(这有点像有些恒温器通过关闭指示灯来表明您的房间已达到设定的温度)。

直接控制

与 Job 不同,一些控制器需要对集群外部的事物进行更改。

例如,如果你使用一个控制回路来确保集群中有足够的节点,那么该控制器需要集群外部的东西在需要时设置新的节点。

与外部状态交互的控制器从 API 服务器获取它们的期望状态,然后直接与外部系统通信,使当前状态更接近。

(实际上有一个控制器可以水平扩展集群中的节点。)

这里的重点是控制器进行一些更改以实现您的期望状态,然后将当前状态报告回集群的 API 服务器。其他控制回路可以观察到该报告数据并采取自己的行动。

在恒温器示例中,如果房间非常冷,则另一个控制器也可能会打开防霜加热器。对于 Kubernetes 集群,控制平面通过扩展 Kubernetes 来实现这一点,间接与 IP 地址管理工具、存储服务、云提供商 API 和其他服务协同工作。

期望状态与当前状态

Kubernetes 采用云原生的系统视图,能够处理持续变化。

在工作进行和控制回路自动修复故障时,您的集群可能随时都在变化。这意味着您的集群可能永远无法达到稳定状态。

只要集群的控制器正在运行并能够进行有用的更改,那么整体状态是否稳定并不重要。

设计

作为其设计原则之一,Kubernetes 使用了许多控制器,每个控制器管理集群状态的特定方面。最常见的是,一个特定的控制回路(控制器)使用一种资源作为其期望状态,并管理另一种资源以实现该期望状态。例如,Job 的控制器跟踪 Job 对象(以发现新工作)和 Pod 对象(以运行 Job,然后查看工作何时完成)。在这种情况下,其他组件创建 Job,而 Job 控制器创建 Pod。

拥有简单的控制器而不是一个相互关联的单一、庞大的控制回路集合是很有用的。控制器可能会失败,因此 Kubernetes 的设计允许这种情况发生。

运行控制器的方式

Kubernetes 带有一组内置控制器,它们在 kube-controller-manager 中运行。这些内置控制器提供了重要的核心行为。

Deployment 控制器和 Job 控制器是 Kubernetes 自身(“内置”控制器)的一部分的控制器示例。Kubernetes 允许您运行一个具有弹性的控制平面,这样即使任何内置控制器失败,控制平面的其他部分也会接管工作。

您可以找到在控制平面之外运行的控制器,以扩展 Kubernetes。或者,如果您愿意,可以自己编写一个新的控制器。您可以将自己的控制器作为一组 Pod 运行,或者在 Kubernetes 之外运行。最适合的方式将取决于该特定控制器所做的工作。

下一步

上次修改于太平洋标准时间 2024 年 9 月 1 日凌晨 1:54:修复“overview/components/#...”到“architecture/#...”的断开链接 (#47724) (7e64c2db82)