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

第6課:容器編排模式

排程、自動擴展(HPA、VPA、Cluster Autoscaler)、資源請求 與限制、Namespace、多租戶與 Kubernetes 升級策略。

Kubernetes 排程管線與自動擴展(HPA、VPA、Cluster Autoscaler)

1. Kubernetes 排程

當 Pod 被建立時,kube-scheduler 透過 2 個步驟選擇合適的節點:

Scheduling Pipeline:
  New Pod
    │
    ▼
  1. FILTERING: 排除不符條件的節點
     - CPU/Memory 不足
     - Taint 與 Toleration 不匹配
     - Node Affinity 不匹配
     │
    ▼
  2. SCORING: 為剩餘節點評分
     - 資源平衡
     - Affinity 偏好
     │
    ▼
  Bind Pod → Highest score Node
機制目的範例
NodeSelector將 Pod 排程到有特定標籤的節點disktype: ssd
Affinity/Anti-affinity偏好/必需的節點規則偏好 zone-a,避免與另一個 Pod 在同一節點
Taints & Tolerations排斥 Pod 除非 Pod 有 Toleration節點專用於 GPU 工作負載
Resource requests排程所需的最低 CPU/Memoryrequests.cpu: 500m

考試重點: Taint 套用在 Node 上(排斥 Pod)。Toleration 套用在 Pod 上(接受 Taint)。Taint 效果:NoSchedule(不排程新 Pod)、PreferNoSchedule(優先不排程)、NoExecute(驅逐正在執行的 Pod)。

2. 資源 Requests 與 Limits

設定影響超出時
requests.cpu排程(scheduler 用來選擇節點)被節流(不會被終止)
limits.cpuCgroups CPU 配額CPU 被節流
requests.memory排程超出 limit 時 OOM Kill
limits.memoryCgroups 記憶體限制容器被 OOM Kill
QoS Classes:
  Guaranteed: requests == limits (best quality, last to be evicted)
  Burstable:  requests < limits (middle)
  BestEffort: no requests, no limits (first to be evicted)

3. 自動擴展

擴展器擴展什麼指標
HPA(Horizontal Pod Autoscaler)Pod 副本數量CPU%、Memory%、自訂指標
VPA(Vertical Pod Autoscaler)Pod 的 CPU/Memory requests實際使用歷史記錄
Cluster Autoscaler叢集中的節點數量Pending Pod(無法排程)
KEDA副本數量(可到 0)事件驅動(佇列深度、Kafka)
HPA integration:
  metrics-server → kubelet → Node/Pod metrics
       ↓
  HPA controller (checks every 15s)
       ↓
  Scale up: replicas++  (traffic spike)
  Scale down: replicas-- (traffic drops, 5 min cooldown)

考試重點: HPA 需要 metrics-server 才能運作。VPA 和 HPA 同時管理一個 Deployment 可能產生衝突——不建議同時用於同一資源(除非 KEDA 搭配多維度)。

4. Namespace 與多租戶

Namespace 提供虛擬叢集隔離:範圍包含 RBAC、ResourceQuota、NetworkPolicy 和 DNS 解析。

Namespace用途備註
default未指定 namespace 的物件用於開發,不建議用於生產
kube-systemKubernetes 系統元件CoreDNS、kube-proxy、metrics-server
kube-public公開,所有人可讀叢集資訊 ConfigMap
kube-node-lease節點心跳租約Kubelet 心跳效能

5. 速查表

考試問題答案
根據 CPU 擴展 Pod 數量?HPA
擴展叢集中的節點數量?Cluster Autoscaler
節點專用於 GPU,用什麼?Taint + Pod Toleration
容器被 OOM Kill,原因?超出 limits.memory
哪個 QoS 等級最先被驅逐?BestEffort

6. 練習題

Q1: 一個節點被加上 Taint key=gpu:NoSchedule。哪些 Pod 可以排程到此節點?

  • A) 叢集中的任何 Pod
  • B) 具有匹配 Toleration 的 Pod ✓
  • C) 僅 kube-system namespace 中的 Pod
  • D) 僅叢集管理員建立的 Pod

解析:NoSchedule taint 防止任何新 Pod 排程到該節點,除非 Pod 指定了匹配的 toleration。現有 Pod 不會被驅逐(使用 NoExecute 才會)。

Q2: 應用程式的 Pod 在流量高峰期持續被 OOM-Kill。最合適的解決方案是什麼?

  • A) 增加 Pod CPU requests
  • B) 設定 HPA 根據記憶體使用量擴展 ✓
  • C) 將應用移到新的 namespace
  • D) 使用 StatefulSet 取代 Deployment

解析:OOM Kill 意味著記憶體需求超過限制。HPA 水平擴展(更多 Pod 副本)分散負載,減少每個 Pod 的記憶體壓力。或者增加記憶體限制或使用 VPA。

Q3: 哪個 Kubernetes 元件提供 HPA 用於擴展決策的 CPU 和記憶體指標?

  • A) kube-proxy
  • B) kube-scheduler
  • C) metrics-server ✓
  • D) etcd

解析:metrics-server 是可選的叢集附加元件,從 kubelet 收集資源指標(CPU、記憶體)。HPA 控制器查詢 metrics-server 暴露的 metrics API 來做出擴展決策。