Kubernetes 的電梯間演講
Kubernetes 是一個 面向應用 的容器叢集部署、管理及編排系統,旨在為終端使用者遮蔽物理/虛擬計算、網路、儲存基礎設施的複雜度,關注以應用為核心、以容器為原語的自動化運營平臺。
Kubernetes 具備完善的叢集管理能力,包括多層次的安全認證和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和線上擴容、可擴充套件的資源自動排程機制、多粒度的資源配額管理能力。 Kubernetes 還提供完善的管理工具,涵蓋開發、部署測試、運維監控等各個環節。
Kubernetes 的核心層級物件
Cluster: 是一個被 k8s 協調的高可用叢集,作為 k8s 叢集的根操作物件,將多臺計算節點(Master/Node)連線成一個工作整體,是計算、儲存和網路資源的集合。
Master:下屬於 Cluster,充當叢集中的中央控制角色,負責管理、協調叢集中的所有活動(e.g. scheduler app、維護 app 狀態機、 彈性擴充套件 apps、釋出 app 更新 etc.)。
Node:下屬於 Cluster,作為叢集中的 Worker,受 Master 指使。是 Containers 及其 runtime 引擎的允許載體。
Pod: 是一個抽象而統一的概念,遮蔽底層異構 Container Runtime 技術實現。k8s 的最小工作單元,是 Containers 的 “Container”。
Container:下屬於 Pod,是真正意義上的、常規的容器。
NOTE:為什麼要引入 Pod 邏輯物件?
可管理性:有些容器天生就是需要緊密聯絡,一起工作的。例如:微服務中的 Side Car 模式,Pod 中的一個 ContainerA 提供業務,另一個 ContainerB 專門負責對 ContainerA 進行收集、監控日誌和流量資訊;又例如:ContainerA 作為 File Puller 定期從外部拉取最新的檔案,將其存放到共享 Volume 中,ContainerB 作為 Web Server 直接從 Volume 讀取檔案,兩個 Containers 緊密合作;Pod 將 Containers 封裝到一個部署單元中,k8s 以 Pod 為最小單位進行排程、擴充套件、資源分配、管理生命週期。
通訊和資源共享:Pod 中的所有 Containers 使用同一個 network namespace,即 Containers 具有相同的 IP 地址和 Port 空間,它們互相之間可以直接用 localhost 進行通訊。同樣的,這些容器也會共享儲存,當 k8s 掛載 Volume 到 Pod,本質上是將 Volume 掛載到 Pod 中的每一個 Container。
簡單的理解, 是不是有點類似與程序和執行緒的關係?
Kubernetes 的元件架構
Kubernetes 是典型的中控分散式架構(Central control distributed architecture),下面分別列舉 Master、Node 的元件。
Master:
etcd:提供高可用性、嚴格資料一致性的非關係型資料庫,具有共享配置、服務發現、分散式等特點。常被用於構建服務發現系統。
API Server:統一且唯一的 Cluster 北向訪問介面,依靠 CA 認證體系提供身份認證、授權、鑑權等訪問控制功能,統稱 3A(Authentication、Authorization、Admission),是 Kubernets Security Mechanism 的門神。
Controller Manager:中央控制管理器,Cluster 的核心管理模組,負責整個 Cluster 的 “運”(e.g. 故障檢測、彈性擴充套件、滾動更新,etc.)
Scheduler:資源排程器,按照預設的策略將 Pod 排程到目的(最佳)Node 上啟動。
Node:
kubelet:維護 Container 的生命週期,同時也負責儲存(CSI)和網路(CNI)的管理。
kube-proxy:為 Service 提供 Cluster 內部的服務發現和負載均衡功能。
Container runtime:負責映象管理以及 Pod 和 Container 的執行(CRI)。
Kubernetes 的元件通訊協議/介面
Kubernetes 的分層架構
Kubernetes 的術語詞典
Controller:Pod 的控制器,k8s 提供了多種控制器來對 Pod 進行管理,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等,以滿足不同的業務需求。
Deployment:負責 Pod 的部署,並維護部署拓撲(e.g. 建立、監控、自修復 Pod),保證 Pod 按照期望的狀態執行。
ReplicaSet:負責 Pod 的多副本管理,使用 Deployment 的同時會自動建立 ReplicaSet,也就是說 Deployment 實際是通過 ReplicaSet 來管理 Pod 多副本的,通常不需要直接使用 ReplicaSet。
DaemonSet:用於每個 Nodes 都執行且只執行一個 Pod 副本的場景。通常用於執行 daemon 服務程序。
StatefuleSet:保證 Pod 的所有副本的名稱在其整個生命週期中是不變的。一般的,當 Pod 因為故障需要刪除並重新啟動時,它的名稱是會發生變化的。StatefuleSet 還可以保證 Pod 的副本按照固定的順序啟動、更新或者刪除。
Service:用於定義外界訪問一組特定 Pod 的方式。是一個北向提供外部訪問方式(e.g. ClusterIP、NodePort、LoadBalancer),南向通過 Label 和 Selectors 來匹配 Pods 的 邏輯物件,還可以為 Pods 提供了負載均衡。
Namespace:k8s 實現多租戶的方式,將一個物理 Cluster 從邏輯上劃分成多個虛擬 Cluster,每個虛擬 Cluster 就是一個 Namespace,不同 Namespace 間的資源完全隔離。
default Namespace:預設的 Namespace,如果建立任意資源時 不特別指定,就會將資源放到這個 namespace 下。
kube-system Namespace:k8s 自己建立的系統資源將放到這個 namespace 下。
最後
回到主題,Kubernets 的架構和整個部署的複雜度相較於 OpenStack 要更低,從這個角度來看好像的確為企業使用者的運維成本省了不少。當然筆者對 k8s 也只是初學,做不得準。但可以肯定的是,k8s 的核心精髓在於 編排 二字,這是由 Container 的基因決定的。將 Container 當作 VM 來使用,那就是一個天大的誤解了。所以每每看見市場上哪些為容器而容器,毫無編排特徵的產品,筆者實在是難免感慨。