Kubernetes 內(nèi)部原理:架構(gòu)
在本文中,我們將深入探討 Kubernetes 架構(gòu),并探討其關(guān)鍵組件。
一個(gè) Kubernetes 集群由兩個(gè)主要組件組成:
- 控制平面節(jié)點(diǎn)
- 工作節(jié)點(diǎn)
控制平面
控制平面是 Kubernetes 集群的“大腦”,它協(xié)調(diào)和編排各種組件,以確保系統(tǒng)的期望狀態(tài)得以實(shí)現(xiàn)和維護(hù)。控制平面進(jìn)一步包括以下組件:
1. Kube-API 服務(wù)器
API 服務(wù)器是控制平面的中央管理點(diǎn),它暴露 Kubernetes API,客戶端可以使用該 API 與集群進(jìn)行交互。因此,當(dāng)我們使用 kubectl 管理集群時(shí),實(shí)際上是通過 HTTP REST API 與 API 服務(wù)器進(jìn)行通信。kube-api 服務(wù)器負(fù)責(zé)以下任務(wù):
- API 管理:公開集群 API 端點(diǎn)并處理所有 API 請(qǐng)求。
- 身份驗(yàn)證(使用客戶端證書、令牌和 HTTP 基本身份驗(yàn)證)和授權(quán)(ABAC 和 RBAC 評(píng)估)。
- 處理 API 對(duì)象(如 pod、service 等)的API 請(qǐng)求和數(shù)據(jù)驗(yàn)證。
- 與 etcd 通信以存儲(chǔ)狀態(tài)和配置。
- API 服務(wù)器協(xié)調(diào)控制平面和工作節(jié)點(diǎn)組件之間的所有進(jìn)程。
2. etcd
etcd 是 Kubernetes 使用的分布式鍵值存儲(chǔ),用于存儲(chǔ)集群的配置數(shù)據(jù)和資源的期望狀態(tài)。Kube-API 服務(wù)器使用 etcd 的觀察功能來跟蹤對(duì)象狀態(tài)的更改。它是控制平面中的唯一有狀態(tài)組件,負(fù)責(zé)以下任務(wù):
- 作為集群的唯一真相來源,確保一致性和數(shù)據(jù)持久性。
- 充當(dāng)后端服務(wù)發(fā)現(xiàn)和數(shù)據(jù)庫(kù)。
- 存儲(chǔ) Kubernetes 對(duì)象(如 pod、secret、daemon set、deployment、config map、stateful set 等)的所有配置、狀態(tài)和元數(shù)據(jù)。
- 在鍵值對(duì)格式的 /registry 目錄鍵下存儲(chǔ)所有對(duì)象。例如,在默認(rèn)命名空間下名為 Nginx 的 pod 的信息可以在 /registry/pods/default/nginx 下找到。
3. Kube-scheduler
Kube-scheduler 負(fù)責(zé)在工作節(jié)點(diǎn)上調(diào)度 pod。當(dāng)我們創(chuàng)建一個(gè) pod 并將其提交到 API 服務(wù)器時(shí),調(diào)度程序會(huì)自動(dòng)獲取 pod,根據(jù)可用資源和調(diào)度規(guī)則評(píng)估節(jié)點(diǎn),并將 pod 分配給適當(dāng)?shù)墓?jié)點(diǎn)。
- 根據(jù)約束和可用資源確定每個(gè) pod 在調(diào)度隊(duì)列中的有效放置節(jié)點(diǎn)。
- 然后,調(diào)度程序?qū)γ總€(gè)有效節(jié)點(diǎn)進(jìn)行排名,并將 pod 綁定到合適的節(jié)點(diǎn)。集群中可以使用多個(gè)不同的調(diào)度程序;kube-scheduler 是參考實(shí)現(xiàn)。
- 當(dāng)我們部署一個(gè) pod 時(shí),我們指定了 pod 的要求,如CPU、內(nèi)存、親和性、污點(diǎn)或容忍性、優(yōu)先級(jí)、持久卷等。
- Kubernetes 允許用戶使用自定義調(diào)度程序配置來開發(fā)自己的自定義調(diào)度程序。
4. Kube Controller 管理器
kube-controller-manager 是一個(gè)關(guān)鍵組件,運(yùn)行著負(fù)責(zé)維護(hù)集群的期望狀態(tài)和管理系統(tǒng)不同方面的各種控制器。
每個(gè)控制器關(guān)注于集群管理的特定領(lǐng)域,自動(dòng)化任務(wù),確保資源的實(shí)際狀態(tài)與期望狀態(tài)相匹配。
以下是重要的內(nèi)置 Kubernetes 控制器列表:
- Node Controller:負(fù)責(zé)監(jiān)控集群中的節(jié)點(diǎn)狀態(tài)。它會(huì)檢測(cè)節(jié)點(diǎn)故障并啟動(dòng)操作以替換失敗的節(jié)點(diǎn)或?qū)?pod 重新調(diào)度到健康的節(jié)點(diǎn)。
- Replication Controller:確保 pod 的指定副本數(shù)始終運(yùn)行。根據(jù)需要?jiǎng)?chuàng)建或終止 pod 以維護(hù)所需的副本計(jì)數(shù)。
- Deployment Controller:擴(kuò)展了 Replication Controller 的功能,允許您以聲明性方式定義和管理應(yīng)用程序部署。它支持滾動(dòng)更新、回滾和擴(kuò)展。
- StatefulSet Controller:通過確保穩(wěn)定和有序的擴(kuò)展和升級(jí),管理有狀態(tài)應(yīng)用程序。它為每個(gè) pod 分配唯一的網(wǎng)絡(luò)標(biāo)識(shí),并在重新調(diào)度時(shí)保持其標(biāo)識(shí)。
- **Daemon
Set Controller**:確保在所有或一部分節(jié)點(diǎn)上運(yùn)行特定 pod 的副本。通常用于任務(wù),如節(jié)點(diǎn)監(jiān)視代理或網(wǎng)絡(luò)組件。
- Job Controller:管理批處理作業(yè),確保特定任務(wù)或作業(yè)的完成次數(shù)達(dá)到了指定的要求。
- CronJob Controller:允許您使用類似于 cron 的語法在指定間隔內(nèi)調(diào)度任務(wù)。它根據(jù)定義的計(jì)劃創(chuàng)建作業(yè)。
- Namespace Controller:確保集群中的每個(gè)命名空間都具有一組相應(yīng)的資源,并強(qiáng)制資源隔離。
- Service Account 和 Token Controller:自動(dòng)為命名空間中的 pod 創(chuàng)建默認(rèn)帳戶和訪問令牌。
- Service Controller:監(jiān)視服務(wù)和端點(diǎn),并根據(jù)創(chuàng)建、刪除或重新調(diào)度 pod 的情況更新它們。
- Endpoint Controller:維護(hù) endpoint 對(duì)象,根據(jù)標(biāo)簽選擇器將服務(wù)與 pod 匹配。
5. 云控制器管理器 (CCM)
當(dāng) Kubernetes 部署在云環(huán)境中時(shí),云控制器管理器充當(dāng) Kubernetes 集群和云平臺(tái) API 之間的橋梁。它管理 Kubernetes 使用的云特定資源的生命周期。
(1)它從主 Kubernetes 控制平面中卸載了云特定的控制循環(huán)和功能,減少了其復(fù)雜性,使其更易于維護(hù)和擴(kuò)展。
(2)它托管各種云特定控制器,負(fù)責(zé)管理特定于云提供商的資源。這些控制器包括:
- Node Controller:管理 Kubernetes 節(jié)點(diǎn)與云實(shí)例之間的交互,處理節(jié)點(diǎn)的生命周期操作,如創(chuàng)建、刪除和調(diào)整大小。
- Route Controller:處理服務(wù)的云特定網(wǎng)絡(luò)配置,例如創(chuàng)建負(fù)載均衡器或管理 IP 地址。
- Volume Controller:與云存儲(chǔ)服務(wù)集成,以云特定方式提供和管理持久卷。
- Service Controller:與云提供商的負(fù)載均衡器服務(wù)互動(dòng),以創(chuàng)建、管理和更新 Kubernetes 服務(wù)的負(fù)載均衡器。
(3)CCM 管理云資源,確保它們與 Kubernetes 資源定義的期望狀態(tài)相匹配。例如,它可能根據(jù)縮放要求創(chuàng)建或釋放云實(shí)例。
(4)它與云提供商的 API 進(jìn)行通信,執(zhí)行操作,例如創(chuàng)建實(shí)例、配置網(wǎng)絡(luò)、管理存儲(chǔ)資源等。
(5)它確保適當(dāng)管理安全設(shè)置和憑據(jù),與云服務(wù)交互時(shí)進(jìn)行管理。
工作節(jié)點(diǎn)
工作節(jié)點(diǎn)負(fù)責(zé)運(yùn)行容器化應(yīng)用程序。它包括以下組件。
- kubelet
- kube-proxy
- 容器運(yùn)行時(shí)
1. Kubelet
Kubelet 是 Kubernetes 控制平面和節(jié)點(diǎn)上運(yùn)行的容器之間的關(guān)鍵橋梁,確保集群的期望狀態(tài)得以實(shí)現(xiàn)和維護(hù)。
它在集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)代理組件,以將節(jié)點(diǎn)的狀態(tài)和資源利用率報(bào)告給 Kubernetes 控制平面。它不以容器形式運(yùn)行,而是由 systemd 管理的守護(hù)程序。
以下是 kubelet 的主要功能和職責(zé):
- 節(jié)點(diǎn)代理:kubelet 充當(dāng)每個(gè)節(jié)點(diǎn)上的代理,將節(jié)點(diǎn)的狀態(tài)和容器的健康狀況報(bào)告給 Kubernetes 控制平面。
- 健康監(jiān)控:kubelet 連續(xù)監(jiān)控 pod 中的容器的健康狀況。如果容器崩潰或變得不健康,kubelet 會(huì)采取適當(dāng)?shù)拇胧缰匦聠?dòng)容器或整個(gè) pod。
- Pod 管理:kubelet 管理節(jié)點(diǎn)上 pod 的狀態(tài)。它確保根據(jù)從 Kubernetes API 服務(wù)器接收的 pod 定義,指定的 pod 正在運(yùn)行且健康。
- Pod 網(wǎng)絡(luò):kubelet 與網(wǎng)絡(luò)插件協(xié)作,為節(jié)點(diǎn)上的 pod 設(shè)置網(wǎng)絡(luò)。它為 pod 分配 IP 地址,并確保容器可以相互通信以及與外部世界通信。
- 卷管理:kubelet 管理 pod 定義中指定的卷,根據(jù)需要附加和分離卷。它確保數(shù)據(jù)持久性并允許容器訪問共享存儲(chǔ)。
- 資源管理:kubelet 強(qiáng)制執(zhí)行 pod 定義中指定的資源約束,確保容器不會(huì)超出分配的 CPU 和內(nèi)存限制。它還處理對(duì) CPU 和內(nèi)存等資源的請(qǐng)求。
- 驅(qū)逐和清理:當(dāng)節(jié)點(diǎn)上的資源變得稀缺時(shí),kubelet 可以根據(jù)預(yù)定義的策略從 pod 中驅(qū)逐 pod,以釋放資源。它還在 pod 終止時(shí)清理任何剩余的資源。
- 節(jié)點(diǎn)注冊(cè):kubelet 向 Kubernetes 控制平面注冊(cè)節(jié)點(diǎn),使控制平面能夠知道可用于調(diào)度 pod 的節(jié)點(diǎn)。
2. Kube 代理
Kube 代理,即 Kubernetes 代理,是運(yùn)行在 Kubernetes 集群中每個(gè)節(jié)點(diǎn)上的網(wǎng)絡(luò)代理。其主要功能是管理 pod 和服務(wù)之間的網(wǎng)絡(luò)通信,為容器化應(yīng)用程序提供可靠和一致的網(wǎng)絡(luò)環(huán)境。它負(fù)責(zé)以下任務(wù):
- 服務(wù)發(fā)現(xiàn):Kube 代理負(fù)責(zé)在集群內(nèi)啟用服務(wù)發(fā)現(xiàn)。它根據(jù)服務(wù)規(guī)范中定義的標(biāo)簽和選擇器,維護(hù)網(wǎng)絡(luò)規(guī)則,將請(qǐng)求從服務(wù)轉(zhuǎn)發(fā)到適當(dāng)?shù)?pod。
- 負(fù)載均衡:Kube 代理為具有多個(gè)副本或?qū)嵗姆?wù)實(shí)施負(fù)載均衡。它將傳入請(qǐng)求分發(fā)給與服務(wù)的選擇條件相匹配的可用 pod。
- 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT):Kube 代理對(duì)出站流量執(zhí)行網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。這確保來自 pod 的流量看起來是從主機(jī)的 IP 地址發(fā)出的,從而允許外部系統(tǒng)正確響應(yīng)。
- ClusterIP 服務(wù):對(duì)于 ClusterIP 服務(wù)(僅在集群內(nèi)部可訪問),Kube 代理設(shè)置 IPTables 規(guī)則,將流量轉(zhuǎn)發(fā)到根據(jù)其標(biāo)簽選擇器匹配的正確 pod。
- NodePort 服務(wù):Kube 代理配置主機(jī)的防火墻,以將傳入流量轉(zhuǎn)發(fā)到 NodePort 服務(wù)的適當(dāng) pod。這允許使用每個(gè)節(jié)點(diǎn)上的靜態(tài)端口外部訪問服務(wù)。
- 高可用性:Kube 代理致力于確保服務(wù)的高可用性。如果 pod 不可用或添加/刪除了,Kube 代理會(huì)自動(dòng)更新網(wǎng)絡(luò)配置以正確路由流量。
- 健康檢查:Kube 代理監(jiān)視與服務(wù)相關(guān)的端點(diǎn)和 pod 的健康狀況。如果 pod 變得不健康,Kube 代理停止轉(zhuǎn)發(fā)流量。
3. 容器運(yùn)行時(shí)
容器運(yùn)行時(shí)環(huán)境負(fù)責(zé)根據(jù) pod 規(guī)范創(chuàng)建、啟動(dòng)、停止和管理容器。
一些常用的 Kubernetes 容器運(yùn)行時(shí)包括 Docker、containerd、CRI-O、rkt(發(fā)音為 "rocket")等。
- 容器管理:容器運(yùn)行時(shí)環(huán)境負(fù)責(zé)根據(jù) pod 定義創(chuàng)建、啟動(dòng)、停止和管理容器。
- 鏡像管理:它根據(jù) pod 定義中指定的鏡像引用從容器倉(cāng)庫(kù)(如 Docker Hub、Google Container Registry 等)拉取容器鏡像。
- 資源隔離和管理:運(yùn)行時(shí)環(huán)境確保容器根據(jù)其 pod 配置中指定的 CPU、內(nèi)存和其他資源擁有適當(dāng)?shù)馁Y源級(jí)別。
- 網(wǎng)絡(luò)和通信:它設(shè)置容器的網(wǎng)絡(luò),確保它們可以相互通信以及與集群內(nèi)外的服務(wù)通信。這可能涉及配置網(wǎng)絡(luò)命名空間、IP 地址和端口映射。
- 容器安全性:運(yùn)行時(shí)環(huán)境通過強(qiáng)制容器之間的隔離,防止它們?cè)L問彼此的文件系統(tǒng)或資源。它還可能實(shí)施其他安全措施,如 AppArmor 或 SELinux。
- 卷和存儲(chǔ)管理:運(yùn)行時(shí)環(huán)境管理附加到容器的卷,確保數(shù)據(jù)持久性并允許容器訪問共享存儲(chǔ)。
- 生命周期管理:它處理容器的完整生命周期,包括啟動(dòng)、停止、重啟和清理容器。
- 健康監(jiān)控和重啟:運(yùn)行時(shí)環(huán)境監(jiān)視容器的健康狀況,并可以自動(dòng)重啟崩潰或變得不健康的容器。
- 與硬件和內(nèi)核的交互:運(yùn)行時(shí)環(huán)境與主機(jī)操作系統(tǒng)的內(nèi)核進(jìn)行交互,管理容器資源使用、網(wǎng)絡(luò)命名空間、進(jìn)程隔離和其他低級(jí)操作。
Kubernetes 的架構(gòu)促進(jìn)了分布式微服務(wù)導(dǎo)向的方法,使開發(fā)人員可以專注于應(yīng)用程序邏輯,而平臺(tái)負(fù)責(zé)部署、擴(kuò)展和負(fù)載均衡。
無論是在本地、云中還是混合環(huán)境中,Kubernetes 的架構(gòu)使組織能夠高效地管理復(fù)雜的容器化工作負(fù)載,同時(shí)秉承模塊化、抽象和自動(dòng)化的原則。