Kubernetes ReplicaSet - 確保 Pod 數量及存活的守護者

Pod 是稍縱即逝的,如果 Node 掛了,Pod 也會跟著消失。ReplicaSet (RS) 的主要職責就是維持一組 Pod 的副本 (Replicas) 數量穩定。

為什麼需要 ReplicaSet?

ReplicaSet 確保在任何時間點,都有指定數量的 Pod 副本在運行。

  • 如果 Pod 少了(例如 Crash 或被刪除),RS 會自動建立新的補齊。
  • 如果 Pod 多了(例如手動多開),RS 會自動刪除多餘的。

這就是 K8s 自我修復 (Self-healing) 的基礎。

定義 ReplicaSet

建立 nginx-rs.yaml

# nginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3 # 我們希望有 3 個副本
  selector: # 關鍵:Label Selector
    matchLabels:
      app: nginx-app
  template: # Pod 模板 (跟 Pod YAML 一樣)
    metadata:
      labels:
        app: nginx-app # 必須跟上面的 matchLabels 對應
    spec:
      containers:
        - name: nginx
          image: nginx:latest

關鍵欄位

  • replicas: 期望的副本數量。
  • selector: ReplicaSet 透過 Label 認領它的 Pod。只要標籤是 app: nginx-app 的 Pod,都歸它管。
  • template: 如果現有 Pod 數量不足,RS 會使用這個模板來建立新的 Pod。

操作 ReplicaSet

建立並觀察

kubectl apply -f nginx-rs.yaml

查看 RS 與 Pods:

kubectl get rs
kubectl get pods --show-labels

你會發現它自動建立了 3 個 Pod,名稱會是 nginx-rs-xxxxx 隨機後綴。

測試自我修復能力

嘗試刪除其中一個 Pod:

kubectl delete pod nginx-rs-xxxxx

即刻再次執行 kubectl get pods,你會發現舊的正在 Terminating,但一個新的已經開始 ContainerCreating 了!

擴展與縮減 (Scaling)

你可以透過指令動態調整副本數:

kubectl scale rs nginx-rs --replicas=5

或者直接修改 YAML 檔案中的 replicas: 5 然後再次 kubectl apply -f nginx-rs.yaml

刪除 ReplicaSet 與孤兒 Pod (Orphan Pods)

當我們想刪除 ReplicaSet 時,預設行為是 連同它底下的 Pod 一起刪除

kubectl delete rs nginx-rs
# 結果:RS 被刪除,所有的 Pod 也會被 Terminating

什麼是孤兒 Pod?

如果你只想刪除 ReplicaSet (控制器),但希望 保留正在運行的 Pod,可以使用 --cascade=orphan 參數。 這些被留下來、沒有人管理的 Pod 就稱為 孤兒 Pod (Orphan Pods)

kubectl delete rs nginx-rs --cascade=orphan
# 結果:RS 被刪除,但 Pod 仍然在運行

這在某些維運場景(如轉移管理權)會很有用。

結論

雖然 ReplicaSet 解決了 Pod 的可用性問題,但在實務上,我們 幾乎不會直接使用 ReplicaSet。 為什麼?因為 ReplicaSet 不支援 滾動更新 (Rolling Update)(例如更換 Image 版本)。

為了解決應用程式版本更新的問題,我們需要 Deployment,它管理 ReplicaSet,而 ReplicaSet 管理 Pod。