Kubernetes(k8s)控制器(四):ReplicaSet

2023-02-10 06:00:30

一.系統環境

伺服器版本 docker軟體版本 Kubernetes(k8s)叢集版本 CPU架構
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

Kubernetes叢集架構:k8scloude1作為master節點,k8scloude2,k8scloude3作為worker節點

伺服器 作業系統版本 CPU架構 程序 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master節點
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker節點
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker節點

二.前言

使用ReplicaSet的前提是已經有一套可以正常執行的Kubernetes叢集,關於Kubernetes(k8s)叢集的安裝部署,可以檢視部落格《Centos7 安裝部署Kubernetes(k8s)叢集》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.ReplicaSet概覽

ReplicaSet 的目的是維護一組在任何時候都處於執行狀態的 Pod 副本的穩定集合。 因此,它通常用來保證給定數量的、完全相同的 Pod 的可用性。

ReplicaSet與ReplicationController控制器類似,都是用來維持pod副本數,關於ReplicationController的詳細內容,請檢視部落格《Kubernetes(k8s)控制器(三):ReplicationController》。

ReplicaSet一般作為deployment控制器的底層控制器。關於deployment控制器的詳細內容,請檢視部落格《Kubernetes(k8s)控制器(一):deployment》。

四.ReplicaSet工作原理

ReplicaSet 是通過一組欄位來定義的,包括一個用來識別可獲得的 Pod 的集合的選擇算符、一個用來標明應該維護的副本個數的數值、一個用來指定應該建立新 Pod 以滿足副本個數條件時要使用的 Pod 模板等等。 每個 ReplicaSet 都通過根據需要建立和刪除 Pod 以使得副本個數達到期望值, 進而實現其存在價值。當 ReplicaSet 需要建立新的 Pod 時,會使用所提供的 Pod 模板。

ReplicaSet 通過 Pod 上的 metadata.ownerReferences 欄位連線到附屬 Pod,該欄位給出當前物件的屬主資源。 ReplicaSet 所獲得的 Pod 都在其 ownerReferences 欄位中包含了屬主 ReplicaSet 的標識資訊。正是通過這一連線,ReplicaSet 知道它所維護的 Pod 集合的狀態, 並據此計劃其操作行為。

ReplicaSet 使用其選擇算符來辨識要獲得的 Pod 集合。如果某個 Pod 沒有 OwnerReference 或者其 OwnerReference 不是一個控制器, 且其匹配到某 ReplicaSet 的選擇算符,則該 Pod 立即被此 ReplicaSet 獲得。

五.ReplicaSet使用場景

ReplicaSet 確保任何時間都有指定數量的 Pod 副本在執行。 然而,Deployment 是一個更高階的概念,它管理 ReplicaSet,並向 Pod 提供宣告式的更新以及許多其他有用的功能。 因此,建議使用 Deployment 而不是直接使用 ReplicaSet, 除非你需要自定義更新業務流程或根本不需要更新。這意味著,你可能永遠不需要操作 ReplicaSet 物件:而是使用 Deployment,並在 spec 部分定義你的應用。

六.建立ReplicaSet

設定replicaset,replicas: 3 指定pod副本數為3個

[root@k8scloude1 daemonset]# vim ReplicaSet.yaml

[root@k8scloude1 daemonset]# cat ReplicaSet.yaml 
apiVersion: apps/v1 
kind: ReplicaSet 
metadata: 
  name: rs 
  labels: 
    app: guestbook 
spec: 
  replicas: 3 
  selector: 
    matchLabels: 
      tier: frontend 
  template: 
    metadata: 
      labels: 
        app: guestbook 
        tier: frontend 
    spec: 
      terminationGracePeriodSeconds: 0
      containers: 
      - name: nginx 
        imagePullPolicy: IfNotPresent
        image: nginx

建立replicaset

[root@k8scloude1 daemonset]# kubectl apply -f ReplicaSet.yaml 
replicaset.apps/rs created

[root@k8scloude1 daemonset]# kubectl get rs
NAME   DESIRED   CURRENT   READY   AGE
rs     3         3         3       25s

現在有3個pod

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-d58dk   1/1     Running   0          34s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running   0          34s   10.244.251.231   k8scloude3   <none>           <none>
rs-v676w   1/1     Running   0          34s   10.244.112.175   k8scloude2   <none>           <none>

七.擴充套件replicaset副本數

通過kubectl scale rs 擴充套件replicaset副本數,--replicas=5 設定pod副本數為5

[root@k8scloude1 daemonset]# kubectl scale rs rs --replicas=5
replicaset.apps/rs scaled

現在就有5個pod了

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS              RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-554fh   0/1     ContainerCreating   0          2s    <none>           k8scloude2   <none>           <none>
rs-d58dk   1/1     Running             0          93s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running             0          93s   10.244.251.231   k8scloude3   <none>           <none>
rs-ltmpv   0/1     ContainerCreating   0          2s    <none>           k8scloude3   <none>           <none>
rs-v676w   1/1     Running             0          93s   10.244.112.175   k8scloude2   <none>           <none>

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-554fh   1/1     Running   0          3s    10.244.112.174   k8scloude2   <none>           <none>
rs-d58dk   1/1     Running   0          94s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running   0          94s   10.244.251.231   k8scloude3   <none>           <none>
rs-ltmpv   1/1     Running   0          3s    10.244.251.232   k8scloude3   <none>           <none>
rs-v676w   1/1     Running   0          94s   10.244.112.175   k8scloude2   <none>           <none>

刪除replicaset

[root@k8scloude1 daemonset]# kubectl delete -f ReplicaSet.yaml 
replicaset.apps "rs" deleted

[root@k8scloude1 daemonset]# kubectl get rs
No resources found in daemonset namespace.

[root@k8scloude1 daemonset]# kubectl get pod -o wide
No resources found in daemonset namespace.