控制器

在机器人和自动化领域,*控制回路*是一个非终止循环,用于调节系统的状态。

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

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

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

控制器模式

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

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

通过 API 服务器进行控制

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

作业是一种 Kubernetes 资源,它运行一个Pod,或者可能是多个 Pod,来执行一项任务,然后停止。

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

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

在你创建一个新的作业后,期望状态是该作业完成。作业控制器使该作业的当前状态更接近你的期望状态:创建 Pod 来完成你希望该作业完成的工作,以便该作业更接近完成。

控制器还会更新配置它们的那些对象。例如:一旦作业的工作完成,作业控制器就会更新该作业对象,将其标记为“已完成”。

(这有点像一些恒温器会关灯来表示你的房间现在已经达到你设定的温度)。

直接控制

与作业相反,一些控制器需要对集群外部的内容进行更改。

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

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

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

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

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

期望状态与当前状态

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

你的集群可能会在任何时候发生变化,因为工作正在进行,控制回路会自动修复故障。这意味着,你的集群可能永远不会达到稳定状态。

只要集群的控制器正在运行并且能够进行有用的更改,整体状态是否稳定就无关紧要。

设计

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

拥有简单的控制器比拥有一组相互关联的、单一的控制回路更有用。控制器可能会失败,因此 Kubernetes 的设计允许这种情况发生。

运行控制器的方式

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

Deployment 控制器和 Job 控制器是作为 Kubernetes 本身的一部分(“内置”控制器)提供的控制器的例子。Kubernetes 允许你运行一个弹性的控制平面,这样,如果任何内置控制器发生故障,控制平面的另一部分将接管工作。

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

下一步

上次修改时间:2023 年 11 月 22 日下午 2:00 PST:在控制器页面上添加指向 sample-controller 代码库的链接 (1b2cb46752)