← 返回上一頁
Kubernetes

Kubernetes 十問挑戰:測試你對 K8s 核心機制的理解程度

本頁目錄
Kubernetes 元件架構圖

前言

最近在跟同事討論 Kubernetes 的時候,發現很多人雖然天天在用 K8s,但對一些底層細節其實沒那麼清楚。於是我整理了 10 個我覺得蠻有鑑別度的問題,涵蓋調度、網路、日誌、擴展等面向,可以拿來自我檢測一下。如果你每題都能快速回答並抓到關鍵點,那代表你對 K8s 的掌握程度已經相當不錯了。

Kubernetes 元件架構圖
Kubernetes 叢集元件架構(圖片來源:kubernetes.io)

十個問題,先想想再看答案

  1. 叢集有 2 個 Node,一個上面已經跑了 Pod,另一個是空的,新建的 Pod 會調度到哪個節點?
  2. 容器發生 OOM(記憶體不足),到底是容器重啟還是整個 Pod 被重建?
  3. 環境變數或 ConfigMap 的設定可以不重建 Pod 就動態更新嗎?
  4. Pod 建立之後就穩定了嗎?使用者什麼都不做它會不會出事?
  5. ClusterIP 類型的 Service 能確保 TCP 流量均衡分配嗎?
  6. 應用程式的日誌怎麼收集?有沒有可能漏掉?
  7. HTTP Server Pod 的 livenessProbe 通過了,就代表一切正常嗎?
  8. 流量突然暴增,應用程式該怎麼擴展?
  9. 執行 kubectl exec -it <pod> -- bash 之後,你其實「進入」了什麼?
  10. Pod 裡的容器不斷退出又重啟,該怎麼排查?

建議先自己想過一輪再往下看,效果會比較好。

逐題解析

1. 新的 Pod 會調度到哪個節點?

這題很多人直覺回答「空的那個」,但其實 不一定

Kubernetes 的調度流程會經過多個階段:篩選(Filtering)→ 評分(Scoring)→ 選擇最高分節點。其中節點上的各種配置(節點親和性、污點容忍、強制調度等)都會影響最終結果。

Kubernetes 調度框架流程圖
Kubernetes Scheduling Framework 的擴展點(圖片來源:kubernetes.io)

假設我們排除特殊配置,單看預設的評分插件 NodeResourcesFit,它有三種策略:

策略名稱 行為 本題結果
LeastAllocated(預設) 優先選資源使用率最低的節點 調度到空節點
MostAllocated 優先選資源使用率較高的節點 調度到已有 Pod 的節點
RequestedToCapacityRatio 追求節點間資源使用率平衡 調度到空節點

所以答案取決於叢集的調度策略設定,而非單純看哪個節點比較閒。

2. OOM 了是容器重啟還是 Pod 重建?

一般來說是 容器重啟,Pod 不會被重建。這裡的行為取決於 Pod 的 RestartPolicy(預設值為 Always),kubelet 會在原地重啟該容器。

但有個例外:如果節點本身記憶體壓力已經很大,kubelet 可能會觸發 Pod 驅逐(Eviction),這時候 Pod 就會被整個移除並在其他節點重建。

3. ConfigMap 可以動態更新嗎?

要分兩種情況:

  • 環境變數:無法動態更新,改了之後必須重建 Pod 才會生效。
  • ConfigMap 掛載為 Volume:可以動態更新,但有兩個前提條件——掛載時 不能使用 subPath,而且同步延遲受 kubelet 的 syncFrequency(預設 1 分鐘)和 configMapAndSecretChangeDetectionStrategy 設定影響。

4. Pod 建立後就穩定了嗎?

不一定。即使使用者什麼都不做,以下情況都可能讓 Pod 被迫遷移:

  • 節點資源不足觸發驅逐(Eviction)
  • 節點網路異常導致 kubelet 無法回報心跳,Control Plane 判定節點不可用
  • 節點維護或升級時被設定為不可調度(cordon/drain)

