一.系統環境
伺服器版本 | 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.