iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 6

Day6: Pod 深入理解:生命週期、重啟策略

  • 分享至 

  • xImage
  •  

前言

今天是 IT 鐵人賽的第六天。
一路寫到這裡,我發現自己有點偏離當初參賽的初衷。

一開始我希望透過這個比賽,強迫自己學習 DevOps 相關的知識和技術。
但前幾天的文章,老實說有點像是「為了每天交作業而寫」,只停留在很表層的介紹。
每天時間有限,寫的東西也無法深入,反而覺得收穫不大。

所以我決定調整方向,接下來的日子我會專注在 Kubernetes (k8s) 上,
每天挑一個核心概念,深入理解 + 搭配實作,幫助自己真的能把知識學進腦袋裡。

那麼,今天就從 K8s 的最小單位 —— Pod 開始吧。

在 Kubernetes 裡,Pod 是最小的可部署單位。
它就像是一個「容器的包裝盒」,裡面可以放一個或多個容器,這些容器會共享:

  • 網路:Pod 內的容器透過 localhost 就能互相連線。
  • 儲存:可以共用 Volume。

雖然大多數情況下一個 Pod 只會有一個容器,但你也可以在需要緊密耦合的情境(例如 sidecar 模式)裡,讓多個容器跑在同一個 Pod 中。

理解 Pod 的「生命週期」與「重啟策略」,是學習 Kubernetes 的重要基礎,因為它們直接影響:

  • 系統的穩定性
  • 錯誤發生時的行為
  • 應用的資源效率

Pod 的生命週期 (Pod Lifecycle)

Pod 的生命週期可以分為幾個階段 (Phase):

  1. Pending:Pod 被建立,但還沒完全準備好(例如等待調度或拉取映像檔)。
  2. Running:至少有一個容器正在執行,其他容器也可能在啟動或重啟中。
  3. Succeeded:Pod 裡的所有容器都順利執行完畢並結束。
  4. Failed:至少有一個容器非正常結束。
  5. Unknown:因為 Node 無法回報狀態,Pod 狀態未知。

需要注意的是:

  • Pod Phase 代表整體狀態。
  • Container State 則更細緻,分為:
    • Waiting(等待啟動)
    • Running(執行中)
    • Terminated(已結束)

比較表:

| 層級 | Pod Phase (整體)  | Container State (細部)          |
|------|-------------------|-------------------------------|
| 定義 | Pod 整體的高層級狀態 | Pod 內每個 Container 的即時狀態  |
| 類型 | Pending, Running, Succeeded, Failed, Unknown | Waiting, Running, Terminated|
| 粒度 | 粗                 | 細                            |
| 用途 | 總覽、監控          | 除錯、問題定位                  |

重啟策略 (Restart Policy)

Pod 規格 (spec.restartPolicy) 定義了容器失敗後該怎麼辦。
共有三種選項:

  1. Always(預設值)
    • 無論容器因為什麼原因結束,都會重啟。
    • 常用於 Deployment(長期運行的服務)。
  2. OnFailure
    • 只有當容器以非 0 狀態碼結束時才重啟。
    • 常用於 Job(希望失敗時自動重試的任務)。
  3. Never
    • 容器結束後不會重啟。
    • 適合一次性測試或批次工作。

實作範例:觀察 Pod 的生命週期與重啟策略

步驟 1:建立一個會失敗的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-restart-demo
spec:
  containers:
  - name: demo
    image: busybox
    command: ["sh", "-c", "echo Start && exit 1"]
  restartPolicy: OnFailure

這個 Pod 啟動時會先印出 Start,然後馬上以狀態碼 1 結束。

步驟 2:部署 Pod

kubectl apply -f pod-restart-demo.yaml

步驟 3:觀察狀態

kubectl get pod pod-restart-demo -w

你會看到 Pod 嘗試重啟:

NAME               READY   STATUS             RESTARTS   AGE
pod-restart-demo   0/1     CrashLoopBackOff   3          1m

再看看詳細資訊:

kubectl describe pod pod-restart-demo

輸出中會看到類似訊息:

State:          Waiting
Reason:         CrashLoopBackOff
Last State:     Terminated
  Reason:       Error
  Exit Code:    1

步驟 4:修改策略觀察差異

  • 把 restartPolicy 改成 Never:Pod 執行一次就結束,不會重啟。
  • 改成 Always:Pod 會持續嘗試重啟,直到你刪掉它。

常見問題與最佳實踐

選擇正確的策略:

  • 長期服務 → Always
  • 批次任務 → OnFailure
  • 測試或一次性 → Never

Pod 不等於容器:

  • 容器結束不代表 Pod 消失,Pod 是更高層的抽象。

避免無限重啟:

  • 小心 CrashLoopBackOff,可能是指令錯誤、環境變數沒設定、映像檔有問題。

結論

今天我們深入理解了:

  • Pod 的生命週期 (Phase + Container State)
  • 三種重啟策略 (Always, OnFailure, Never)
  • 搭配實作觀察差異

這些知識對於理解 Kubernetes 的「自我修復能力」非常關鍵。
明天,我會繼續探討 ReplicaSet 與 Deployment,看看它們如何和 Pod 搭配,實現應用的高可用性。


上一篇
Day5:理解 Kubernetes 的運行與核心資源
下一篇
Day7: ReplicaSet 與 Deployment:自動擴展與滾動更新
系列文
新創視角下的 DevOps × AI 探索11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言