Chuyển đến nội dung chính

第2課:Pod、工作負載與控制器

Pod 生命週期。Deployment、ReplicaSet、StatefulSet、DaemonSet、 Job、CronJob。標籤、選擇器、註解。

Kubernetes 工作負載控制器 — Deployment、StatefulSet、DaemonSet、Job

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 事件。