什麼是 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具有以下幾種特性
    1. 自動管理pod的副本數量:確保指定數量的Pod跟使用者所期望的一致(desired status),如果發生故障或需要擴展,它會自動創建或刪除Pod。
    2. 確保Pod的健康狀態:如果發生故障會對失敗的Pod進行重新調度
    3. 創建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通常適用於以下情況:

  1. 需要確保一定數量的Pod正在運行,以保持服務的可用性和可靠性。
  2. 需要能夠自動擴展和縮小Pod數量,以應對流量變化和其他需求。
  3. 希望能夠自動替換發生故障的Pod,以確保服務的連續運行。
  4. 需要管理一個服務的多個Pod,並且希望使用Kubernetes提供的自動化功能,例如調度、網路配置和負載平衡。

Kubernetes Replicaset有哪些特性?

  1. 高可用性:RS的目的是維護一個穩定的Pod副本集,確保始終有一定數量的相同Pod可用,從而保證服務的高可用性。

  2. 健康檢查和自動恢復:ReplicaSet可以通過定期檢查Pod副本的健康狀態來確保服務始終運行。當Pod故障或被刪除時,ReplicaSet會自動創建新的Pod來代替故障的Pod,確保服務的可用性及穩定性。

  3. 自動擴縮:RS會監視Pod副本數量,並自動創建或刪除Pod副本以確保Pod副本數量達到指定的數量。使服務可以自動擴展和縮放,以應對不同的負載。

  4. 版本控制:RS允許在不中斷現有服務的情況下部署新版本。在部署新版本之前先創建一些新Pod副本,然後再刪除舊Pod副本,這樣服務就可以實現無間斷的升級。

  5. 動態標籤選擇:RS可以使用標籤選擇器來選擇Pod副本。可以基於Pod的標籤、名稱和其他屬性進行靈活的選擇。

  6. 動態更新: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)

  1. 創建RS
kubectl create replicaset <replicaset-name> --image=<image-name> --replicas=<number-of-replicas>
  1. 查看RS
kubectl describe replicaset <replicaset-name>
kubectl get replicaset <replicaset-name>
  1. 刪除RS
kubectl delete replicaset <replicaset-name>
  1. 擴縮RS
kubectl scale replicaset <replicaset-name> --replicas=<number-of-replicas>
  1. 暫停RS更新
kubectl rollout pause replicaset <replicaset-name>
  1. 恢復RS更新
kubectl rollout resume replicaset <replicaset-name>
  1. 查看RS更新歷史
kubectl rollout history replicaset <replicaset-name>
  1. 回滾更新
kubectl rollout undo replicaset <replicaset-name>

Reference