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 是由一個「控制器」 (例如部署) 進行建立及管理。控制器會控管成員 Pod 的生命週期,也會執行「水平資源調度」,依需求調整 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。

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

Pod 範本

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

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

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

控制 Pod 執行的節點

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

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

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

Pod 使用模式

Pod 主要有兩種使用方式:

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

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

Pod 終止

當程序執行完畢時,Pod 將會正常終止。根據預設,在 30 秒內終止都算正常終止。

您可以使用 kubectl delete 指令來手動刪除 Pod。該指令的 --grace-period 標記可讓您覆寫預設的寬限期。

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件