在這篇部落格中,我們將透過範例和插圖來了解 Kubernetes Pod 的生命周期。
如果你不熟悉 Pod 的概念,請閱讀 Kubernetes Pod 部落格以了解所有基礎知識,並親身實踐建立和管理 Pod。
為了理解 pod 的生命周期,我們將檢視以下內容
Pod 階段
Pod 條件
容器狀態
為了更好地理解這些概念,我們假設一個包含以下內容的多容器 pod
一個 init 容器,用於在執行時獲取 API 金鑰。
container-01 (java-api) 執行 Java 應用程式
container-02 (log-reader) 獲取應用程式日誌並將其發送到日誌轉發器。
我們將透過了解在部署具有上述要求的 Pod 時會發生什麽來了解 Pod 生命周期。
Pod 階段
部署 Pod 時,它通常可能屬於以下任何一個階段。
Pod階段 | 描述 |
---|---|
Pending | Pod 已建立,但尚未執行。 |
Running | 至少有一個容器正在執行,或者正在啟動或重新啟動。 |
Succeeded | 所有貨櫃均已成功完成。 |
Failed | 至少有一個容器出現故障。 |
Unknown | API 伺服器無法獲取 Pod 狀態。 |
現在,讓我們透過使用我們的應用程式 pod 的即時範例來了解這些階段。我們將我們的 pod 稱為 java-api-pod
以下是部署 Pod 多容器 Pod 時 Pod 階段的工作方式。
1. Pending階段
當你部署 api-pod 時,它將處於Pending階段。在 Pod 進入 「Running」 階段之前,init 容器將在任何其他容器啟動之前執行完成。
以下是 Pod 繼續處於掛起階段的一些常見情況。
缺乏 pod 的 CPU 和記憶體資源。
如果 Pod 具有卷定義,但卷不可用。
如果 Kubernetes 無法拉取容器映像。
如果 init 容器無法啟動
如果 init 容器失敗並出現非零結束程式碼,並且 restartPolicy 設定為 Never,則 Pod 將直接進入失敗階段。
2. Running階段
在 init 容器完成獲取金鑰後,Pod 將進入「正在執行」階段。container-01 和 container-02 都將啟動。因為我們的 Java 應用程式是一個需要執行的 API,所以只要 Java API 應用程式啟動,Pod 就會保持在「執行中」階段。出於某種原因,如果任何容器無法啟動,Pod 將進入失敗階段。
3. Succeeded階段:
此階段不適用於我們的 Java 應用程式,因為「成功」適用於完成任務然後結束的容器。
我們的 java-api-pod 旨在繼續執行,因此除非你手動停止它,否則它不會到達此階段。
成功階段適用於屬於 Kubernetes Job/Cronjob 物件的 Pod。
4. Failed階段
如果你的 init 容器、Java 應用程式容器或日誌讀取器容器由於某種原因崩潰或結束,Pod 將進入 「Failed」 階段。
在以下情況下,Pod 將進入失敗階段
如果 init 容器或主容器以非零結束程式碼結束,並且 restartPolicy 設定為 Never。
如果一個節點發生故障,或者 Pod 被逐出一個節點並且無法移動到另一個節點,它將進入失敗狀態。
如果 pod 啟用了 activeDeadlineSeconds(通常在 Jobs 和 Cronjobs 上)欄位並且超過了時間限制,則Pod 將被終止並標記為 Failed。
如果你手動刪除了 Pod,但它無法正常終止,則 Pod 將進入失敗狀態。
5.Unknown階段
這種情況很少見,但如果 api-server 由於某種原因無法獲取 Pod 的狀態,它將被標記為 「Unknown」。
Pod 條件
Pod 的階段提供了 Pod 當前狀態的簡要更新,因為 Pod 條件為你提供了與計劃、就緒和初始化相關的詳細資訊。
如果你描述一個 pod,你將看到如下所示的條件部份。這些條件是 PodStatus 物件的一部份。