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的負載均衡。

相關文章
相關標籤/搜索