了解控制器做了什么以及如何做的

Replication管理器

ReplicationController的操作可以理解为一个无限循环,每次循环,控制器都会查找符合其pod选择器定义的pod的数量,并且将该数值和期望的复制集(replica)数量作比较。

启动ReplicationController资源的控制器叫作Replication管理器。
当运行pod实例太少,ReplicationController会运行额外的实例,但它自己实际上不会去运行pod。它会创建新的pod清单,发布到API服务器,让调度器以及kubelet来做调度工作并运行pod。

Replication管理器通过API服务器操纵pod API对象来完成其它工作。所有控制器就是这样运作的。

ReplicaSet、DaemonSet以及Job控制器

ReplicaSet控制器基本上做了和前面描述的Replication管理器一样的事情。DaemonSet以及Job控制器比较相似,从它们各自资源集中定义的Pod模板创建pod资源。与replication管理器相似,这些控制器不会运行pod,而是将pod定义到发布API服务器,让Kubelet创建容器并运行。

Deployment控制器

Deployment控制器负责使deploymnet的实际状态与对应Deployment API对象的期望状态同步。
每次Deployment对象修改后(如果修改会影响到部署的pod),Deployment控制器都会滚动升级到新的版本。通过创建一个ReplicaSet,直到旧pod被新的代替。并不会直接创建任何pod。

StatefulSet控制器

StatefulSet控制器,类似于ReplicaSet控制器以及其他相关控制器,根据StatefulSet资源定义创建、管理、删除pod。其他的控制器只管理pod,而StatefulSet控制器会初始化并管理每个pod实例的持久卷声明字段。

Node控制器

Node控制器管理Node资源,描述了集群工作节点。其中,Node控制器使节点对象列表与集群中实际运行的机器列表保持同步。同时监控每个节点的健康状态,删除不可达节点的pod。
Node控制器不是唯一对Node对象做更改的组件。Kubelet也可以做更改,那么显然可以由用户通过REST API调用做更改。

Service控制器

Service控制器就是用来在LoadBalancer类型服务被创建或删除时,从基础设施服务请求、释放负载均衡器的。

Endpoint控制器

Service不会直接连接到pod,而是包含一个端点列表(IP和端口),列表要么是手动,要么是根据Service定义的pod选择器自动创建、更新。Endpoint控制器作为活动的组件,定期根据匹配标签选择器的pod的IP、端口更新端口列表。
控制器同时监听了Service和pod。当Service被添加、修改,或者pod被添加、修改或删除时,控制器会选中匹配Service的pod选择器的pod,或将其IP和端口添加到Endpoint资源中。请记住,Endpoint对象是个独立的对象,所以当需要的时候控制器会创建它。同样地,当删除Service时,Endpoint对象也会被删除。

Namespace控制器

当删除一个Namespace资源时,该命名空间里的所有资源都会被删除。这就是Namespace控制器做的事情。当收到删除Namespace对象的通知时,控制器通过API服务器删除所有归属该命名空间的资源。

PersistentVolume控制器

一旦用户创建了一个持久卷声明,kubernetes必须找到一个合适的持久卷同时将其和声明绑定。这些由持久卷控制器实现。
对于一个持久卷声明,控制器为声明查找最佳匹配项,通过选择匹配声明中的访问模式,并且声明的容量大于需求的容量的最小持久卷。实现方法是保存一份有序的持久卷列表,对于每种访问模式按照容量升序排列,返回列表的第一个卷,
当用户删除持久卷声明时,会解绑卷,然后根据卷的回收策略进行回收(原样保留、删除或清空)。

所有这些控制器都是通过API服务器来操作API对象的。它们不会直接和Kubelet通信或者发送任何类型的指令。实际上,它们不知道Kubelet的存在。控制器更新API服务器的一个资源后,kubelet和Kubernetes Service Proxy(也不知道控制器的存在)会做它们的工作,例如启动pod容器、加载网络存储,或者就服务而言,创建跨pod的负载均衡。