Kubernetes 的運作方式

已完成

成功設定的 Kubernetes 安裝取決於對 Kubernetes 系統架構的深入了解。 在這裡,您會了解構成 Kubernetes 安裝的所有元件。

什麼是電腦叢集?

叢集是一組您設定來一起運作並視為單一系統的電腦。 設定於叢集中的電腦會處理相同類型的工作。 例如,它們全都會裝載網站、API 或執行計算密集型工作。

叢集會使用負責排程和控制這些工作的集中式軟體。 在叢集中執行工作的電腦稱為「節點」,而執行排程軟體的電腦稱為控制「平面」

這是計算叢集的圖表,顯示如何透過控制平面將工作散發至三個節點,以及節點之間的互動。

Kubernetes 架構

回想一下先前提到的內容,協調器是部署及管理應用程式的系統。 您也了解到叢集是一組一起運作且可視為單一系統的電腦。 您可使用 Kubernetes 作為協調流程和叢集軟體來部署應用程式並回應計算資源需求變更。

Kubernetes 叢集架構的圖表,顯示安裝於控制平面和背景工作角色節點上的元件。

Kubernetes 叢集至少包含一個主要平面及一或多個節點。 控制平面與節點執行個體都可以是實體裝置、虛擬機器,或雲端中的執行個體。 Kubernetes 中的預設主機 OS 是 Linux,預設支援 Linux 型工作負載。

您也可以在叢集節點上使用 Windows Server 2019 或更新版本來執行 Microsoft 工作負載。 例如,假設無人機追蹤應用程式中的資料處理服務撰寫成使用特定 Windows OS API 呼叫的 .NET 4.5 應用程式。 此服務只能在執行 Windows Server OS 的節點上執行。

讓我們更詳細研究控制平面與背景工作角色節點,以及在每個節點上執行的軟體。 了解每個元件的角色及每個元件在叢集中的執行位置,可協助您安裝 Kubernetes。

Kubernetes 控制平面

Kubernetes 叢集中的 Kubernetes 控制平面會執行一組服務,以管理 Kubernetes 中的協調流程功能。

從學習的觀點來看,當探索 Kubernetes 功能時,在測試環境中使用單一控制平面是合理的。 不過,在生產和雲端部署 (例如 Azure Kubernetes Service (AKS)) 中,您會發現慣用設定是具有三到五個複寫控制平面的高可用性部署。

注意

雖然控制平面會執行特定軟體來維護叢集的狀態,但不會排除該控制平面執行其他計算工作負載。 不過,您通常希望將該控制平面排除在執行非關鍵性工作負載和使用者應用程式工作負載之外。

Kubernetes 節點

Kubernetes 叢集中的節點即是您計算工作負載的執行位置。 每個節點都會透過 API 伺服器與控制平面進行通訊,以通知它節點上的狀態變更。

在控制平面上執行的服務

Kubernetes 依賴在控制平面上執行的數個系統管理服務。 這些服務會管理叢集元件通訊、工作負載排程和叢集狀態持續性等層面。

這是 Kubernetes 叢集架構的圖表,其中顯示安裝於控制平面上的元件。

下列服務構成 Kubernetes 叢集的控制平面:

  • API 伺服器
  • 備份存放區
  • 排程器
  • 控制器管理員
  • 雲端控制器管理員

什麼是 API 伺服器?

您可以將 API 伺服器想成 Kubernetes 叢集控制平面的前端。 Kubernetes 中元件之間的所有通訊都是透過此 API 來完成。

例如,身為使用者,您使用名為 kubectl 的命令列應用程式,對 Kubernetes 叢集的 API 伺服器執行命令。 提供此 API 的元件稱為 kube-apiserver,您可以部署此元件的數個執行個體,以支援叢集中的規模調整。

您可使用此 API 公開的 RESTful API 來張貼命令或 YAML 型設定檔。 YAML 是一個人類看得懂的程式設計語言資料序列化標準。 您使用 YAML 檔案來定義 Kubernetes 叢集內所有物件的預期狀態。

例如,假設您想要在叢集中增加應用程式的執行個體數目。 您會使用 YAML 型檔案來定義新狀態,然後將此檔案提交給 API 伺服器。 API 伺服器會驗證設定、將此設定儲存至叢集,並最後實行在應用程式部署中設定的增量。

什麼是備份存放區?

