1. 程式人生 > 其它 >kube-controller-manager詳解

kube-controller-manager詳解

Controller Manager

Controller Manager 由 kube-controller-manager 和 cloud-controller-manager 組成,是 Kubernetes 的大腦,它通過 apiserver 監控整個叢集的狀態,並確保叢集處於預期的工作狀態。

kube-controller-manager 由一系列的控制器組成

  • Replication Controller
  • Node Controller
  • CronJob Controller
  • Daemon Controller
  • Deployment Controller
  • Endpoint Controller
  • Garbage Collector
  • Namespace Controller
  • Job Controller
  • Pod AutoScaler
  • RelicaSet
  • Service Controller
  • ServiceAccount Controller
  • StatefulSet Controller
  • Volume Controller
  • Resource quota Controller

cloud-controller-manager 在 Kubernetes 啟用 Cloud Provider 的時候才需要,用來配合雲服務提供商的控制,也包括一系列的控制器,如

  • Node Controller
  • Route Controller
  • Service Controller

從 v1.6 開始,cloud provider 已經經歷了幾次重大重構,以便在不修改 Kubernetes 核心程式碼的同時構建自定義的雲服務商支援。參考這裡檢視如何為雲提供商構建新的 Cloud Provider。

Metrics

Controller manager metrics 提供了控制器內部邏輯的效能度量,如 Go 語言執行時度量、etcd 請求延時、雲服務商 API 請求延時、雲端儲存請求延時等。Controller manager metrics 預設監聽在kube-controller-manager的 10252 埠,提供 Prometheus 格式的效能度量資料,可以通過http://localhost:10252/metrics

來訪問。

 1 $ curl http://localhost:10252/metrics
 2 ...
 3 # HELP etcd_request_cache_add_latencies_summary Latency in microseconds of adding an object to etcd cache
 4 # TYPE etcd_request_cache_add_latencies_summary summary
 5 etcd_request_cache_add_latencies_summary{quantile="0.5"}NaN
 6 etcd_request_cache_add_latencies_summary{quantile="0.9"}NaN
 7 etcd_request_cache_add_latencies_summary{quantile="0.99"}NaN
 8 etcd_request_cache_add_latencies_summary_sum 0
 9 etcd_request_cache_add_latencies_summary_count 0
10 # HELP etcd_request_cache_get_latencies_summary Latency in microseconds of getting an object from etcd cache
11 # TYPE etcd_request_cache_get_latencies_summary summary
12 etcd_request_cache_get_latencies_summary{quantile="0.5"}NaN
13 etcd_request_cache_get_latencies_summary{quantile="0.9"}NaN
14 etcd_request_cache_get_latencies_summary{quantile="0.99"}NaN
15 etcd_request_cache_get_latencies_summary_sum 0
16 etcd_request_cache_get_latencies_summary_count 0
17 ...

kube-controller-manager 啟動示例

 1 kube-controller-manager \
 2 --enable-dynamic-provisioning=true \
 3 --feature-gates=AllAlpha=true \
 4 --horizontal-pod-autoscaler-sync-period=10s \
 5 --horizontal-pod-autoscaler-use-rest-clients=true \
 6 --node-monitor-grace-period=10s \
 7 --address=127.0.0.1 \
 8 --leader-elect=true \
 9 --kubeconfig=/etc/kubernetes/controller-manager.conf \
10 --cluster-signing-key-file=/etc/kubernetes/pki/ca.key \
11 --use-service-account-credentials=true \
12 --controllers=*,bootstrapsigner,tokencleaner \
13 --root-ca-file=/etc/kubernetes/pki/ca.crt \
14 --service-account-private-key-file=/etc/kubernetes/pki/sa.key \
15 --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt \
16 --allocate-node-cidrs=true \
17 --cluster-cidr=10.244.0.0/16 \
18 --node-cidr-mask-size=24

控制器

kube-controller-manager

kube-controller-manager 由一系列的控制器組成,這些控制器可以劃分為三組

  1. 必須啟動的控制器
    • EndpointController
    • ReplicationController
    • PodGCController
    • ResourceQuotaController
    • NamespaceController
    • ServiceAccountController
    • GarbageCollectorController
    • DaemonSetController
    • JobController
    • DeploymentController
    • ReplicaSetController
    • HPAController
    • DisruptionController
    • StatefulSetController
    • CronJobController
    • CSRSigningController
    • CSRApprovingController
    • TTLController
  2. 預設啟動的可選控制器,可通過選項設定是否開啟
    • TokenController
    • NodeController
    • ServiceController
    • RouteController
    • PVBinderController
    • AttachDetachController
  3. 預設禁止的可選控制器,可通過選項設定是否開啟
    • BootstrapSignerController

      TokenCleanerController·    

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 的使用方法可以參考這裡

Node Eviction

Node 控制器在節點異常後,會按照預設的速率(--node-eviction-rate=0.1,即每10秒一個節點的速率)進行 Node 的驅逐。Node 控制器按照 Zone 將節點劃分為不同的組,再跟進 Zone 的狀態進行速率調整:

  • Normal:所有節點都 Ready,預設速率驅逐。
  • PartialDisruption:即超過33% 的節點 NotReady 的狀態。當異常節點比例大於--unhealthy-zone-threshold=0.55時開始減慢速率:
    • 小叢集(即節點數量小於--large-cluster-size-threshold=50):停止驅逐
    • 大叢集,減慢速率為--secondary-node-eviction-rate=0.01
  • FullDisruption:所有節點都 NotReady,返回使用預設速率驅逐。但當所有 Zone 都處在 FullDisruption 時,停止驅逐。