天天看點

K8s之ReplicaSet學習筆記

replicaset

1.Replicaset概念

Kubernetes中的ReplicaSet主要的作用是維持一組

Pod

副本的運作,它的主要作用就是保證一定數量的 Pod 能夠在叢集中正常運作,它會持續監聽這些 Pod 的運作狀态,在 Pod 發生故障時重新開機pod,pod數量減少時重新運作新的 Pod 副本,是以,它通常被用來保證特定數量相同的Pods的可用性。

2.replicaset怎麼工作

ReplicaSet由字段定義,包括一個選擇器,該選擇器指定如何找到它所管理的Pod、維護多少個pod,以及pod的模闆。ReplicaSet通過建立和删除Pod來滿足期望的pod數量。當ReplicaSet需要建立新的Pod時,它将使用其Pod模闆。ReplicaSet通過Pods的

metadata.ownerReferences

字段連結到其Pod,該字段指定目前對象所擁有的資源。由ReplicaSet擷取的所有Pod在其ownerReferences字段中都有其自己的ReplicaSet的辨別資訊。通過此連結,ReplicaSet可以知道它正在維護的Pod的狀态,并據此計劃。

ReplicaSet通過使用其選擇器辨別要擷取的新Pod。如果存在沒有OwnerReference的Pod或OwnerReference不是

控制器

,并且它與ReplicaSet的選擇器比對,它将由所述的ReplicaSet立即擷取

3.什麼時候使用replicaset

replicaSet確定在任何給定時間都運作指定數量的Pod副本。但是,Deployment是一個進階概念,用于管理副本集,并提供對Pod的聲明性更新以及許多其他有用的功能。是以,除非你需要自定義更新編排或根本不需要更新,否則我們使用Deployment而不是直接使用replicaset。這實際上意味着你可能永遠不需要操縱ReplicaSet對象:改用Deployment,然後在spec部分中定義你的應用程式。

例子:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tire: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: guestbook
      tire: frontend
  template:
    metadata:
      labels:
         app: guestbook
         tire: frontend
    spec:
      containers:
      - name: php-redis
        image: yecc/gcr.io-google_samples-gb-frontend:v3           

編寫replicaset資源清單檔案

與所有其他 Kubernetes API對象一樣,ReplicaSet需要apiVersion、kind、和metadata,ReplicaSet 也需要

.spec

部分。對于replicaset副本集來說,kind隻能是replicaset,在kubernetes1.9+之後,apiversion預設的版本是apps/v1,apps/v1beta2已經被廢棄了。

Pod template

.spec.template是一個

Pod模闆

,還需要在其上放置标簽。在我們的replicaset.yaml示例中,我們有一個标簽:tier: frontend。注意不要與其他控制器的選擇器重疊。對于

重新開機政策

,.spec.template.spec.restartPolicy 唯一允許的取值是 Always,這也是預設值.

pod selector

.spec.selector字段是

标簽選擇器

。可以選擇它所比對的擁有相同标簽的pod。在我們的 replicaset.yaml示例中,選擇器為:

matchLabels:

tier: frontend

在ReplicaSet中,.spec.template.metadata.labels必須比對spec.selector,否則将被API拒絕。

注意:對于指定相同.spec.selector但不同的.spec.template.metadata.labels和.spec.template.spec字段的2個replicaset,每個replicaset都會忽略另一個replicaset建立的Pod。

Replicas

通過設定 .spec.replicas 您可以指定要同時運作多少個 Pod。 在任何時間運作的 Pod 數量可能高于或低于 .spec.replicas 指定的數量,例如在副本剛剛被增加或減少後、或者 Pod 正在被優雅地關閉、以及替換提前開始。

如果您沒有指定 .spec.replicas, 那麼預設值為 1

删除

如果我們在 Kubernetes 叢集中删除一個 ReplicaSet 持有的 Pod,那麼控制器會重新同步 ReplicaSet 的狀态并啟動一個新的 Pod,但是如果删除叢集中的 ReplicaSet 所有相關的 Pod 也都會被删除:

kubectl delete rs example

繼續閱讀