備份存放區是永續性儲存體,Kubernetes 叢集會在其中儲存其完整設定。 Kubernetes 使用稱為 etcd 的高可用性、分散式且可靠的金鑰/值存放區。 這個金鑰/值存放區可儲存叢集內所有物件的目前狀態及其預期狀態。

在生產的 Kubernetes 叢集中,Kubernetes 的官方指引是採用三到五個 etcd 資料庫複寫執行個體來提供高可用性。

注意

etcd 不負責備份資料。 確保您有責任確保已制定有效備份計畫來備份 etcd 資料。

什麼是排程器?

排程器是負責在所有節點上指派工作負載的元件。 排程器會監視叢集是否有新建立的容器,並將其指派給節點。

什麼是控制器管理員?

控制器管理員會透過 API 伺服器來啟動和監視為叢集設定的控制器。

Kubernetes 使用控制器來追蹤叢集中的物件狀態。 每個控制器在監看和回應叢集中的事件時,都是以非終止迴圈的方式執行。 例如,有負責監視節點、容器和端點的控制器。

控制器會與 API 伺服器通訊,以判斷物件的狀態。 如果物件的目前狀態與預期狀態不同,控制器就會採取行動以確保獲得預期狀態。

假設在您的叢集中執行的三個容器,有一個停止回應並失敗。 在此情況下,控制器會判斷是否需要啟動新的容器,以確保應用程式一律可供使用。 如果預期狀態是隨時執行三個容器,則會排程新容器來執行。

什麼是雲端控制器管理員?

當您的叢集在雲端環境中執行時,雲端控制器管理員會與此叢集的底層雲端技術整合。 這些服務可以是負載平衡器、佇列和儲存體等。

在節點上執行的服務

有數種服務會在 Kubernetes 節點上執行來控制工作負載的執行方式。

這是 Kubernetes 叢集架構的圖表,其中顯示安裝於 Kubernetes 節點上的元件。

下列服務會在 Kubernetes 節點上執行:

  • Kubelet
  • Kube-proxy
  • 容器執行階段

什麼是 kubelet?

Kubelet 是在叢集中每個節點上執行的代理程式,且其監視來自 API 伺服器的工作要求。 其可確保要求的工作單位正在執行且狀況良好。

kubelet 會監視節點,並確保定每個節點的排程容器都如預期執行。 Kubelet 只管理由 Kubernetes 建立的容器。 如果目前的節點無法執行工作,其不負責重新排程工作以在其他節點上執行。

什麼是 kube-proxy?

Kube-proxy 元件負責本機叢集網路,且在每個節點上執行。 其確保每個節點都具備唯一的 IP 位址。 其也實作規則來使用 IPTABLES 和 IPVS 處理流量的路由與負載平衡。

此 Proxy 本身不提供 DNS 服務。 建議使用以 CoreDNS 為基礎的 DNS 叢集附加元件,這是預設安裝的附加元件。

什麼是容器執行階段?

容器執行階段是在 Kubernetes 叢集中執行容器的底層軟體。 此執行階段負責擷取、啟動及停止容器映像。 Kubernetes 支援數個容器執行階段,包括但不限於 Docker、containerd、rkt、CRI-O 及 frakti。 對於許多容器執行階段類型的支援都是以容器執行階段介面 (CRI) 為基礎。 CRI 是一種外掛程式設計,讓 kubelet 能夠與可用的容器執行階段進行通訊。

AKS 中的預設容器執行階段是 containerd,這是業界標準的容器執行階段。

與 Kubernetes 叢集互動

Kubernetes 提供一個名為 kubectl 的命令列工具來管理您的叢集。 您可使用 kubectl 將命令傳送給叢集的控制平面,或透過 API 伺服器擷取所有 Kubernetes 物件的資訊。

kubectl 會使用包含設定資訊的組態檔:

  • Cluster 設定會指定叢集名稱、憑證資訊,以及與叢集建立關聯的服務 API 端點。 此定義讓您能夠從單一工作站連線到多個叢集。
  • 使用者設定會指定使用者及其存取已設定叢集時的權限層級。
  • 內容設定會使用易記名稱來將叢集和使用者分組。 例如,您可使用 "dev-cluster" 及 "prod-cluster" 來識別開發叢集和生產叢集。

您可以在命令列語法中提供正確的內容,將 kubectl 設定為連線到多個叢集。

Kubernetes Pod

