當前位置: 妍妍網 > 碼農

【運維幹貨分享】實際例子來解釋kubernetes中的pod的生命周期

2024-08-25碼農

在這篇部落格中,我們將透過範例和插圖來了解 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 物件的一部份。