Controller Manager工作原理
kube-controller-manager
kube-controller-manager由一系列的控制器组成,这些控制器可以划分为三组
- 必须启动的控制器
- EndpointController
- ReplicationController:
- PodGCController
- ResourceQuotaController
- NamespaceController
- ServiceAccountController
- GarbageCollectorController
- DaemonSetController
- JobController
- DeploymentController
- ReplicaSetController
- HPAController
- DisruptionController
- StatefulSetController
- CronJobController
- CSRSigningController
- CSRApprovingController
- TTLController
- 默认启动的可选控制器,可通过选项设置是否开启
- TokenController
- NodeController
- ServiceController
- RouteController
- PVBinderController
- AttachDetachController
- 默认禁止的可选控制器,可通过选项设置是否开启
- BootstrapSignerController
- TokenCleanerController
cloud-controller-manager
cloud-controller-manager在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供商的控制,也包括一系列的控制器
- CloudNodeController
- RouteController
- ServiceController
如何保证高可用
在启动时设置--leader-elect=true
后,controller manager会使用多节点选主的方式选择主节点。只有主节点才会调用StartControllers()
启动所有控制器,而其他从节点则仅执行选主算法。
多节点选主的实现方法见leaderelection.go。它实现了两种资源锁(Endpoint或ConfigMap,kube-controller-manager和cloud-controller-manager都使用Endpoint锁),通过更新资源的Annotation(control-plane.alpha.kubernetes.io/leader
),来确定主从关系。
如何保证高性能
从Kubernetes 1.7开始,所有需要监控资源变化情况的调用均推荐使用Informer。Informer提供了基于事件通知的只读缓存机制,可以注册资源变化的回调函数,并可以极大减少API的调用。
Informer的使用方法可以参考这里。