Pod

本頁面說明 Kubernetes 的 Pod 物件及其在 Google Kubernetes Engine 中的用途。

什麼是 Pod?

Pod 是 Kubernetes 中最小、最基本的可部署物件。Pod 代表叢集中一個運作中程序的單一執行個體。

Pod 含有一或多個「容器」,如 Docker 容器。若 Pod 執行多個容器,系統會將這些容器視為單個實體進行管理,這些容器也共用 Pod 的資源。通常在一個 Pod 下執行多個容器是比較進階的做法。

Pod 也包含容器所使用的共用網路和儲存空間資源:

  • 網路:系統會自動為 Pod 指派不重複的 IP 位址。Pod 容器共用相同的網路命名空間,包括 IP 位址和網路通訊埠。Pod 中的容器在 Pod 的內部透過 localhost 彼此通訊。
  • 儲存空間:Pod 可指定一組共用儲存空間磁碟區,讓容器共用。

您可以將 Pod 當成是獨立且隔離的「邏輯主機」,其中包含執行應用程式必備的系統需求。

Pod 的功能是執行叢集中應用程式的單個執行個體,但我們不建議您直接建立個別的 Pod。通常您會建立一組完全相同的 Pod (稱為「備用資源」) 來執行您的應用程式。這組備用的 Pod 是由一個「控制器」 (例如 Deployment) 進行建立及管理。控制器會控管成員 Pod 的生命週期,也可執行「水平資源調度」,依需求調整 Pod 的數量。

雖然您偶爾會為了偵錯、疑難排解或檢查而與 Pod 直接互動,但我們強烈建議您使用控制器來管理您的 Pod。

Pod 在叢集中的節點上執行。Pod 一旦建立後就會一直保留在節點上,直到程序執行完畢後才會將其刪除。Pod 也可能因為資源不足或節點故障而從節點中「移除」。節點故障時,節點上的 Pod 會自動排定刪除時程。

Pod 生命週期

Pod 是暫時的,並非用於永久執行,因此在終止 Pod 後,Pod 就無法再恢復。一般來說,除非 Pod 被使用者或控制器刪除,否則不會消失。

Pod 不會「自癒」或自行修復。舉例來說,在系統將 Pod 排入一個節點後,該節點故障了,Pod 將會遭到刪除。同樣地,如果 Pod 因任何原因從節點中移除,也不會自行替換。

每個 Pod 都有 PodStatus API 物件,由 Pod 的status 欄位表示。Pod 會將本身的「階段」發布至 status: phase 欄位。Pod 的階段是 Pod 目前狀態的高階摘要。

當您執行 kubectl get pod 來檢查在叢集上執行的 Pod 時,Pod 可能會處於以下任何一個階段:

  • 擱置中:Pod 已建立且叢集已接受 Pod,但一或多個容器尚未開始執行。此階段包括在節點上排程及下載映像檔所花費的時間。
  • 執行中:Pod 已繫結至節點,且所有容器都已建立。至少有一個容器正在執行中、啟動中或重新啟動中。
  • 成功:Pod 中的所有容器都已成功終止。 終止的 Pod 不會重新啟動。
  • 失敗:Pod 中的所有容器都已終止,且至少有一個容器終止失敗。當容器以非零的狀態結束時就會造成「失敗」。
  • 不明:無法判別 Pod 的狀態。

此外,PodStatus 包含一個名為 PodConditions 的陣列,在 Pod 資訊清單中是以 conditions 表示。這個欄位有 typestatus 欄位。conditions 會更具體地表示導致 Pod 處於目前狀態的條件。

type 欄位可包含 PodScheduledReadyInitializedUnschedulablestatus 欄位與 type 欄位相對應,且可包含 TrueFalseUnknown

建立 Pod

因為 Pod 是臨時的,所以不需要直接建立 Pod。 另外,由於 Pod 不能自行修復或替換,因此我們不「建議」您直接建立 Pod。

相反地,您可以使用「控制器」 (例如 Deployment) 來為您建立及管理 Pod。控制器對於發布更新 (例如變更容器中執行的應用程式版本) 也很有用,因為控制器可為您控管整個更新流程。

Pod 要求

當 Pod 開始執行時,會要求一定的 CPU 數量和記憶體大小。這有助於 Kubernetes 將 Pod 排定在適當的節點上以執行工作負載。系統不會為了遵循 Pod 要求而將 Pod 排定在沒有資源的節點上。要求是 Kubernetes 保證為 Pod 保留的 CPU 數量或記憶體大小「下限」

