Kubernetes ReplicaSet:Overview
什麼是 Kubernetes ReplicaSet?
先來個官網解說
A ReplicaSet’s purpose is to maintain a stable set of replica Pods running at any given time. As such, it is often used to guarantee the availability of a specified number of identical Pods.
根據上述描述,Replica Set主要的作用是確保始終都有一定數量的相同Pod可用,保證服務的高可用性。
- Kubernetes RS是Kubernetes中的一種控制器,主要用於管理Pod的複製和伸縮,確保Pod的數量。RS具有以下幾種特性
- 自動管理pod的副本數量:確保指定數量的Pod跟使用者所期望的一致(desired status),如果發生故障或需要擴展,它會自動創建或刪除Pod。
- 確保Pod的健康狀態:如果發生故障會對失敗的Pod進行重新調度
- 創建Pod的Template:當需要新的Pod時會根據定義的Pod Template創建
為什麼需要Replicaset?
在Kubernetes集群中,Pod的管理對於系統的可靠性和彈性至關重要。如果一個Pod發生故障,RS會自動創建一個新的Pod來代替它,確保服務繼續運行。同時,當服務需要擴展以滿足流量增加時,Kubernetes RS也可以自動創建額外的Pod。因此RS解決了以下問題:
- 確保服務的高可用性和可靠性:RS可以自動維護一定數量的Pod,確保服務在Pod失敗時仍然可以正常運行。
- 方便服務的擴展:使用RS可以根據需求調整Pod的副本數量,實現服務的快速擴展。
- 簡化服務管理:RS可以自動調整Pod的數量,減少手動管理的工作量。
Kubernetes Replicaset是如何運作的?
定義RS,指定所需的Pod副本數量和Pod Template,創建後,ReplicaSet使用定義好的Pod Template創建Pod,並開始監控每個Pod的狀態以及數量是否與定義的一致(desired status),如果低於指定副本數則會創建Pod,高於指定副本數則會刪除Pod,當Pod被意外刪除時會創建新的Pod來做替代。
什麼時候使用Replicaset?
使用RS通常適用於以下情況:
- 需要確保一定數量的Pod正在運行,以保持服務的可用性和可靠性。
- 需要能夠自動擴展和縮小Pod數量,以應對流量變化和其他需求。
- 希望能夠自動替換發生故障的Pod,以確保服務的連續運行。
- 需要管理一個服務的多個Pod,並且希望使用Kubernetes提供的自動化功能,例如調度、網路配置和負載平衡。
Kubernetes Replicaset有哪些特性?
高可用性:RS的目的是維護一個穩定的Pod副本集,確保始終有一定數量的相同Pod可用,從而保證服務的高可用性。
健康檢查和自動恢復:ReplicaSet可以通過定期檢查Pod副本的健康狀態來確保服務始終運行。當Pod故障或被刪除時,ReplicaSet會自動創建新的Pod來代替故障的Pod,確保服務的可用性及穩定性。
自動擴縮:RS會監視Pod副本數量,並自動創建或刪除Pod副本以確保Pod副本數量達到指定的數量。使服務可以自動擴展和縮放,以應對不同的負載。
版本控制:RS允許在不中斷現有服務的情況下部署新版本。在部署新版本之前先創建一些新Pod副本,然後再刪除舊Pod副本,這樣服務就可以實現無間斷的升級。
動態標籤選擇:RS可以使用標籤選擇器來選擇Pod副本。可以基於Pod的標籤、名稱和其他屬性進行靈活的選擇。
動態更新:RS支持動態更新,可以在運行時修改Pod的設定,從而實現靈活的應用程序管理。
如何使用Replicaset?
宣告式(Declarative)
- 透過創建一個包含Pod Template的yaml檔,定義Pod的Container和其他元素,例如服務的Image和Configure。然後,可以在yaml檔中指定要創建的Pod數量和其他屬性,例如採用哪種調度策略和如何處理故障。
apiVersion: apps/v1 # 定義api版本
kind: ReplicaSet # 定義資源類型
metadata: # 定義元數據
name: frontend
labels:
app: guestbook
tier: frontend
spec: # 定義Pod的規格
replicas: 3 # 定義副本數量
selector:
matchLabels:
tier: frontend # 選擇Pod的Label
template:
metadata:
labels:
tier: frontend # 要創建的Pod的Label
spec: # 容器規格
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
在 ReplicaSet 中,
.spec.template.metadata.labels
的值必須與spec.selector.matchLabels
值相匹配,否則該配置會被 API 拒絕。
命令式(Imperative)
- 創建RS
kubectl create replicaset <replicaset-name> --image=<image-name> --replicas=<number-of-replicas>
- 查看RS
kubectl describe replicaset <replicaset-name>
kubectl get replicaset <replicaset-name>
- 刪除RS
kubectl delete replicaset <replicaset-name>
- 擴縮RS
kubectl scale replicaset <replicaset-name> --replicas=<number-of-replicas>
- 暫停RS更新
kubectl rollout pause replicaset <replicaset-name>
- 恢復RS更新
kubectl rollout resume replicaset <replicaset-name>
- 查看RS更新歷史
kubectl rollout history replicaset <replicaset-name>
- 回滾更新
kubectl rollout undo replicaset <replicaset-name>