1. Pod — 最小單位
Pod 是一組共享相同網路命名空間(相同 IP、Port 空間)和儲存卷的 1 個或多個容器。Pod 是 Kubernetes 中的排程單位。
┌─────────────────────────────────────┐
│ POD │
│ IP: 10.244.1.5 │
│ ┌────────────┐ ┌───────────────┐ │
│ │ Container │ │ Sidecar │ │
│ │ (app) │ │ (log-agent) │ │
│ └────────────┘ └───────────────┘ │
│ Shared Volume: /var/log │
└─────────────────────────────────────┘
Pod 生命週期
| 階段 | 含義 | 除錯提示 |
|---|---|---|
| Pending | 尚未被排程或正在拉取映像 | 檢查事件:kubectl describe pod |
| Running | 正在執行,至少 1 個容器處於活動狀態 | 正常狀態 |
| Succeeded | 所有容器以代碼 0 退出 | Job 已完成 |
| Failed | 至少 1 個容器以錯誤退出 | kubectl logs --previous |
| Unknown | 無法與節點通訊 | 節點網路問題 |
| CrashLoopBackOff | 容器持續崩潰並重啟 | kubectl logs -p |
考試重點: CrashLoopBackOff 不是正式的 Pod Phase——它是 Container 在 Waiting 狀態中的狀態。題目常區分「pod phase」與「container state」。
2. 工作負載控制器
| 控制器 | 使用場景 | 主要特點 |
|---|---|---|
| Deployment | 無狀態應用(Web 伺服器、API) | 滾動更新、回滾、ReplicaSet 管理 |
| ReplicaSet | 確保 N 個副本(通常透過 Deployment 使用) | 標籤選擇器,很少直接使用 |
| StatefulSet | 有狀態應用(資料庫、Kafka、Elasticsearch) | 穩定的 Pod 名稱(web-0、web-1)、穩定的儲存、有序部署 |
| DaemonSet | 在每個節點上執行代理程式(日誌、監控、網路) | 每節點 1 個 Pod,新節點加入時自動部署 |
| Job | 執行至完成的批次任務 | completions、parallelism、backoffLimit |
| CronJob | 定期批次任務 | cron 語法、concurrencyPolicy、schedule |
Deployment vs StatefulSet
DEPLOYMENT (Stateless) STATEFULSET (Stateful)
───────────────────── ────────────────────────
Pod names: web-a1b2c3 Pod names: web-0, web-1, web-2
Any order scale up/down Ordered: web-0 first, then web-1...
Shared or no storage Each Pod gets its own PVC
Pod replaced = new identity Pod replaced = same identity
Examples: nginx, api-server Examples: MySQL, MongoDB, Kafka
3. 標籤、選擇器與註解
| 概念 | 用途 | 範例 |
|---|---|---|
| Labels | 標記資源以便選擇和分組 | app: frontend, env: prod |
| Selectors | 根據標籤查詢資源 | selector: {app: frontend} |
| Annotations | 不用於選擇的中繼資料(建置資訊、聯繫方式) | maintainer: [email protected] |
考試重點: Service 透過 selector 匹配 Pod 的 labels 來尋找 Pod。如果 selector 不匹配,Service 將有空的 Endpoints → 流量無法到達 Pod。
4. DaemonSet 使用案例
NODE 1 NODE 2 NODE 3
┌──────┐ ┌──────┐ ┌──────┐
│fluentd│ │fluentd│ │fluentd│ ← Log collector DaemonSet
│ Pod │ │ Pod │ │ Pod │
├──────┤ ├──────┤ ├──────┤
│calico│ │calico│ │calico│ ← CNI network plugin DaemonSet
│ Pod │ │ Pod │ │ Pod │
└──────┘ └──────┘ └──────┘
DaemonSet 常用於:Fluentd/Filebeat(日誌收集)、Prometheus Node Exporter(指標)、kube-proxy(網路)、CNI 外掛(Calico、Cilium)。
5. 速查表
| 考試問題 | 答案 |
|---|---|
| 有狀態應用,需要穩定身份? | StatefulSet |
| 每節點 1 個 Pod(監控代理)? | DaemonSet |
| 無狀態應用搭配滾動更新? | Deployment |
| 一次性批次處理? | Job |
| 排程批次(每晚備份)? | CronJob |
| StatefulSet 的 Pod 命名模式? | name-0, name-1, name-2 |
6. 練習題
Q1: 一家公司需要在 Kubernetes 上部署 MySQL 資料庫,要求每個副本有穩定的網路身份和專用儲存。應使用哪種工作負載類型?
- A) 搭配 PersistentVolumeClaim 的 Deployment
- B) StatefulSet ✓
- C) DaemonSet
- D) ReplicaSet
解析:StatefulSet 提供穩定的 Pod 名稱(mysql-0、mysql-1)、有序的部署/擴展,且每個 Pod 透過 volumeClaimTemplates 獲得自己的 PVC。這些特性對資料庫至關重要。
Q2: 哪種工作負載確保叢集中每個節點(包括未來加入的節點)上都恰好執行一個 Pod?
- A) 副本數與節點數匹配的 Deployment
- B) 帶有 nodeSelector 的 ReplicaSet
- C) DaemonSet ✓
- D) StatefulSet
解析:DaemonSet 自動在每個節點上部署一個 Pod,並監視叢集成員——當新節點加入時,DaemonSet 控制器立即在其上建立 Pod。
Q3: 一個 Pod 處於 'Pending' 狀態。最可能的原因是什麼?
- A) 容器應用程式崩潰
- B) 沒有節點滿足排程需求 ✓
- C) 存活探測失敗
- D) 容器映像已損壞
解析:Pending 表示 Pod 已被接受但尚未啟動。最常見的原因:節點上 CPU/記憶體不足、不滿足節點親和性/Taint、或 PVC 未綁定。檢查 kubectl describe pod 事件。