您可以根據應用程式所需的資源設定 Pod 的 CPU 和記憶體要求,也可以為在 Pod 中執行的個別容器指定要求。但請注意以下事項:

  • CPU 的預設要求為 100m。這對許多應用程式而言過小,而且可能遠小於節點上可用的 CPU 數量。
  • 沒有預設的記憶體要求。系統可能會將沒有預設記憶體要求的 Pod 排定在記憶體不足以執行 Pod 工作負載的節點上。
  • 如果為 CPU 或記憶體要求設定過小的值,可能會導致系統將過多的 Pod 或效能欠佳的 Pod 組合排定在特定節點上,造成效能降低。
  • 如果為 CPU 或記憶體要求設定過大的值,可能會導系統無法排定 Pod,而增加叢集資源的費用。
  • 除了設定 Pod 資源之外,您可以為在 Pod 中執行的個別容器指定要求。如果僅為容器指定資源,則 Pod 的要求是為容器指定的要求總和。如果您同時指定 Pod 和容器的資源,所有容器的要求總和不得超過 Pod 要求。

強烈建議您根據實際工作負載的需求,為 Pod 設定要求。詳情請參閱 GCP 網誌的 Kubernetes 最佳做法:資源要求與限制一文。

Pod 限制

根據預設,Pod 在節點上可用的 CPU 或記憶體沒有上限。您可以設定限制來控管 Pod 在節點上可使用的 CPU 數量或記憶體大小。限制就是 Kubernetes 保證為 Pod 保留的 CPU 數量或記憶體大小「上限」

除了設定 Pod 限制之外,您可以為在 Pod 中執行的個別容器指定限制。如果僅為容器指定限制,則 Pod 的限制是為容器指定的限制總和。不過,每個容器只能存取限制以內的資源,因此如果您選擇只指定容器的限制,則必須為每個容器指定限制。如果您同時指定 Pod 和容器的限制,所有容器的限制總和不得超過 Pod 要求。

排定 Pod 時不需考慮限制,但可以防止 Pod 在同一節點上發生資源爭用情況,也可防止因基礎作業系統資源不足而導致節點上的 Pod 造成系統不穩定。

強烈建議您根據實際工作負載的需求,為 Pod 設定限制。詳情請參閱 GCP 網誌的 Kubernetes 最佳做法:資源要求和限制一文。

Pod 範本

控制器物件 (例如 Deployment 和 StatefulSet) 包含「Pod 範本」欄位。Pod 範本包含 Pod 規格,該規格會決定每個 Pod 的執行方式,包括應該在 Pod 中執行哪些容器,以及 Pod 應掛接在哪些磁碟區。

控制器物件使用 Pod 範本建立 Pod,並管理 Pod 在叢集中的「所需狀態」。變更 Pod 範本時,所有未來的 Pod 都將套用新範本,但現有的 Pod 不會套用新範本。

如要進一步瞭解如何使用 Pod 範本,請參閱 Kubernetes 說明文件的建立 Deployment 一節。

控制 Pod 執行的節點

預設情況下,Pod 會在叢集的預設節點集區中的節點上執行。您可以設定 Pod 明確或隱含選擇的節點集區:

  • 您可以在 Pod 資訊清單中設定 nodeSelector,明確地強制 Pod 將服務部署至特定節點集區。這樣會強制某一 Pod 僅在該節點集區中的節點上執行。

  • 您可以為您要執行的容器指定資源要求。Pod 只會在滿足資源要求的節點上執行。舉例來說,如果 Pod 定義包含需要 4 個 CPU 的容器,Service 就不會選擇在具有兩個 CPU 的節點上執行的 Pod。

Pod 使用模式

Pod 主要有兩種使用方式:

  • 執行單個容器的 Pod。最簡單且最常見的 Pod 模式是一個 Pod 配一個容器,並以單個容器代表整個應用程式。換句話說,您可以將 Pod 視為一個包裝函式。
  • 執行多個需要共同合作的容器的 Pod。包含多個容器的 Pod 主要用於支援需要共用資源的同址共管程式。這些同址容器可能會組合成一個服務單位:一個容器負責服務來自共用磁碟區的檔案,另一個容器負責重新整理或更新這些檔案。Pod 會將這些容器和儲存空間資源打包在一起,成為一個可管理的實體。

每個 Pod 都會執行特定應用程式的一個執行個體。若您想要執行多個執行個體,就必須為應用程式的每個執行個體各分配一個 Pod。我們通常會將此做法稱做「備用」。備用 Pod 是一個群體,由控制器 (例如 Deployment) 建立及控管。

Pod 終止

當程序執行完畢時,Pod 將會正常終止。Kubernetes 會將預設的正常終止時間設為 30 秒。刪除 Pod 時,可以根據您要在強制終止 Pod 前等待 Pod 終止的秒數,對 --grace-period 旗標進行設定,藉此覆寫正常終止時間。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件