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。