文章分析:《🚀 15 Kubernetes Traps Every DevOps Engineer Must Survive》
這篇文章以快問快答的形式,列出了 15 個在 Kubernetes 中常見但容易誤解的「陷阱」問題。這些問題涵蓋了 Pod 生命週期、儲存、網路、調度等多個方面,旨在揭示即使是經驗豐富的工程師也可能存在的知識盲區。
15 個陷阱問題的核心知識點總結
- initContainer 失敗 +
restartPolicy: Never:Pod 狀態會變為Failed。因為 initContainer 必須成功,主容器才能啟動。 - 刪除 StatefulSet 的 replica-1:K8s 只會重建
replica-1,其他副本的名稱(replica-2,replica-3)保持不變,維持了其身份的穩定性。 - DaemonSet 與 NoSchedule Taint:預設情況下,DaemonSet Pod 不會被調度到帶有
NoSchedule污點的主節點上,除非該 DaemonSet 明確配置了對應的「容忍 (toleration)」。 - 在滾動更新中途更新 Deployment 鏡像:K8s 會取消當前的滾動更新,並立即以新的鏡像版本啟動一個全新的滾動更新。
- 節點 NotReady 後 Pod 的驅逐時間:預設是 300 秒(5 分鐘)。這個時間可以透過
--pod-eviction-timeout參數進行全域配置。 - 同一 Pod 內多個容器共享端口:不可能。在一個 Pod 的網路命名空間內,端口是唯一的。
ReadWriteOnce(RWO) 的 PVC:可以被同一節點上的多個 Pod 共享掛載。但不能被不同節點上的 Pod 同時掛載。- HPA 的自訂指標伺服器宕機:自動擴縮容會停止工作。HPA 無法獲取指標,因此不會對 Pod 數量做任何調整。
- 對
CrashLoopBackOff狀態的 Pod 進行端口轉發:不會成功。port-forward需要一個正在運行的 Pod 來建立連接。 - 刪除正在被 Pod 使用的 ServiceAccount:已經掛載到 Pod 中的 Token 會繼續有效,直到它們過期(通常為 1 小時)。
- 過於嚴格的反親和性規則:是的,可能會導致調度死鎖,使 Pod 永遠處於
Pending狀態。 - Job (並行度: 3) 中一個 Pod 失敗 (
restartPolicy: Never):Job 控制器會創建一個新的 Pod 來替代失敗的 Pod,以確保最終有 3 個 Pod 成功完成任務。 - 修改運行中 Pod 的資源請求:不可以直接修改。資源請求(requests)和限制(limits)是不可變的,必須刪除並重建 Pod。
- NetworkPolicy 中沒有 egress 規則:預設情況下,出站流量是被允許的。網路策略採用「預設允許,明確拒絕」的原則。
- PV 損壞對多個 PVC 的影響:是的,可能會發生級聯故障。如果多個 PVC 綁定到同一個損壞的 PV,所有使用這些 PVC 的 Pod 都會遇到錯誤。
整篇文章重點結論
這篇文章是一份高效的 Kubernetes 「自檢清單」,透過 15 個精心設計的問答,系統性地揭示了 Kubernetes 中容易被忽視或誤解的關鍵機制。其核心價值在於,它不僅僅是知識點的羅列,而是將這些知識點置於實際的、可能出錯的場景中,迫使讀者思考邊界條件和預設行為。
文章的主要結論和 takeaways 可以歸納為:
- 魔鬼在細節中:對 K8s 的掌握程度,體現在對其各種資源的生命週期、重試邏輯和預設行為的精確理解上。
- 預設行為很重要:了解 K8s 的預設設置(如驅逐超時、網路策略的預設規則)是避免生產事故的關鍵。
- 層級化控制:理解不同控制器(如 Job 控制器)如何管理其下屬資源(如 Pod)的行為至關重要。
- 不可變性原則:深入理解哪些資源屬性(如 Pod 的資源請求)是創建後不可變的,這對設計更新和發布策略至關重要。
總而言之,這份清單可以幫助 DevOps 工程師快速識別自己的知識弱點,加深對核心概念的理解,從而更好地駕馭這個複雜的系統。