在本文中,將介紹各種 Kubernetes 組件。
什么是 Kubernetes?
Kubernetes 是一個可移植、可擴展的開源平臺,用于管理容器化工作負載和服務,有助于聲明式配置和自動化。
Kubernetes 架構或組件
Kubernetes 集群由一個控制平面和一組 工作機器(稱為節(jié)點)組成。節(jié)點可以是虛擬機或物理服務器。應該有至少一個控制平面節(jié)點(正式稱為主節(jié)點)來管理集群和至少一個工作節(jié)點(或從節(jié)點)。控制平面節(jié)點和工作節(jié)點都有自己的組件。
控制平面節(jié)點的組件:
- Kube API Server
- Kube Scheduler
- etcd
- Kube Controller Manager
- Cloud Controller Manager
1. Kube API Server:
控制平面的關鍵組件是 Kube API Server,它公開了一個 HTTP API,允許最終用戶、集群的各個部分和外部組件相互通信。
Kubernetes API 讓我們可以查詢和操作 Kubernetes 中不同 API 對象的狀態(tài),比如 Pod、服務、復制控制器等。
Kubernetes API 服務器的主要實現(xiàn)是kube-apiserver。kube -apiserver旨在水平擴展,即通過部署更多實例進行擴展。您可以運行多個kube-apiserver實例并平衡這些實例之間的流量。
與 API Server 的交互可以通過三種方式完成:
2. Kube Scheduler
調度程序監(jiān)控新創(chuàng)建的 Pod,并選擇一個工作節(jié)點供他們運行。
3.etcd
etcd 是一個一致且高可用性的鍵值存儲組件,存儲 Kubernetes 的所有集群數(shù)據(jù)備,包括集群狀態(tài)、集群配置等。
我們可以用 Zookeeper 和 Consul 等其他鍵值存儲替換ectd,但是,etcd 是官方支持的 k/v 存儲,并且是 Kubernetes 推薦和生產(chǎn)測試的選擇。
4. Kube Controller Manager
通過 apiserver 監(jiān)視集群的共享狀態(tài)并進行更改以將當前狀態(tài)移回所需狀態(tài)的控制循環(huán)。
Kubernetes 帶有一組內(nèi)置控制器,它們在 kube-controller-manager 下運行,例如Job 控制器和Deployment 控制器。
5.cloud Controller Manager
云控制器管理器讓我們 將集群鏈接到特定云提供商的 API,并將與該云平臺交互的組件與僅與我們的集群交互的組件分開。
cloud-controller-manager 僅運行特定于特定云提供商的控制器。
工作節(jié)點的組件:
節(jié)點組件在每個節(jié)點上運行。它的工作是維護運行中的 pod 并提供 Kubernetes 運行時環(huán)境。
- Kubelet
- Kube Proxy
- Container runtime
- Containers & Pods
1. kubelet
Kubelet 相當于代理,分布在每個節(jié)點,定期從kube-apiserver組件接收新的或修改的Pod規(guī)范,并確保Pod及其容器在期望規(guī)范下運行。同時該組件作為工作節(jié)點的監(jiān)控組件,向kube-apiserver匯報主機的運行狀況。
2. Kube proxy
Kube Proxy 是運行在每個節(jié)點上的網(wǎng)絡代理。它維護節(jié)點上的網(wǎng)絡規(guī)則,這些網(wǎng)絡規(guī)則允許從集群內(nèi)部或外部的網(wǎng)絡會話與我們的 Pod 進行網(wǎng)絡通信。
3.Container runtime
容器運行時,也稱為容器引擎,是一個軟件組件,它的工作是運行容器。具體來說,容器運行時負責驗證和加載容器鏡像,監(jiān)控系統(tǒng)資源,隔離和分配資源,還負責容器生命周期的管理。
為了執(zhí)行所有這些活動,容器運行時使用標準化接口來協(xié)調資源,包括:
- 容器存儲接口 (CSI)管理容器如何訪問存儲設備
- 容器網(wǎng)絡接口 (CNI)說明 容器如何通過網(wǎng)絡進行通信
容器運行時的一些示例是containerd、CRI-O、Docker Engine 和 Mirantis Container Runtime。
4. 容器和 Pod
Pod 是 Kubernetes中最小的單元。Pod 抽象出容器層,因此您可以直接與 Kubernetes 層交互。
Pod 旨在在多個容器中運行一個應用程序。例如,DB Pod、Job Pod、Frontend App Pod 和后端 API Pod。我們可以在同一個 Pod 中運行多個應用程序,但這些容器將緊密耦合。
每個 Pod 都有自己的私有 IP 地址。容器將在不同的端口上運行。容器可以通過 localhost 相互通信。
每個 Pod 都可以附加一個共享存儲卷。Pod 中的所有容器將共享相同的卷。
當 Pod 中最后一個剩余的容器死亡或崩潰時,Pod 也會如此。當創(chuàng)建一個新 Pod 來替換死掉或崩潰的 Pod 時,該 Pod 將分配一個 IP 地址。IP 地址對于 Pod 來說是臨時的,默認情況下它們不會持久存在。
上面的 K8s 架構中還提到了其他可選的 K8s 對象,例如 Deployment、ReplicaSet 等,我將在單獨的文章中解釋。