kubernetes之Controller Manager原理分析

Controller Manager做为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务帐号(ServiceAccount)、资源定额(ResourceQuota)等的管理,当某个Node意外宕机时,及时发现并执行自动化修复流程。node

Controller Manager内部包含Replication Controller、Node Controller、ResourceQuota Controller、Namespace Controller、ServiceAccount Controller、Token Controller、Service Controller及Endpoint Controller等多个Controller,每种Controller都负责一种具体的控制流程。负载均衡

1.1 Replication Controlleride

为了区别Controller Manager中的Replication Controller副本控制器和资源对象Replication Controller。将资源对象简写为RC。Replication Controller指副本控制器spa

副本控制器核心做用时确保任什么时候候集群中一个RC所关联的Pod副本数量保持预设值。超出摧毁,反之则建立。只有当pod重启策略为Always时,才会管理该pod的操做。pod被建立后不会消失,惟一的例外时当pod处于succeeded或failed状态时间过长,被系统自动回收。副本控制器会再其余工做节点从新建立,运行pod副本。操作系统

RC中的Pod模板就像一个模具,制做出的东西离开模具,之间不存在关系了。pod被建立后,模板如何变化都不会影响这个pod。pod能够经过修改标签脱离RC的管控。用来从集群中迁移,数据修复等调试。pod被迁移后,RC会建立新的pod替代以前的pod。删除RC不会影响以前建立的pod,若是要删除RC控制的pod,将RC中的副本数设置为0插件

副本控制器的职责以下设计

(1)确保当前集群中由且仅有N个Pod实例,N时RC中定义的Pod副本数量调试

(2)经过调整RC的spec.replicas属性值来实现系统扩容和缩容。server

(3)经过改变RC中的pod模板(主要是镜像版本)来实现系统的滚动升级。对象

1.2 Node Controller

kubelet定时向API Server汇报状态信息,API Server接受到信息后更新到etcd。etcd存储的节点信息包括节点健康状态,节点资源,节点名称,节点地址信息,操做系统版本,Docker版本,kubelet版本。节点健康状态包含就绪True,未就绪False和未知Unknown三种。

(1)启动时若是设置了--clustr-cidr参数,那么为每一个没有设置Spec。PodCIDR的Node节点生成一个CIDR地址,并用该CIDR地址设置节点的Spec.PodCIDR属性。防止不一样系欸但的CIDR地址发生冲突。

(2)逐个读取节点信息,屡次尝试修改nodeStatusMap中的节点状态信息,将该节点信息和Node Controller的nodeStatusMap中保存的节点信息作比较。若是判断没有收到kubelet发出的节点信息,或者第一次收到,或者节点状态变成非健康。则再nodeStatusMap中保存该节点的状态信息,并用Node Controller所在节点的系统时间做为探测时间和节点状态变化时间。若是节点信息发生改变,保存该节点状态信息。并用Node Controller所在节点的系统时间未做探测时间和节点状态变化时间。若是收到节点信息,但状态没改变,保存系欸但状态信息,用Node Controller所在节点系统时间做为探测时间,用上次节点信息的节点状态变化时间做为该节点的状态变化时间。若是一段时间没有收到节点状态信息,设置节点状态为未知,而且经过API Server保存节点状态。

(3)逐个读取节点信息,若是节点状态为非就绪状态,将节点加入待删除队列,不然将节点从该队列中删除。若是节点状态为非就绪状态,且系统指定了Cloud Provider,则调用Cloud Provider查看节点,发现节点故障,删除etcd中节点信息,并删除该节点相关的pod等资源信息。

1.3 ResourceQuota Controller

资源配额管理确保了指定的资源对象再任什么时候候不会超量占用系统物理资源,避免因为某些业务进程的设计或实现的缺陷致使整个系统运行紊乱甚至意外宕机,对集群的平稳运行和稳定性有很是重要的做用。

kubernetes支持以下三个层次的资源配额管理。

(1)容器级别,对CPU和Memory进行限制

(2)Pod级别,对一个pod内全部容器的可用资源进行限制。

(3)Namespace级别,为Namespace多租户级别的资源限制,包括pod数量,RC数量,Service数量,ResourceQuota数量,Secert数量,可持有的PV数量。

kubernetes配额管理经过Admission Control准入控制来控制的,Admission Control当前提供了两种方式的配额约束,分别是LimitRanger与ResourceQuota。其中LimitRanger做用域Pod和Container上,ResourceQuota做用于Namespace上,限制Namespace里的各种资源的使用总额。

1.4 Namespace Controller

用户经过Apiserver 能够建立新的Namespace并保存在etcd中,Namespace Controller按期经过API Server读取这些Namespace信息。若是Namespace被API表示为优雅删除,则将该NameSpace状态设hi为Terminating并保存到etcd中,Namespace Controller删除该Namespace下全部的资源对象。

当Namespace状态被设置成Terminating后,Admission Controller的NamespaceLifecycle插件来阻止为该Namespace建立新的资源。Namespace Controller删除完该Namespace全部资源对象后,对该Namespace执行finalize操做,删除Namespace的spec.finalizers域中的信息。

若是Namespace设置了删除期限,而且spec.finalizers域值为空,Namespace Controller经过API Server删除该Namespace资源。

1.5 Service Controller与Endpoint Controller

Endpoints表示了一个Service对应的全部Pod副本的访问地址,而endpoints controller就是负责生成和维护全部Endpoints对象的控制器。负责监听Service和对应的pod副本的变化,若是Service被删除,删除和该Service同名的Endpoints对象。若是新的Service被建立或者修改,根据该Service信息得到相关的pod列表,而后建立或者更新Service对应的Endpoints对象。若是监测到pod的事件,则更新它所对应的Service的Endpoints对象

每一个Node上的kube-proxy进程获取每一个Service的Endpoints,实现Service的负载均衡。

相关文章
相关标签/搜索