來人阿,先上個架構圖
圖片來源 官網
從架構圖上面看的出來,Control Plane Components整個k8s叢集最核心的模組。
大概跟人類的大腦一樣的概念,進行發號施令的機構,像是調度POD阿,重啟POD,或是scale POD等等行為,關於POD,後面會寫篇文章介紹。
它主要是由下面幾個元件組成,因為這部份有點硬....,所以就用重點的方法介紹為主:
kube-apiserver:
提供Kubernetes API,包括認證授權、數據校驗以及集群狀態變更等,供用戶端及其他元件調用;
代理集群中的一些附加元件元件,如 Kubernetes UI、metrics-server、npd 等;
創建 kubernetes 服務,即提供 apiserver 的 Service,kubernetes Service;
資源在不同版本之間的轉換;
kube-apiserver 使用 REST API
,支援http
與https
,因為http安全性低,建議還是以https為主,不管https或是http,api格式都相同。
目前k8s套件或是工具都是使用REST API
跟k8s取得資料,如果有使用 client-go套件跟k8s取資料時就知道,它本身都是打REST API
-- 資料來源kube-apiserver 的设计与实现
-- kube-apiserver細部說明API Server
etcd:
分散式key-value
資料庫,儲存k8s的網路設置和pod的狀態資料
kube-scheduler:
負責調度cluster裡面的pod,根據可用資源,把pod分配到對應的node上面。
kube-scheduler在調度pod時,會依據下面狀態,後面會再說明一下親和力(affinity 和 anti-affinity),在進行特定服務調度到指定node時用到
- 公平調度
- 資源高效利用
- Qos(Quality of Service) (會再說明)
- 親和力(affinity 和 anti-affinity) (會再說明)
- 資料本地化(data locality)
- 內部負載干擾(inter-workload interference)
- deadlines
-- 資料來源kube-scheduler
以下二個因為個人使用上比較無感...所以就單純列出功能說明
kube-controller-manager:
- 節點控制器(Node Controller): 負責在節點出現故障時進行通知和回應
- 任務控制器(Job controller): 監測代表一次性任務的 Job 對象,然後創建 Pods 來運行這些任務直至完成
- 端點控制器(Endpoints Controller): 填充端點(Endpoints)物件(即加入 Service 與 Pod)
- 服務帳戶和令牌控制器(Service Account & Token Controllers): 為新的命名空間創建預設帳戶和 API 訪問令牌
cloud-controller-manager
- 節點控制器(Node Controller): 用於在節點終止回應后檢查雲供應商以確定節點是否已被刪除
- 路由控制器(Route Controller): 用於在底層雲基礎架構中設置路由
- 服務控制器(Service Controller): 用於創建、更新和刪除雲供應商負載均衡器
-- 資料來源Kubernetes 元件
簡單說,可以把node當成是一台主機,pod運行在node上面,k8s會透過Control Plane把pod調度至最適合的node上面,node在k8s是一個可隨時scale的元件,只要有設定auto-scaling的話,會根據資源使用率進來node的縮放,所以當服務loaing過大時,可以隨時加機器上去應付需求,真的超方便,實體主機就無法這樣子搞了。
而Node包含以下元件
- kubelet:基於 PodSpec 來工作的。 每個 PodSpec 是一個描述 Pod 的 YAML 或 JSON 物件。 kubelet 接受通過各種機制(主要是通過apiserver)提供的一組PodSpec,並確保這些PodSpec中描述的容器處於運行狀態且運行狀況良好。 kubelet 不管理不是由 Kubernetes 創建的容器
- kube-proxy:集群中每個節點上運行的網路代理, 實現 Kubernetes 服務(Service) 概念的一部分
- Container Runtime:Kubernetes 支援多個容器運行環境: Docker、 containerd、CRI-O 以及任何實現Kubernetes CRI (容器運行環境介面)。
以GKE來說,GKE NODE VERSOIN 1.19
後就DEFAULT使用containerd 的 Container-Optimized OS(cos_containerd)
,而不是使用DOCKER 的 Container-Optimized OS (cos)
,但是docker image還是可以正常的運作在cos_containerd上面。
-- 資料來源kubelet
-- 資料來源Container Runtime
-- 資料來源kube-proxy