K8S基礎學習-了解kubernetes機理
kubernetes集群分為倆部分:
kubernetes控制平面
工作節點
控制平面的組件:
etcd分布式持久化存儲
API服務器
調度器
控制器管理器
這些組件用來存儲,管理集群狀態。但他們不是運行應用的容器。
工作節點上的組件:
kubelet
kube-proxy
docker
附加組件:提供額外的功能
DNS服務器
儀表板DASHBOARD
INGRESS控制器
性能監控工具 HEAPSTER METRICS
容器網絡接口插件 FLANNEL CALICO
組件間如何通信
組件間只能通過API服務器通信,它們之間不會直接通信。API服務器是和ETCD通信的唯一組件,其他組件不會直接和ETCD通信,而是通過API服務器來修改集群狀態。
API服務器和其他組件的連接基本都是由組件發起的。
如果使用kubectl來連接容器時,API服務器會向kubelet發起連接。
高可用性: etcd和api服務器的多個實例可以同時並行工作,但是,調度器和控制器管理器只能有一個實例起作用,其他實例處於待命模式。
etcd是k8s存儲集群狀態和元數據的唯一的地方。
ETCD集群需要對系統的實際狀態保持一致,使用的是一致性算法(腦裂算法)如果分裂成不互聯的節點組,包含節點多的可以更改狀態,小的不可以。恢復連接後,第二個組會更新成第一個的狀態。
因此,etcd實例數量應該是奇數,偶數分裂更加容易因為數量相同而宕機。
k8s API服務器作為中心組件,其他組件或客戶端都會去調用它,以RESTful的形式提供了可以查詢,修改集群狀態的CRUD(Create,Read,Update,Delete),並將狀態存儲到etcd中。
API服務器除了提供一種一致的方式將對象存儲到etcd,也對這些對象做校驗,這樣客戶端就無法存入非法對象。
通過認證插件認證客戶端,用戶信息可以從客戶端證書或者HTTP標頭獲取。插件抽取客戶端的用戶名,用戶ID和歸屬組。
通過授權插件授權客戶端,確認用戶是否有權限執行操作。
通過準入控制插件驗證資源請求
驗證資源以及持久化存儲
請求通過了所有的準入控制插件後,API服務器會驗證存儲到ETCD的對象,然後返回一個響應給客戶端。
API服務器如何通知客戶端資源變更。
API服務器沒有做其他額外的工作。當你創建一個RS資源時,他不會去創建pod,同時它不會去管理服務的端點。那是控制器管理器的工作。
API服務器甚至沒有告訴這些服務器去做什麽。
調度器:
調度器做的就是通過API服務器更新pod的定義,然後API服務器再去通知kubelet。當目標節點上的kubelet發現該pod被調度到本節點,他就會創建並且運行pod的容器。
控制器:
API服務器只做了存儲資源到ETCD和通知客戶端有變更的工作。調度器只是給POD分配節點。控制器包括
控制器做了許多不同的事情,都通過API服務器監聽資源(部署,服務),不論是創建新對象還是更新,刪除已有對象,都對變更執行相應操作。
控制器執行一個"調和"循環,將實際狀態調整為期望狀態,然後將新的實際狀態寫入資源的status部分。
控制器之間不會直接通信,他們甚至不知道其他控制器的存在。
RC控制器自己不會去運行pod,會創建新的pod清單,發布到API服務器。讓調度器和kubelet來做調度工作並運行pod。
在POD中,有應用容器和基礎容器,
K8S基礎學習-了解kubernetes機理