Kubernetes Pod 原理詳解
1. Pod 的部署方式
Pod 是 Kubernetes 的最小調度單元,其部署方式分為 聲明式(YAML) 和 命令式(kubectl) 兩種:
(1) 聲明式部署(推薦)
通過 YAML 文件定義 Pod 規格,由 Kubernetes 確保實際狀態與聲明一致:
# pod.yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: nginximage: nginx:1.23ports:- containerPort: 80- name: sidecarimage: busyboxcommand: ["sh", "-c", "tail -f /dev/null"]
應用配置:
kubectl apply -f pod.yaml
(2) 命令式部署
直接通過 kubectl
命令創建臨時 Pod(適合調試):
kubectl run my-pod --image=nginx:1.23 --port=80
2. Pod 共享網絡機制
同一 Pod 內的所有容器共享 網絡命名空間,表現為:
? 同一 IP 地址:所有容器共享 Pod IP,外部通過該 IP 訪問。
? localhost 通信:容器間通過 localhost:port
直接通信,無需服務發現。
? 共享端口空間:容器端口不能沖突(如兩個容器同時監聽 80 端口會導致錯誤)。
底層實現
? Infra 容器:每個 Pod 啟動時先創建 pause
容器(由 Kubernetes 維護),負責創建共享的網絡命名空間。
? 其他容器:通過 --net=container:<infra-container-id>
加入該網絡命名空間。
3. Pod 的原子性部署
? 整體調度:Pod 是 Kubernetes 的最小調度單元,所有容器作為一個整體被調度到同一節點。
? 原子生命周期:
? 創建:所有容器同時啟動,任一容器啟動失敗則 Pod 進入 Error
狀態。
? 刪除:所有容器同時終止,Kubernetes 發送 SIGTERM 信號并等待優雅退出(默認 30 秒后強制終止)。
4. Pod 生命周期
Pod 的生命周期由多個階段(Phase)和狀態(Conditions)組成:
(1) 生命周期階段(Phase)
階段 | 描述 |
---|---|
Pending | Pod 已被調度到節點,但至少一個容器未完成啟動(如鏡像下載中)。 |
Running | 所有容器已創建,至少一個容器處于運行狀態。 |
Succeeded | 所有容器正常退出(退出碼為 0),且不再重啟。 |
Failed | 至少一個容器非正常退出(退出碼非 0),且所有容器已終止。 |
Unknown | Pod 狀態無法獲取(通常因節點失聯導致)。 |
(2) 關鍵事件與探針
? Init Containers:在應用容器前運行的初始化容器,必須全部成功。
spec:initContainers:- name: init-dbimage: busyboxcommand: ['sh', '-c', 'until nslookup db-service; do sleep 2; done']
? 探針(Probes):控制容器健康狀態和流量接收。
livenessProbe: # 存活檢查:失敗則重啟容器httpGet:path: /healthzport: 8080
readinessProbe: # 就緒檢查:失敗則從 Service 移除端點exec:command: ["cat", "/tmp/ready"]
(3) 重啟策略(RestartPolicy)
? Always(默認):容器退出后自動重啟。
? OnFailure:僅當容器非正常退出(退出碼非 0)時重啟。
? Never:不重啟。
5. Pod 相關操作指令
(1) 創建與刪除
# 從 YAML 創建
kubectl apply -f pod.yaml# 刪除 Pod
kubectl delete pod my-pod
(2) 查看狀態
# 查看 Pod 列表
kubectl get pods [-o wide] [--watch]# 查看 Pod 詳情(含事件日志)
kubectl describe pod my-pod
(3) 調試與日志
# 查看容器日志
kubectl logs my-pod -c nginx [--follow] [--tail=100]# 進入容器終端
kubectl exec -it my-pod -c nginx -- /bin/sh# 復制文件到 Pod
kubectl cp /local/file my-pod:/path/in/pod
(4) 資源管理
# 編輯運行中的 Pod 配置(臨時調試)
kubectl edit pod my-pod# 強制刪除卡在 Terminating 的 Pod
kubectl delete pod my-pod --grace-period=0 --force
6. 常見問題與解決
? Pending 狀態:檢查資源配額、鏡像拉取權限或節點污點(Taints)。
? CrashLoopBackOff:查看容器日志 (kubectl logs --previous
) 定位啟動錯誤。
? 網絡不通:驗證 kube-proxy
是否正常運行,檢查網絡插件(Calico/Flannel)狀態。
? 存儲掛載失敗:確認 PersistentVolumeClaim (PVC) 是否已綁定。
總結
? Pod 是原子單位:所有容器共享網絡、存儲,同生共死。
? 聲明式管理:通過 YAML 定義,由 Kubernetes 確保狀態一致性。
? 生命周期控制:探針和重啟策略保障應用高可用。
? 核心操作指令:kubectl get/describe/logs/exec
是調試 Pod 的必備工具。
理解 Pod 的原理和操作,是掌握 Kubernetes 應用編排的基礎。