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 的副本按照固定的順序啟動、更新或者刪除。
Job:特殊的任務控制器,用於 App 運行結束就可以立即刪除 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 來使用,那就是一個天大的誤解了。所以每每看見市場上哪些為容器而容器,毫無編排特徵的產品,筆者實在是難免感慨。
閱讀更多 sandag 的文章