Pod控制器简述

  自主式pod对象由调度器绑定至目标工作节点后即由相应节点上的kubelet负责监控其容器的存活性,容器主进程崩溃后,kubelet能够自动启动相应的容器。不过,kubelet对非主进程崩溃类的容器错误却无从感知,这依赖于用户为pod资源对象自定义的存活性探测机制,以便kubelet能够探知到此类故障。然而,在pod对象遭到意外删除,或者工作节点自身发生故障时,又该怎么办呢?

  kubelet是kubernetes集群节点代理程序,它在每个工作节点上都运行着一个实例。因而,集群中的某工作节点发生故障时,其kubelet也必将不可用,于是,节点上的pod资源的健康状态将无从得到保证,也无法再有kubelet重启。此种场景中的pod存活性一般要由工作节点之外的pod控制器来保证。其实,遭到意外删除的pod资源的恢复也依赖于其控制器。

  pod控制器由master的kube-controller-manager组件提供,常见的此类控制器有Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job和CronJob等,它们分别以不同的方式管理pod资源对象。

关于Pod控制器

  把API Server类比成一个存储对象的数据库系统,它向客户端提供了API,并负责存储由用户创建的各类资源对象,至于各对象的当前状态如何才能符合用户期望的状态,则需要交由另一类称为控制器的组件来负责完成。kubernetes提供了众多的控制器来管理各种类型的资源。创建完成后,每一个控制器对象都可以通过内部的和解循环,不间断地监控着由其负责的所有资源并确保其处于或不间断地逼近用户定义的目标状态。

  尽管能够由kubelet为其提供自愈能力,但在节点宕机时,自主式pod对象的重建式自愈机制则需要由pod控制器对象负责提供,并且由它来负责实现生命周期中的各类自动管理行为。

1. pod控制器概述

  Master的各个组件中,API Server仅负责将资源存储在etcd中,并将其变动通知给各个相关的客户端程序,如kubelet,kube-scheduler,kube-proxy和kube-controller-manager等,kube-scheduler监控到处于未绑定状态的pod对象出现时遂启动调度器为其挑选适配的工作节点,然而,kubernetes的核心功能之一还在于要确保各种资源对象的当前状态以匹配用户期望的状态,使当前状态不断地向期望状态“和解”来完成容器应用管理,而这些则是kube-controller-manager的任务。kube-controller-manager是一个独立的单体守护进程,然而,它包含了众多功能不同的控制器类型分别用于各类和解任务。

  创建为具体的控制器对象之后,每个控制器均通过API Server提供的接口持续监控相关资源对象的当前状态,并在因故障、更新或其他原因导致系统状态发生变化时,尝试让资源的当前状态向期望状态迁移和逼近。简单来说,每个控制器对象运行一个和解循环负责状态和解,并将目标资源对象的当前状态写入到其status字段中。

  List-watch是kubernetes实现核心机制之一,在资源对象状态发生变动时,由API Server负责写入etcd并通过水平触发机制主动通知给相关客户端程序以确保其不会错过任何一个事件。控制器通过API Server的watch接口实时监控目标资源对象的变动并执行和解操作,但并不会与其他控制器进行任何交互,甚至彼此之间根本就意识不到对方的存在。

  工作负载一类的控制器资源类型包括Replication Controller、ReplicaSet、Deployment、DaemonSet、StatefulSet、Job和CronJob等,它们分别代表了一种类型的pod控制器资源。

2. 控制器与pod对象

  pod控制器资源通过持续性的监控集群中运行着的pod资源对象来确保受其管控的资源严格符合用户期望的状态,例如资源副本的数量要精确符合期望等。通常,一个pod控制器资源至少应该包含三个基本的组成部分。

  1)标签选择器:匹配并关联pod资源对象,并据此完成受其管控的pod资源计数。

  2)期望的副本数:期望在集群中精确运行着的pod资源的对象数量

  3)pod模板:用于新建的pod资源对象的pod模板资源

  控制器就是能够管理pod,监测pod运行状况,当pod发生故障,可以自动恢复pod。也就是说能够代我们去管理pod中间层,并帮助我们确保每一个pod资源始终处于所定义或者所期望的目标状态,一旦pod资源出现故障,那么控制器会尝试重启pod,如果一直重启有问题的话那么它可能会基于某种策略来进行重新布派或者重新编排;如果pod副本数量低于用户所定义的目标数量,它也会自动补全;如果多余,也会自动终止pod资源。

3. pod模板资源

  PodTemplate是kubernetes API的常用资源类型,常用于为控制器指定自动创建pod资源对象时所需的配置信息。因为要内嵌于控制器中使用,所以pod模板的配置信息中不需要apiVersion和kind字段,但除此之外的其他内容与定义自主式pod对象所支持的字段几乎相同,这包含metadata和spec及其内嵌的其他各个字段。pod控制器类资源的spec字段通常都要内嵌replicas,selector和template字段,其中template即为pod模板的定义。

posted @ 2022-09-05 22:14  出水芙蓉·薇薇  阅读(97)  评论(0编辑  收藏  举报