Pod 代表在 Kubernetes 中所執行應用程式的單一執行個體。 您在 Kubernetes 上執行的工作負載是容器化應用程式。 與在 Docker 環境中不同,您無法直接在 Kubernetes 中執行容器。 您要將容器封裝到稱為 Pod 的 Kubernetes 物件中。 Pod 是可在 Kubernetes 中建立的最小物件。

此圖顯示以網站作為主要容器的 Pod。

單一的 Pod 可包含一或多個容器。 不過,Pod 通常不會包含多個相同的應用程式。

Pod 包含共用儲存體和網路設定的相關資訊,以及有關如何執行其封裝容器的規格。 您可使用 Pod 範本來定義在叢集中執行的 Pod 資訊。 Pod 範本是您重複使用並包含在其他物件中以管理 Pod 部署的 YAML 編碼檔案。

此圖顯示以網站作為主要容器且有一個支援容器的 Pod。此節點同時具有一個指派的 IP 位址和一個 localhost 主機位址。

例如,假設您想要將網站部署到 Kubernetes 叢集。 您可以建立 Pod 定義檔案,指定應用程式的容器映像與設定。 接下來,您可以將此 Pod 定義檔案部署到 Kubernetes。

Web 應用程式在解決方案中不太可能只有網站一個元件。 Web 應用程式通常具有某種資料存放區及其他支援元素。 Kubernetes Pod 也可包含多個容器。

假設網站使用資料庫。 該網站封裝於主要容器中,而資料庫封裝於支援容器中。 多個容器會透過環境彼此通訊。 容器包含主機 OS、網路堆疊、核心命名空間、共用記憶體和儲存體磁碟區的服務。 Pod 是可將所有這些服務提供給應用程式的沙箱環境。 Pod 也允許容器共用其指派的 IP 位址。

因為您可以建立許多在多個節點上執行的 Pod,所以可能很難識別它們。 您可以使用定義 Pod 時所指定的字串標籤,來辨識 Pod 並加以分組。

Kubernetes Pod 的生命週期

Kubernetes Pod 具有一個不同的生命週期,其會影響您部署、執行及更新 Pod 的方式。 您一開始會將 Pod YAML 資訊清單提交給叢集。 將資訊清單檔提交並保存至叢集之後,其會定義 Pod 的預期狀態。 排程器會將 Pod 排程至狀況良好且有足夠資源來執行 Pod 的節點。

此圖顯示 Pod 的生命週期。

以下是 Pod 生命週期中的階段:

階段 描述
待定 Pod 會接受叢集,但並非叢集中的所有容器都已設定或準備好要執行。 擱置狀態表示 Pod 正在等候排程的時間,以及下載容器映像所花費的時間。
執行中 當 Pod 內的所有資源都就緒後,Pod 就會轉換為執行狀態。
成功 在 Pod 完成其預期的工作並成功執行後,Pod 會轉換為成功狀態。
已失敗 Pod 可能因各種原因而失敗。 Pod 中的容器可能會失敗,導致所有其他容器終止,或可能是在準備 Pod 容器期間找不到映射。 在這類情況下,Pod 可能會進入失敗狀態。 Pod 可能會從 [擱置] 狀態或 [執行] 狀態轉換成 [失敗] 狀態。 特定失敗也可能讓 Pod 變回擱置狀態。
Unknown 如果無法判斷 Pod 的狀態,則該 Pod 為 [未知] 狀態。

Pod 會保留在叢集上,直到控制器、控制平面或使用者明確地將其移除為止。 刪除 Pod 時,會在之後立即建立新的 Pod。 新的 Pod 會根據 Pod 資訊清單而視為全新的執行個體。 它並非確切的複製,因此與已刪除的 Pod 不同。

叢集不會儲存 Pod 以狀態或動態指派的設定。 例如,它不會儲存 Pod 的識別碼或 IP 位址。 此層面會影響您部署 Pod 及設計應用程式的方式。 例如,您不能依賴 Pod 的預先指派 IP 位址。

容器狀態

請記住,這些階段是 Pod 在其生命週期中所處位置的摘要。 檢查 Pod 時,叢集會用三種狀態來追蹤 Pod 內的容器:

州/省 描述
等待 容器的預設狀態,以及容器在未執行或終止時所處的狀態。
執行中 容器會如預期般執行,沒有發生任何問題。
已終止 驗證容器已不再執行。 原因是所有工作都已完成,或容器因為某些原因而失敗。 針對這兩種情況進行偵錯時,都會提供原因和結束代碼。