一、功能定义
一直活跃的组件来确保集群中各个资源的真实状态朝着资源定义信息中期望的状态收敛。**这个工作是由Controller-Manager中各个控制器来实现的。
什么是资源的真实状态?什么是资源定义信息中的期望状态?
- 资源真实状态就是指的在集群中实际运行的,比如Pod。(我们可以通过
kubectl get pod
来查看) - 而期望的状态指的是,资源定义信息中spec中指定的信息。
Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现此故障并执行自动化修复流程,确保集群始终处于预期的工作状态。
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep-v2 ### 遵循域名编写规范
namespace: default
labels:
app: test-01
### 期望状态
spec:
replicas: 5 ### 期望副本你数量
selector: ### 选择器,指定Deployment要控制的所有的Pod的共同标签(即帮助Deployment筛选他要控制哪些Pod)
matchLabels:
pod-name: ppp ### 和模板template里面的Pod的标签必须一样
### 编写Pod
template:
metadata: ### Pod的metadata
labels:
pod-name: ppp
spec:
containers:
- name: nginx-01
image: nginx
以上这个定义的Deployment,他期望可以有5个包含pod-name: ppp标签的Pod副本。
Controller-Manager组合的控制器有:
ReplicaSet、DaemonSet以及Job控制器
Deployment控制器
StatefulSet控制器
Node控制器
Service控制器
Namespace控制器
PersistentVolume控制器
其他控制器
自定义的控制器
一个控制器至少追踪一种类型的 Kubernetes 资源。从每个控制器的名字我们几乎就可以知道创建的每个资源对应的控制器是什么。
资源描述了集群中应该运行什么,他的期望是什么,而控制器就是为资源实现目标的工具,也被称作为控制回路
二、控制器说明
ReplicaSet Controller
ReplicaSet控制器会通过Api-Server的监听机制订阅可能影响他期望的副本集的数量或者符合条件Pod数量变更事件。任何该类型的变化,都会触发控制器重新检查期望的以及实际的副本数量,然后做出相应的操作。
比如当正在运行的Pod数量少于ReplicaSet所期望的副本数量时,ReplicaSet控制器就会创建新的Pod清单,然后发布给Api-Server,再让Schedule调度器以及Kublet来做调度工作并运行Pod。
ReplicaSet保证在所有时间内,都有特定数量的Pod副本在运行。如果数量太多,ReplicaSet会删除几个;如果数量太少,ReplicaSet将创建几个。与直接创建的Pod不同的是,ReplicaSet会替换掉那些被删除或者被终止的Pod。
建议通过Deployment管理ReplicaSet,一般无须直接操作ReplicaSet。
ReplicaSet Controller中的 Pod 模板就像一个模具,模具制作出来的东西一旦离开模具,它们之间就再也没关系了。同样,一旦Pod被创建完毕,无论模板如何变化也不会影响到已经创建的 Pod
Deployment Controller
Deployment是管理应用副本的API对象。管理员只需要在Deployment中描述期望的状态,Deployment就能根据一定的策略将ReplicaSet与Pod更新到管理员预期的状态。Deployment提供了运行Pod的能力,并且为Pod提供滚动升级、伸缩、副本等功能,一般用于运行无状态的应用。
需要说明的是,Deployment并不直接控制Pod,而是通过上面介绍的ReplicaSet实现对Pod的管理。
在创建 Deployment 资源对象之后,Deployment Controller 也默默创建了对应的ReplicaSet,Deployment 的滚动升级是Deployment Controller通过自动创建新的ReplicaSet来支持的。
Replication Controller
核心作用是确保在任何时候集群中一个RC所关联的Pod副本数始终保持预设值。需要注意的一点是:只有当Pod的重启策略是Always的时候(RestartPolicy=Always),副本控制器才会管理该Pod的操作(例如创建、销毁、重启等)。
Replication Controller的职责:
1)确保当前集群中有且仅有N个Pod实例,N是RC中定义的Pod副本数量。
2)通过调整RC中的spec.replicas属性值来实现系统扩容或缩容。
3)通过改变RC中的Pod模板(主要是镜像版本)来实现系统的滚动升级。
与上述三类职责所对应的是Replication Controller的三类典型使用场景:
1)重新调度,当发生节点故障或Pod被意外终止运行时,可以重新调度保证集群中仍然运行指定的副本数。
2)弹性伸缩,通过手动或自动扩容代理修复副本控制器的spec.replicas属性,可以实现弹性伸缩。
3)滚动更新,推荐的方式是创建一个新的只有一个副本的RC,若新的RC副本数量加1,则旧的RC的副本数量减1,直到这个旧的RC的副本数量为零,然后删除该旧的RC。kubectl rolling-update命令就是按该推荐方式所实现的。
Node Controller
kubelet进程在启动时会通过API Server注册自身的节点信息,并定时向API Server汇报状态信息,API Server接收到信息后将信息更新到etcd中。etcd中存储的节点信息包括节点健康状况、节点资源、节点名称、节点地址信息、操作系统版本、Docker版本、kubelet版本等。节点健康状况包含"就绪"(True)、"未就绪"(False)和"未知"(Unknown)三种。
Node Controller通过API Server实时获取Node的相关信息,实现管理和监控集群中的各个Node节点的相关控制功能。
逐个读取节点信息,如果节点状态变成非“就绪”状态,则将节点加入待删除队列,否则将节点从该队列删除。如果节点状态为非"就绪"状态,则删除etcd中的节点信息,并删除和该节点相关的Pod等资源信息。
ResourceQuota Controller
资源配额管理确保指定的资源对象在任何时候都不会超量占用系统物理资源。
目前k8s支持如下三个层次的资源配额管理:
1)容器级别:对CPU和Memory进行限制
2)Pod级别:对一个Pod内所有容器的可用资源进行限制
3)Namespace级别:是Namespace级别(多租户)的限制,包括:
Namespace Controller
如果Namespace被API标记为优雅删除(即设置删除期限,DeletionTimestamp),则将该Namespace状态设置为“Terminating”并保存到etcd中。同时Namespace Controller删除该Namespace下的ServiceAccount、RC、Pod、Secret、PersistentVolume、ListRange、ResourceQuota和Event等资源对象。
当Namespace状态设置为“Terminating”后,由Admission Controller的NamespaceLifecycle插件来阻止为该Namespace创建新的资源。同时,在Namespace Controller删除完该Namespace中的所有资源对象后,Namespace Controller对该Namespace执行finalize操作,删除Namespace的spec.finalizers域中的信息。
Service Controller
Service Controller是属于kubernetes集群与外部的云平台之间的一个接口控制器。Service Controller监听Service变化,如果是一个LoadBalancer类型的Service,则确保外部的云平台上对该Service对应的LoadBalancer实例被相应地创建、删除及更新路由转发表。
Endpoint Controller
Endpoints表示了一个Service对应的所有Pod副本的访问地址,而Endpoints Controller负责生成和维护所有Endpoints对象的控制器。它负责监听Service和对应的Pod副本的变化。
如果监测到Service被删除,则删除和该Service同名的Endpoints对象;
如果监测到新的Service被创建或修改,则根据该Service信息获得相关的Pod列表,然后创建或更新Service对应的Endpoints对象。
如果监测到Pod的事件,则更新它对应的Service的Endpoints对象。
StatefulSet Controller
StatefulSet用来管理一组Pod集合的部署和扩缩容,并为这些Pod提供持久化存储和持久化标识符。与Deployment不同的是,StatefulSet为每个Pod维护了一个固定的ID。这些Pod是基于相同的模板来创建的,但是不能相互替换,无论怎么调度,每个Pod都有一个固定的ID。
DaemonSet Controller
DaemonSet确保全部Node上运行一个Pod的副本。当有Node加入集群时,会自动为它们新增一个Pod;当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。
Job Controller
Job负责批量处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
CronJob Controller
CronJob负责周期性的处理任务,根据Cron表达式定时执行Job。