ReplicaSet
目錄
文章目錄
- 目錄
- 實(shí)驗(yàn)環(huán)境
- 實(shí)驗(yàn)軟件(無)
- 1、ReplicaSet 控制器
- 2、控制器
- 3、ReplicaSet
- 4、Replication Controller(可以不看)
- 關(guān)于我
- 最后
實(shí)驗(yàn)環(huán)境
實(shí)驗(yàn)環(huán)境: 1、win10,vmwrokstation虛機(jī); 2、k8s集群:3臺(tái)centos7.6 1810虛機(jī),1個(gè)master節(jié)點(diǎn),2個(gè)node節(jié)點(diǎn)k8s version:v1.22.2containerd://1.5.5實(shí)驗(yàn)軟件(無)
1、ReplicaSet 控制器
前面我們一起學(xué)習(xí)了 Pod 的原理和一些基本使用,但是在實(shí)際使用的時(shí)候并不會(huì)直接使用 Pod,而是會(huì)使用各種控制器來滿足我們的需求,Kubernetes 中運(yùn)行了一系列控制器來確保集群的當(dāng)前狀態(tài)與期望狀態(tài)保持一致,它們就是 Kubernetes 的大腦/心臟。例如,ReplicaSet 控制器負(fù)責(zé)維護(hù)集群中運(yùn)行的 Pod 數(shù)量;Node 控制器負(fù)責(zé)監(jiān)控節(jié)點(diǎn)的狀態(tài),并在節(jié)點(diǎn)出現(xiàn)故障時(shí)及時(shí)做出響應(yīng)。總而言之,在 Kubernetes 中,每個(gè)控制器只負(fù)責(zé)某種類型的特定資源。
2、控制器
注意理解下關(guān)于控制器的描述:
Kubernetes 控制器會(huì)監(jiān)聽資源的 創(chuàng)建/更新/刪除 事件,并觸發(fā) Reconcile 調(diào)諧函數(shù)作為響應(yīng),整個(gè)調(diào)整過程被稱作 “Reconcile Loop”(調(diào)諧循環(huán)) 或者 “Sync Loop”(同步循環(huán))。**Reconcile 是一個(gè)使用資源對(duì)象的命名空間和資源對(duì)象名稱來調(diào)用的函數(shù),使得資源對(duì)象的實(shí)際狀態(tài)與 資源清單中定義的狀態(tài)保持一致。調(diào)用完成后,Reconcile 會(huì)將資源對(duì)象的狀態(tài)更新為當(dāng)前實(shí)際狀態(tài)。**我們可以用下面的一段偽代碼來表示這個(gè)過程:
for {desired := getDesiredState() // 期望的狀態(tài)current := getCurrentState() // 當(dāng)前實(shí)際狀態(tài)if current == desired { // 如果狀態(tài)一致則什么都不做// nothing to do} else { // 如果狀態(tài)不一致則調(diào)整編排,到一致為止// change current to desired status} }這個(gè)編排模型就是 Kubernetes 項(xiàng)目中的一個(gè)通用編排模式,即:控制循環(huán)(control loop)。
3、ReplicaSet
假如我們現(xiàn)在有一個(gè) Pod 正在提供線上的服務(wù),我們來想想一下我們可能會(huì)遇到的一些場(chǎng)景:
- 某次運(yùn)營(yíng)活動(dòng)非常成功,網(wǎng)站訪問量突然暴增
- 運(yùn)行當(dāng)前 Pod 的節(jié)點(diǎn)發(fā)生故障了,Pod 不能正常提供服務(wù)了
第一種情況,可能比較好應(yīng)對(duì),活動(dòng)之前我們可以大概計(jì)算下會(huì)有多大的訪問量,提前多啟動(dòng)幾個(gè) Pod 副本,活動(dòng)結(jié)束后再把多余的 Pod 殺掉,雖然有點(diǎn)麻煩,但是還是能夠應(yīng)對(duì)這種情況的。
第二種情況,可能某天夜里收到大量報(bào)警說服務(wù)掛了,然后起來打開電腦在另外的節(jié)點(diǎn)上重新啟動(dòng)一個(gè)新的 Pod,問題可以解決。
但是如果我們都人工的去解決遇到的這些問題,似乎又回到了以前刀耕火種的時(shí)代了是吧?如果有一種工具能夠來幫助我們自動(dòng)管理 Pod 就好了,Pod 掛了自動(dòng)幫我在合適的節(jié)點(diǎn)上重新啟動(dòng)一個(gè) Pod,這樣是不是遇到上面的問題我們都不需要手動(dòng)去解決了。
而 ReplicaSet 這種資源對(duì)象就可以來幫助我們實(shí)現(xiàn)這個(gè)功能,ReplicaSet(RS) 的主要作用就是維持一組 Pod 副本的運(yùn)行,保證一定數(shù)量的 Pod 在集群中正常運(yùn)行,ReplicaSet 控制器會(huì)持續(xù)監(jiān)聽它所控制的這些 Pod 的運(yùn)行狀態(tài),在 Pod 發(fā)送故障數(shù)量減少或者增加時(shí)會(huì)觸發(fā)調(diào)諧過程,始終保持副本數(shù)量一定。
??實(shí)驗(yàn)測(cè)試:
實(shí)驗(yàn)日期:2021年11月8日21:25:39
和 Pod 一樣我們?nèi)匀贿€是通過 YAML 文件來描述我們的 ReplicaSet 資源對(duì)象,如下 YAML 文件是一個(gè)常見的 ReplicaSet 定義:
[root@master1 ~]#vim nginx-rs.yaml
# nginx-rs.yaml apiVersion: apps/v1 kind: ReplicaSet metadata:name: nginx-rsnamespace: default spec:replicas: 3 # 期望的 Pod 副本數(shù)量,默認(rèn)值為1selector: # Label Selector,必須匹配被管理的Pod的標(biāo)簽matchLabels:app: nginxtemplate: # Pod 模板metadata: #Pod名稱會(huì)根據(jù)rs的name自動(dòng)生成labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80上面的 YAML 文件結(jié)構(gòu)和我們之前定義的 Pod 看上去沒太大兩樣,有常見的 apiVersion、kind、metadata,在 spec 下面描述 ReplicaSet 的基本信息,其中包含3個(gè)重要內(nèi)容:
- replias:表示期望的 Pod 的副本數(shù)量
- selector:Label Selector,用來匹配要控制的 Pod 標(biāo)簽,需要和下面的 Pod 模板中的標(biāo)簽一致
- template:Pod 模板,實(shí)際上就是以前我們定義的 Pod 內(nèi)容,相當(dāng)于把一個(gè) Pod 的描述以模板的形式嵌入到了 ReplicaSet 中來。
Pod 模板:
Pod 模板這個(gè)概念非常重要,因?yàn)楹竺嫖覀冎v解到的大多數(shù)控制器,都會(huì)使用 Pod 模板來統(tǒng)一定義它所要管理的 Pod。更有意思的是,我們還會(huì)看到其他類型的對(duì)象模板,比如Volume 的模板等。
上面就是我們定義的一個(gè)普通的 ReplicaSet 資源清單文件,ReplicaSet 控制器會(huì)通過定義的 Label Selector 標(biāo)簽去查找集群中的 Pod 對(duì)象:
我們直接來創(chuàng)建上面的資源對(duì)象:
[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 可以看到當(dāng)前資源對(duì)象的描述信息,包括DESIRED、CURRENT、READY的狀態(tài)值,創(chuàng)建完成后,可以利用如下命令查看下 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 ~]#可以看到現(xiàn)在有 3 個(gè) Pod,這 3 個(gè) Pod 就是我們?cè)?RS 中聲明的 3 個(gè)副本,比如我們刪除其中一個(gè) 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 ~]#可以看到又重新出現(xiàn)了一個(gè) Pod,這個(gè)就是上面我們所說的 ReplicaSet 控制器為我們做的工作,我們?cè)?YAML 文件中聲明了 3 個(gè)副本,然后現(xiàn)在我們刪除了一個(gè)副本,就變成了兩個(gè),這個(gè)時(shí)候 ReplicaSet 控制器監(jiān)控到控制的 Pod 數(shù)量和期望的 3 不一致,所以就需要啟動(dòng)一個(gè)新的 Pod 來保持 3 個(gè)副本,這個(gè)過程上面我們說了就是調(diào)諧的過程。同樣可以查看 RS 的描述信息來查看到相關(guān)的事件信息:
[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 ~]#可以發(fā)現(xiàn)最開始通過 ReplicaSet 控制器創(chuàng)建了 3 個(gè) Pod,后面我們刪除了 Pod 后, ReplicaSet 控制器又為我們創(chuàng)建了一個(gè) Pod,和上面我們的描述是一致的。如果這個(gè)時(shí)候我們把 RS 資源對(duì)象的 Pod 副本更改為 2 spec.replicas=2,這個(gè)時(shí)候我們來更新下資源對(duì)象:
[root@master1 ~]#vim nginx-rs.yaml …… spec:8 replicas: 2 #修改pod副本數(shù)為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 控制器在發(fā)現(xiàn)我們的資源聲明中副本數(shù)變更為 2 后,就主動(dòng)去刪除了一個(gè) Pod,這樣副本數(shù)就和期望的始終保持一致了:
[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 ~]#我們可以隨便查看一個(gè) Pod 的描述信息可以看到這個(gè) 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 #從這里可以看到,這個(gè)pod是被ReplicaSet/nginx-rs控制; …… [root@master1 ~]#注意:
**另外被 ReplicaSet 持有的 Pod 有一個(gè) metadata.ownerReferences 指針指向當(dāng)前的 ReplicaSet,表示當(dāng)前 Pod 的所有者,這個(gè)引用主要會(huì)被集群中的垃圾收集器使用以清理失去所有者的 Pod 對(duì)象。**這個(gè) ownerReferences 和數(shù)據(jù)庫(kù)中的外鍵是不是非常類似。可以通過將 Pod 資源描述信息導(dǎo)出查看:
[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 中有一個(gè) metadata.ownerReferences 的字段指向了 ReplicaSet 資源對(duì)象。如果要徹底刪除 Pod,我們就只能刪除 RS 對(duì)象:
[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 ~]#或者:執(zhí)行 kubectl delete -f nginx-rs.yaml或者:你如果想徹底刪除pod,就需要把rs給刪除掉或者把rs里的副本數(shù)改為0;這就是 ReplicaSet 對(duì)象的基本使用。
實(shí)驗(yàn)到此結(jié)束。
4、Replication Controller(可以不看)
Replication Controller 簡(jiǎn)稱 RC,實(shí)際上 RC 和 RS 的功能幾乎一致,RS 算是對(duì) RC 的改進(jìn),目前唯一的一個(gè)區(qū)別就是 RC 只支持基于等式的 selector(env=dev或environment!=qa),但 RS 還支持基于集合的 selector(version in (v1.0, v2.0)),這對(duì)復(fù)雜的運(yùn)維管理就非常方便了。
比如上面資源對(duì)象如果我們要使用 RC 的話,對(duì)應(yīng)的 selector 是這樣的:
selector:app: nginxRC 只支持單個(gè) Label 的等式,而 RS 中的 Label Selector 支持 matchLabels 和 matchExpressions 兩種形式:
selector:matchLabels:app: nginx--- selector:matchExpressions: # 該選擇器要求 Pod 包含名為 app 的標(biāo)簽- key: appoperator: Invalues: # 并且標(biāo)簽的值必須是 nginx- nginx總的來說 RS 是新一代的 RC,所以以后我們不使用 RC,直接使用 RS 即可,他們的功能都是一致的,但是實(shí)際上在實(shí)際使用中我們也不會(huì)直接使用 RS,而是使用更上層的類似于 Deployment 這樣的資源對(duì)象。
注意,一般,還是matchLabels用的多一些。
關(guān)于我
我的博客主旨:我希望每一個(gè)人拿著我的博客都可以做出實(shí)驗(yàn)現(xiàn)象,先把實(shí)驗(yàn)做出來,然后再結(jié)合理論知識(shí)更深層次去理解技術(shù)點(diǎn),這樣學(xué)習(xí)起來才有樂趣和動(dòng)力。并且,我的博客內(nèi)容步驟是很完整的,也分享源碼和實(shí)驗(yàn)用到的軟件,希望能和大家一起共同進(jìn)步!
各位小伙伴在實(shí)際操作過程中如有什么疑問,可隨時(shí)聯(lián)系本人免費(fèi)幫您解決問題:
個(gè)人微信二維碼:x2675263825 (舍得), qq:2675263825。
個(gè)人博客地址:www.onlyonexl.cn
個(gè)人微信公眾號(hào):云原生架構(gòu)師實(shí)戰(zhàn)
個(gè)人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
最后
? 好了,關(guān)于ReplicaSet實(shí)驗(yàn)就到這里了,感謝大家閱讀,最后貼上我女神的photo,祝大家生活快樂,每天都過的有意義哦,我們下期見!
總結(jié)
以上是生活随笔為你收集整理的ReplicaSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言求π的近似值
- 下一篇: 基于结构光扫描的生物芯片快速彩色质量监管