所以設計應用時,永遠要假設 Pod 是會隨時消失的。

5. ClusterIP Service 能保證 TCP 負載均衡嗎?

不能完全保證,特別是在長連接(Long-lived Connection)的場景下。

不管底層用的是 iptables 還是 ipvs,ClusterIP Service 都依賴 Linux 核心的 Netfilter 機制。而 Netfilter 內部的 Connection Tracking 會追蹤每個連線的狀態,確保已建立的 TCP 連線持續送往同一個後端 Pod。

這表示如果你的應用使用長連接(像是 gRPC、WebSocket),流量很可能集中在少數幾個 Pod 上,造成負載不均。

6. 應用日誌怎麼收集?會不會遺失?

常見的日誌輸出方式有兩種:

輸出方式 收集方法 是否可能遺失
stdout/stderr DaemonSet 部署日誌代理(如 Fluentd、Filebeat) 可能。Pod 被刪除時容器日誌檔也會被清除,代理可能來不及採集完
寫入日誌檔案 + 持久化儲存 掛載 PV,日誌直接寫入持久化路徑 較不容易遺失

如果你的應用對日誌完整性有嚴格要求,建議採用持久化儲存的方式,而不是單純依賴 stdout。

7. livenessProbe 正常就沒問題嗎?

不一定。至少有兩個盲點:

  • 應用層面:livenessProbe 只檢查應用是否「還活著」,不代表功能正常。應用可能已經進入異常狀態(例如連不上資料庫),但 health check endpoint 仍然回 200。
  • 網路層面:livenessProbe(假設是 httpGet 型態)是由該節點的 kubelet 在本機發起的請求,只能驗證本機到容器的連通性,無法確認跨節點的網路是否正常。

所以除了 livenessProbe 之外,建議搭配 readinessProbe 做更完整的健康檢查。

8. 應用程式怎麼擴展來應對流量波動?

Kubernetes 提供兩種原生擴展機制:

機制 全名 說明
HPA Horizontal Pod Autoscaler 根據 CPU、記憶體或自訂指標動態增減 Pod 數量,是最常用的方式
VPA Vertical Pod Autoscaler 調整單一 Pod 的資源配額,但因為目前不支援原地調整,會先刪再建 Pod,實際使用較受限

實務上大多採用 HPA,搭配 Prometheus 等監控系統提供的自訂指標(如 RPS、佇列長度)來做更精確的擴縮。當然,你也可以透過外部系統監控指標後,直接呼叫 Kubernetes API 來手動或自動調整副本數。

9. kubectl exec 進去的到底是什麼?

這題是個經典的概念題。嚴格來說,你既不是「進入了 Pod」,也不是「進入了容器」

首先,如果 Pod 裡有多個容器,你需要用 -c 指定要操作哪一個(只有一個容器時可省略)。

再來,Pod 本質上是一組共享的 Linux Namespace:

  • 共享:Network、IPC、UTS namespace
  • 獨立:每個容器有自己的 PID、Mount namespace

所以 kubectl exec -it <pod> -- bash 實際上是在目標容器的隔離環境中 建立一個新的 bash 程序,而不是什麼「登入」動作。

10. 容器反覆退出重啟怎麼排查?

當容器不斷 CrashLoopBackOff 時,kubectl exec 基本上用不了(容器一直在重啟)。這時候可以這樣排查:

  1. kubectl describe pod <pod> 查看事件和容器狀態
  2. kubectl logs <pod> --previous 查看上一次退出前的日誌
  3. 檢查節點狀態和資源使用情況
  4. 使用 kubectl debug 在 Pod 上啟動一個 臨時除錯容器(Ephemeral Container),在同樣的環境下檢查檔案系統、環境變數和依賴服務

小結

這 10 個問題看似基礎,但每一題背後都牽涉到 Kubernetes 的核心機制。如果有幾題答不太上來也沒關係,重要的是理解背後的原理,而不是死記答案。希望這篇整理對你有幫助,有任何想法歡迎留言討論。

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料