K8s 核心組件及運行機制
kubernetes核心組件及運行機制
一個 Kubernetes 集群由一組被稱作節點的機器組成。這些節點上運行 Kubernetes所管理的容器化應用。集群具有至少一個工作節點。
工作節點托管作為應用負載的組件的 Pod 。控制平面管理集群中的工作節點和 Pod 。為集群提供故障轉移和高可用性,這些控制平面一般跨多主機運行,集群跨多個節點運行。
k8s運行機制
API server
API server 的核心功能是提供k8s各類資源對象(如Pod、RC、Service)的增刪改查及Watch等HTTP REST接口,成為集群內各個功能模塊之間數據交互和通信的中心樞紐,是整個集群的數據總線和數據中心。 通常還具有以下功能。
- 集群管理的API入口
- 資源配額控制的入口
- 提供了完備的集群安全機制。
通常我們會通過kubectl命令與API server進行交互,提供restful API,所以說也可以通過代碼方式直接調用k8s的API server。
apiserver架構圖
controller-manager
controller-manager 作為集群內部的管理控制中心,負責集群內部的Node、Pod、Endpoint、Namespace、ServiceAccount、ResourceQuota等的管理,意為控制器。
新版本replication controller 被ReplicaSet替代。
controller manager
從邏輯上講,每個控制器都是一個單獨的進程, 但是為了降低復雜性,它們都被編譯到同一個可執行文件,并在一個進程中運行。
每個controller通過API server 提供的接口實時監控著集群里每個資源對象的狀態,當發生各種故障導致系統狀態發生變化,會嘗試著將系統從“現有狀態”修正到“期望狀態”。
以下為一些控制器的作用
- 節點控制器(Node Controller): 負責在節點出現故障時進行通知和響應 。
- 端點控制器(Endpoints Controller): 填充端點(Endpoints)對象(即加入 Service 與 Pod)。
- 服務帳戶和令牌控制器(Service Account & Token Controllers): 為新的命名空間創建默認帳戶和 API 訪問令牌。
scheduler
kube-scheduler意為調度器,在集群承擔了"承上啟下"的重要功能,“承上”指的是它負責接收 Controller -manager創建的新Pod。為其安排一個可以安置的node;“啟下”指的是安置完成之后,目前Node上的kubelet服務進程接管后繼續工作,負責Pod生命周期中的下半生。
具體來說,Kubernetes Scheduler的作用是將待調度的Pod(API新創建的Pod、Controller Manager為補足副本而創建的Pod等)按照特定的調度算法和調度策略綁定(Binding)到集群中某個合適的Node上,并將綁定信息寫入etcd中。在整個調度過程中涉及三個對象,分別是待調度Pod列表、可用Node列表,以及調度算法和策略。簡單地說,就是通過調度算法調度為待調度Pod列表中的每個Pod從Node列表中選擇一個最適合的Node。
scheduler運行機制
kubelet
一個在集群中每個節點(node)上運行的代理。 它保證容器(containers)都 運行在 Pod 中。
kubelet 接收一組通過各類機制提供給它的 PodSpecs,確保這些 PodSpecs 中描述的容器處于運行狀態且健康。
kube-proxy
kube-proxy 是集群中每個節點上運行的網絡代理, 實現 Kubernetes 服務(Service) 概念的一部分。
kube-proxy 維護節點上的網絡規則。這些網絡規則允許從集群內部或外部的網絡會話與 Pod 進行網絡通信。
如果操作系統提供了數據包過濾層并可用的話,kube-proxy 會通過它來實現網絡規則。否則, kube-proxy 僅轉發流量本身
這里介紹一下 RC RSDeployment的區別
- replicationController POD管理控制器 老版本使用
- replicaset 新版本的POD控制器,替代RC 支持集合式的selector:(version in (v1.0, v2.0)或env notin (dev, qa))
- Deployment 聲明式的pod部署方式 支持rolling update,Deployment為Pod和ReplicaSet提供聲明式更新。
你只需要在Deployment中描述你想要的目標狀態是什么,Deployment controller就會幫你將Pod和Replica
Set的實際狀態改變到你的目標狀態。你可以定義一個全新的Deployment,也可以創建一個新的替換舊的Deployment