ReplicaSet
目錄
文章目錄
- 目錄
- 實驗環境
- 實驗軟件(無)
- 1、ReplicaSet 控制器
- 2、控制器
- 3、ReplicaSet
- 4、Replication Controller(可以不看)
- 關于我
- 最后
實驗環境
實驗環境: 1、win10,vmwrokstation虛機; 2、k8s集群:3臺centos7.6 1810虛機,1個master節點,2個node節點k8s version:v1.22.2containerd://1.5.5實驗軟件(無)
1、ReplicaSet 控制器
前面我們一起學習了 Pod 的原理和一些基本使用,但是在實際使用的時候并不會直接使用 Pod,而是會使用各種控制器來滿足我們的需求,Kubernetes 中運行了一系列控制器來確保集群的當前狀態與期望狀態保持一致,它們就是 Kubernetes 的大腦/心臟。例如,ReplicaSet 控制器負責維護集群中運行的 Pod 數量;Node 控制器負責監控節點的狀態,并在節點出現故障時及時做出響應。總而言之,在 Kubernetes 中,每個控制器只負責某種類型的特定資源。
2、控制器
注意理解下關于控制器的描述:
Kubernetes 控制器會監聽資源的 創建/更新/刪除 事件,并觸發 Reconcile 調諧函數作為響應,整個調整過程被稱作 “Reconcile Loop”(調諧循環) 或者 “Sync Loop”(同步循環)。**Reconcile 是一個使用資源對象的命名空間和資源對象名稱來調用的函數,使得資源對象的實際狀態與 資源清單中定義的狀態保持一致。調用完成后,Reconcile 會將資源對象的狀態更新為當前實際狀態。**我們可以用下面的一段偽代碼來表示這個過程:
for {desired := getDesiredState() // 期望的狀態current := getCurrentState() // 當前實際狀態if current == desired { // 如果狀態一致則什么都不做// nothing to do} else { // 如果狀態不一致則調整編排,到一致為止// change current to desired status} }這個編排模型就是 Kubernetes 項目中的一個通用編排模式,即:控制循環(control loop)。
3、ReplicaSet
假如我們現在有一個 Pod 正在提供線上的服務,我們來想想一下我們可能會遇到的一些場景:
- 某次運營活動非常成功,網站訪問量突然暴增
- 運行當前 Pod 的節點發生故障了,Pod 不能正常提供服務了
第一種情況,可能比較好應對,活動之前我們可以大概計算下會有多大的訪問量,提前多啟動幾個 Pod 副本,活動結束后再把多余的 Pod 殺掉,雖然有點麻煩,但是還是能夠應對這種情況的。
第二種情況,可能某天夜里收到大量報警說服務掛了,然后起來打開電腦在另外的節點上重新啟動一個新的 Pod,問題可以解決。
但是如果我們都人工的去解決遇到的這些問題,似乎又回到了以前刀耕火種的時代了是吧?如果有一種工具能夠來幫助我們自動管理 Pod 就好了,Pod 掛了自動幫我在合適的節點上重新啟動一個 Pod,這樣是不是遇到上面的問題我們都不需要手動去解決了。
而 ReplicaSet 這種資源對象就可以來幫助我們實現這個功能,ReplicaSet(RS) 的主要作用就是維持一組 Pod 副本的運行,保證一定數量的 Pod 在集群中正常運行,ReplicaSet 控制器會持續監聽它所控制的這些 Pod 的運行狀態,在 Pod 發送故障數量減少或者增加時會觸發調諧過程,始終保持副本數量一定。
??實驗測試:
實驗日期:2021年11月8日21:25:39
和 Pod 一樣我們仍然還是通過 YAML 文件來描述我們的 ReplicaSet 資源對象,如下 YAML 文件是一個常見的 ReplicaSet 定義:
[root@master1 ~]#vim nginx-rs.yaml
# nginx-rs.yaml apiVersion: apps/v1 kind: ReplicaSet metadata:name: nginx-rsnamespace: default spec:replicas: 3 # 期望的 Pod 副本數量,默認值為1selector: # Label Selector,必須匹配被管理的Pod的標簽matchLabels:app: nginxtemplate: # Pod 模板metadata: #Pod名稱會根據rs的name自動生成labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80上面的 YAML 文件結構和我們之前定義的 Pod 看上去沒太大兩樣,有常見的 apiVersion、kind、metadata,在 spec 下面描述 ReplicaSet 的基本信息,其中包含3個重要內容:
- replias:表示期望的 Pod 的副本數量
- selector:Label Selector,用來匹配要控制的 Pod 標簽,需要和下面的 Pod 模板中的標簽一致
- template:Pod 模板,實際上就是以前我們定義的 Pod 內容,相當于把一個 Pod 的描述以模板的形式嵌入到了 ReplicaSet 中來。
Pod 模板:
Pod 模板這個概念非常重要,因為后面我們講解到的大多數控制器,都會使用 Pod 模板來統一定義它所要管理的 Pod。更有意思的是,我們還會看到其他類型的對象模板,比如Volume 的模板等。
上面就是我們定義的一個普通的 ReplicaSet 資源清單文件,ReplicaSet 控制器會通過定義的 Label Selector 標簽去查找集群中的 Pod 對象:
我們直接來創建上面的資源對象:
[root@master1 ~]#kubectl apply -f nginx-rs.yaml replicaset.apps/nginx-rs created [root@master1 ~]#kubectl get rs NAME DESIRED CURRENT READY AGE nginx-rs 3 3 3 46s [root@master1 ~]#通過查看 RS 可以看到當前資源對象的描述信息,包括DESIRED、CURRENT、READY的狀態值,創建完成后,可以利用如下命令查看下 Pod 列表:
[root@master1 ~]#kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-rs-7btxg 1/1 Running 0 82s nginx-rs-gfhzx 1/1 Running 0 82s nginx-rs-v8rrb 1/1 Running 0 82s [root@master1 ~]#可以看到現在有 3 個 Pod,這 3 個 Pod 就是我們在 RS 中聲明的 3 個副本,比如我們刪除其中一個 Pod:
[root@master1 ~]#kubectl delete pod nginx-rs-v8rrb pod "nginx-rs-v8rrb" deleted然后再查看 Pod 列表:
[root@master1 ~]#kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-rs-7btxg 1/1 Running 0 2m28s nginx-rs-gfhzx 1/1 Running 0 2m28s nginx-rs-xxplf 1/1 Running 0 28s [root@master1 ~]#可以看到又重新出現了一個 Pod,這個就是上面我們所說的 ReplicaSet 控制器為我們做的工作,我們在 YAML 文件中聲明了 3 個副本,然后現在我們刪除了一個副本,就變成了兩個,這個時候 ReplicaSet 控制器監控到控制的 Pod 數量和期望的 3 不一致,所以就需要啟動一個新的 Pod 來保持 3 個副本,這個過程上面我們說了就是調諧的過程。同樣可以查看 RS 的描述信息來查看到相關的事件信息:
[root@master1 ~]#kubectl describe rs nginx-rs Name: nginx-rs Namespace: default Selector: app=nginx Labels: <none> Annotations: <none> Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template:Labels: app=nginxContainers:nginx:Image: nginxPort: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none> Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 3m31s replicaset-controller Created pod: nginx-rs-v8rrbNormal SuccessfulCreate 3m31s replicaset-controller Created pod: nginx-rs-7btxgNormal SuccessfulCreate 3m31s replicaset-controller Created pod: nginx-rs-gfhzxNormal SuccessfulCreate 91s replicaset-controller Created pod: nginx-rs-xxplf [root@master1 ~]#可以發現最開始通過 ReplicaSet 控制器創建了 3 個 Pod,后面我們刪除了 Pod 后, ReplicaSet 控制器又為我們創建了一個 Pod,和上面我們的描述是一致的。如果這個時候我們把 RS 資源對象的 Pod 副本更改為 2 spec.replicas=2,這個時候我們來更新下資源對象:
[root@master1 ~]#vim nginx-rs.yaml …… spec:8 replicas: 2 #修改pod副本數為29 selector:10 matchLabels:11 app: nginx …… [root@master1 ~]#kubectl apply -f nginx-rs.yaml replicaset.apps/nginx-rs configured [root@master1 ~]#[root@master1 ~]#kubectl get rs NAME DESIRED CURRENT READY AGE nginx-rs 2 2 2 5m38s [root@master1 ~]#kubectl describe rs nginx-rs Name: nginx-rs Namespace: default Selector: app=nginx Labels: <none> Annotations: <none> Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template:Labels: app=nginxContainers:nginx:Image: nginxPort: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none> Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 5m43s replicaset-controller Created pod: nginx-rs-v8rrbNormal SuccessfulCreate 5m43s replicaset-controller Created pod: nginx-rs-7btxgNormal SuccessfulCreate 5m43s replicaset-controller Created pod: nginx-rs-gfhzxNormal SuccessfulCreate 3m43s replicaset-controller Created pod: nginx-rs-xxplfNormal SuccessfulDelete 19s replicaset-controller Deleted pod: nginx-rs-xxplf [root@master1 ~]#可以看到 Replicaset 控制器在發現我們的資源聲明中副本數變更為 2 后,就主動去刪除了一個 Pod,這樣副本數就和期望的始終保持一致了:
[root@master1 ~]#kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-rs-7btxg 1/1 Running 0 6m12s nginx-rs-gfhzx 1/1 Running 0 6m12s [root@master1 ~]#我們可以隨便查看一個 Pod 的描述信息可以看到這個 Pod 的所屬控制器信息:
[root@master1 ~]#kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-rs-7btxg 1/1 Running 0 6m50s nginx-rs-gfhzx 1/1 Running 0 6m50s [root@master1 ~]#kubectl describe pod nginx-rs-gfhzx Name: nginx-rs-gfhzx Namespace: default Priority: 0 Node: node2/172.29.9.53 Start Time: Mon, 08 Nov 2021 21:30:03 +0800 Labels: app=nginx Annotations: <none> Status: Running IP: 10.244.2.13 IPs:IP: 10.244.2.13 Controlled By: ReplicaSet/nginx-rs #從這里可以看到,這個pod是被ReplicaSet/nginx-rs控制; …… [root@master1 ~]#注意:
**另外被 ReplicaSet 持有的 Pod 有一個 metadata.ownerReferences 指針指向當前的 ReplicaSet,表示當前 Pod 的所有者,這個引用主要會被集群中的垃圾收集器使用以清理失去所有者的 Pod 對象。**這個 ownerReferences 和數據庫中的外鍵是不是非常類似。可以通過將 Pod 資源描述信息導出查看:
[root@master1 ~]#kubectl get po -l app=nginx NAME READY STATUS RESTARTS AGE nginx-rs-7btxg 1/1 Running 0 8m48s nginx-rs-gfhzx 1/1 Running 0 8m48s[root@master1 ~]#kubectl edit pod nginx-rs-gfhzx 或者 [root@master1 ~]#kubectl get po nginx-rs-gfhzx -oyamlownerReferences:- apiVersion: apps/v1blockOwnerDeletion: truecontroller: truekind: ReplicaSetname: nginx-rsuid: e1b9d63b-6be5-4a9f-b565-1d8eea92c727我們可以看到 Pod 中有一個 metadata.ownerReferences 的字段指向了 ReplicaSet 資源對象。如果要徹底刪除 Pod,我們就只能刪除 RS 對象:
[root@master1 ~]#kubectl delete rs nginx-rs replicaset.apps "nginx-rs" deleted [root@master1 ~]#kubectl get rs,pod No resources found in default namespace. [root@master1 ~]#或者:執行 kubectl delete -f nginx-rs.yaml或者:你如果想徹底刪除pod,就需要把rs給刪除掉或者把rs里的副本數改為0;這就是 ReplicaSet 對象的基本使用。
實驗到此結束。
4、Replication Controller(可以不看)
Replication Controller 簡稱 RC,實際上 RC 和 RS 的功能幾乎一致,RS 算是對 RC 的改進,目前唯一的一個區別就是 RC 只支持基于等式的 selector(env=dev或environment!=qa),但 RS 還支持基于集合的 selector(version in (v1.0, v2.0)),這對復雜的運維管理就非常方便了。
比如上面資源對象如果我們要使用 RC 的話,對應的 selector 是這樣的:
selector:app: nginxRC 只支持單個 Label 的等式,而 RS 中的 Label Selector 支持 matchLabels 和 matchExpressions 兩種形式:
selector:matchLabels:app: nginx--- selector:matchExpressions: # 該選擇器要求 Pod 包含名為 app 的標簽- key: appoperator: Invalues: # 并且標簽的值必須是 nginx- nginx總的來說 RS 是新一代的 RC,所以以后我們不使用 RC,直接使用 RS 即可,他們的功能都是一致的,但是實際上在實際使用中我們也不會直接使用 RS,而是使用更上層的類似于 Deployment 這樣的資源對象。
注意,一般,還是matchLabels用的多一些。
關于我
我的博客主旨:我希望每一個人拿著我的博客都可以做出實驗現象,先把實驗做出來,然后再結合理論知識更深層次去理解技術點,這樣學習起來才有樂趣和動力。并且,我的博客內容步驟是很完整的,也分享源碼和實驗用到的軟件,希望能和大家一起共同進步!
各位小伙伴在實際操作過程中如有什么疑問,可隨時聯系本人免費幫您解決問題:
個人微信二維碼:x2675263825 (舍得), qq:2675263825。
個人博客地址:www.onlyonexl.cn
個人微信公眾號:云原生架構師實戰
個人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
最后
? 好了,關于ReplicaSet實驗就到這里了,感謝大家閱讀,最后貼上我女神的photo,祝大家生活快樂,每天都過的有意義哦,我們下期見!
總結
以上是生活随笔為你收集整理的ReplicaSet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言求π的近似值
- 下一篇: 基于结构光扫描的生物芯片快速彩色质量监管