Advanced - Pod Lifecycle
在 Kubernetes 中,Pod 是最小的可部署單位,它代表一組容器的集合。 Pod 的生命週期包含多個階段,每個階段都反映了 Pod 的狀態和行為。 以下將介紹 Pod 的生命週期、主要的容器類型以及相關的探針(Probes)。
Pod Lifecycle
Pod 的生命週期中有以下重要的部分:
- Init Container (初始化容器):
- Init Container 是在 Main Container 啟動之前執行的特殊容器,負責完成初始化任務。
- 這些任務包括檢查條件是否滿足、準備必要的資源(如配置文件或數據初始化)。
- Init Container 必須執行成功,才能啟動後續的 Main Container。
- Main Container (主容器):
- Main Container 是 Pod 的核心,執行應用程序的主要工作負載。
- Pod 通常至少包含一個 Main Container,負責提供主要的服務或執行任務。
- Post Start / Pre Stop Hook (生命週期鉤):
- Kubernetes 提供了容器級別的鉤子,用於在容器啟動後或終止前執行一些任務。
- Post Start Hook:
- 在容器啟動後立即執行,用於執行初始化操作。
- Pre Stop Hook:
- 在容器終止前執行,用於清理資源或執行優雅關閉操作。
- Liveness / Readiness Probe (健康檢查機制):
- 探針是用於監控容器健康狀態的機制,確保應用穩定性和高可用性。
- Liveness Probe
- 用 於檢查容器是否仍然存活。
- 如果檢查失敗,Kubernetes 會自動重啟該容器。
- Readiness Probe
- 用於檢查容器是否準備好接受流量。
- 如果檢查失敗,Kubernetes 會從該容器的服務端點中移除。
Pod Phase (階段)
Pod 可以分為以下主要階段:
- Pending:
- 當 Pod 被創建後,進入 Pending 狀態。
- 在這個階段,Kubernetes 正在尋找適合的節點(Node)來調度 Pod,並拉取所需的容器映像。
- Running:
- 當 Pod 已被調度到某個節點,且所有的容器都成功啟動時,Pod 進入 Running 狀態。
- 此時,Pod 開始執行其定義的工作負載。
- Succeeded:
- 當 Pod 中所有的容器都正常執行完畢並成功退出,Pod 進入 Succeeded 狀態。
- 這通常發生於執行一次性任務的 Pod,例如批次作業。
- Failed:
- 如果 Pod 中任何容器異常退出且未被重啟策略恢復,Pod 進入 Failed 狀態。
- Unknown:
- 當 Kubernetes 無法與執行 Pod 的節點通訊時,Pod 進入 Unknown 狀態。
Restart Policies
Pod 支援三種重啟策略:
- Always: 無論退出狀態如何,總是重啟容器(預設值)。
- OnFailure: 只有在容器異常退出時才重啟。
- Never: 容器退出後不重啟。
restartPolicy 僅適用於 kubelet 在同一節點上重新啟動容器。
Kubelet 將根據指數增加的延遲(10s, 20s, 40s)重新啟動不健康的容器,延遲上限為 5 分鐘,並在容器成功執行 10 分鐘後重置延遲。
控制器與重啟策略
- Job:
- 用於一次性任務,例如批量計算。
- 任務結束後,Pod 會被此類控制器清除。
- 支援的重啟策略為
OnFailure或Never。
- Replication Controller / ReplicaSet / Deployment:
- 這些控制器旨在確保 Pod 持續運行。
- 僅支援
Always作為重啟策略。
- DaemonSet:
- 在每個節點上只會運行一個 Pod。
- 重啟策略必須是
Always。
範例
就像我們之前建立 Deployment 一樣,主要是為了確保 Pod 持續運行,所以重啟策略設定為 Always。
always_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: v1-deployment
labels:
type: demo-v1
spec:
replicas: 1
selector:
matchLabels:
type: demo-v1
template:
metadata:
labels:
type: demo-v1
spec:
restartPolicy: Always
containers:
- name: v1
image: hello-world:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 8080
Container Types
在 Pod 中,可以包含多種類型的容器,每種類型都有其特定的用途。