在机器人和自动化技术中,控制回路是一个永不停止的循环,用于调节系统的状态。
    房间里的恒温器就是一个控制回路的例子。设置温度,相当于通知恒温器要达到的目标状态;房间实际的温度是当前状态,恒温器通过开闭设备使得当前状态不断接近目标状态。
    在K8S中,控制器就是监视集群状态的控制回路,它们在需要的时候做出变化或者请求变化,使集群当前状态接近目标状态。
    控制器模式
    一个控制器至少追踪K8S的一种资源,这些资源通过规格属性来描述目标状态;资源的控制器负责使当前状态尽量接近目标状态。控制器可能直接行动,在K8S中,更常见的是通过发送影响状态的消息给API服务器实现资源的状态管理。
    通过API服务器控制
    Job控制器是K8S内置控制器的一种,内置控制器通过跟API服务器通信来管理资源状态。
    Job是一种资源,它运行一个或者多个pod去完成一项任务,然后停止。当Job控制器观察到新的任务后,它会确保在一组节点上的kubelet运行正确数量的pod,去完成工作。Job控制器自己并不运行任何pod和容器,它通过通知API服务器实现。控制平面的其他组件得到消息(有新的pod要调度并运行)后,最终协调完成工作。
    创建新的Job后,Job的目标状态就被定义出来,Job控制器会尽力使当前状态接近目标状态:创建Job需要的pod,从而使得Job逐渐完成。
    控制器能通过配置更新资源对象,比如:一旦一个Job的工作完成,这个Job的控制器就会设置Finished标志,更新Job对象的状态。
    直接控制
    与Job控制器相反,有些控制器需要调用集群外部的资源来达到目标状态。例如,负责确保集群中有足够多的节点的控制器,当节点不够时,就需要调用外部资源来创建新的节点。
    和外部系统交互的控制器从API服务器上获取目标状态,直接与外部系统通信使得当前状态接近目标状态。重要的一点是,控制器做出变化接近目标状态并向API服务器上报最新的当前状态,其他控制器观察到上报的数据并做出相应调整。
    在恒温器的例子中,这种情况类似于房间太冷时,需要另外一个控制器打开防冻加热器。K8S通过扩展功能与IP地址管理工具、存储服务、云服务接口等进行间接通信来调用外部资源。
    目标状态与当前状态
    K8S采用云原生视图,能应对连续的变化。K8S可以随时变化,控制回路会自动修正故障。从这个意义上来说,集群永远也不会达到稳定状态。只要集群的控制器一直运行,并且能做出有效变化,就不用担心集群状态是否稳定。
    设计
    作为设计宗旨,K8S使用了大量的控制器,每一种控制器管理集群某一方面的状态。最常见的是,一种控制器使用一种资源作为它的目标状态,使用它管理的另外一种资源达到目标状态。例如,Job控制器跟踪Job对象(发现新工作)和pod对象(执行Job并监测任务完成),在这个示例中,其他控制器创建Job,而Job控制器创建pod。
    使用简单的控制器而不是一组复杂的互相连接的单一控制器会更有效,K8S设计允许控制器失败。
    多个控制器可能会创建和更新相同类型的对象,K8S确保控制器只关注它们自己的资源对象。例如,集群中可能有Deployment和Jobs,它们都会创建pod。Job控制器不会删除Deployment控制器创建的pod,因为控制器能根据标签信息将pod区分开。
    运行控制器的方法
    K8S有一组内置控制器,它们运行在kube-controller-manager中,这些内置控制器提供重要、核心的行为。
    Deployment控制器和Job控制器都是内置控制器,K8S支持运行弹性的控制平面,任何一个内置控制器失败,控制平面的其他部分会进行接管。
    K8S支持在控制平面之外运行控制器来扩展功能,也支持自定义的控制器。