今天是 IT 鐵人賽的第六天。
一路寫到這裡,我發現自己有點偏離當初參賽的初衷。
一開始我希望透過這個比賽,強迫自己學習 DevOps 相關的知識和技術。
但前幾天的文章,老實說有點像是「為了每天交作業而寫」,只停留在很表層的介紹。
每天時間有限,寫的東西也無法深入,反而覺得收穫不大。
所以我決定調整方向,接下來的日子我會專注在 Kubernetes (k8s) 上,
每天挑一個核心概念,深入理解 + 搭配實作,幫助自己真的能把知識學進腦袋裡。
那麼,今天就從 K8s 的最小單位 —— Pod 開始吧。
在 Kubernetes 裡,Pod 是最小的可部署單位。
它就像是一個「容器的包裝盒」,裡面可以放一個或多個容器,這些容器會共享:
雖然大多數情況下一個 Pod 只會有一個容器,但你也可以在需要緊密耦合的情境(例如 sidecar 模式)裡,讓多個容器跑在同一個 Pod 中。
理解 Pod 的「生命週期」與「重啟策略」,是學習 Kubernetes 的重要基礎,因為它們直接影響:
Pod 的生命週期可以分為幾個階段 (Phase):
需要注意的是:
| 層級 | Pod Phase (整體) | Container State (細部) |
|------|-------------------|-------------------------------|
| 定義 | Pod 整體的高層級狀態 | Pod 內每個 Container 的即時狀態 |
| 類型 | Pending, Running, Succeeded, Failed, Unknown | Waiting, Running, Terminated|
| 粒度 | 粗 | 細 |
| 用途 | 總覽、監控 | 除錯、問題定位 |
Pod 規格 (spec.restartPolicy) 定義了容器失敗後該怎麼辦。
共有三種選項:
步驟 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:修改策略觀察差異
選擇正確的策略:
Pod 不等於容器:
避免無限重啟:
今天我們深入理解了:
這些知識對於理解 Kubernetes 的「自我修復能力」非常關鍵。
明天,我會繼續探討 ReplicaSet 與 Deployment,看看它們如何和 Pod 搭配,實現應用的高可用性。