3.1 控制器之ReplicaSet/ReplicationController
文章目錄
- ReplicaSet使用
- 1、創(chuàng)建ReplicaSet
- 2、刪除一個(gè)pod
- 3、修改pod標(biāo)簽
- 4、標(biāo)簽選擇器
- 4、修改ReplicaSet標(biāo)簽選擇器
- 5、水平縮放pod
- 6、刪除ReplicaSet控制器
在新版本k8s中,ReplicaSet取代了ReplicationController,ReplicaSet除了滿足ReplicationController,其強(qiáng)大之處還在于支持標(biāo)簽選擇器。所以本文主要以ReplicaSet為主。
ReplicaSet主要用來監(jiān)控k8s中的pod,使其數(shù)量與副本數(shù)保持一致,當(dāng)pod數(shù)量少于副本數(shù)量時(shí)會(huì)根據(jù)定義的pod模板啟動(dòng)相應(yīng)的pod數(shù)量,當(dāng)pod數(shù)量多于副本數(shù)數(shù)量時(shí),它將刪除多于的pod。手動(dòng)增加ReplicaSet選擇的標(biāo)簽類型的pod會(huì)k8s中pod數(shù)量多于副本數(shù),ReplicaSet將刪除多于的pod。
ReplicaSet優(yōu)點(diǎn):
- 當(dāng)集群幾點(diǎn)發(fā)生故障時(shí),為故障的pod創(chuàng)建替代的副本;
- 可以輕松實(shí)現(xiàn)pod的水平伸縮
ReplicaSet使用
1、創(chuàng)建ReplicaSet
replica_set_example.yaml配置如下:
apiVersion: extensions/v1beta1 kind: ReplicaSet #控制器類型為ReplicaSet metadata:name: nginx-relica #ReplicaSet控制器名字為nginx-relica spec: #ReplicaSet控制器的描述replicas: 3 #pod的副本數(shù)selector: #ReplicaSet控制器的選擇器matchLabels: #ReplicaSet控制器定義標(biāo)簽app: nginx-label #ReplicaSet控制器管理標(biāo)簽為app=nginx-label的podtemplate: #pod的模板metadata: #pod的元數(shù)據(jù)labels: #定義pod的標(biāo)簽app: nginx-label #定義pod的標(biāo)簽為app=nginx-labelspec: #pod的描述containers: #定義pod中容器- name: nginx-pod #容器的名字為nginx-podimage: nginx #容器的鏡像為nginximagePullPolicy: IfNotPresent #鏡像策略,如果本地有nginx鏡像,就用本地的鏡像啟動(dòng)容器,如果本地沒有默認(rèn)從docker hub上獲取latest版本nginx鏡像ports: #定義容器端口- containerPort: 80 #暴露容器中80端口command: ["/bin/sh", "-c", "echo hello world > /usr/share/nginx/html/hello.html; sleep 3600"] #容器啟動(dòng)后,執(zhí)行command命令用create創(chuàng)建ReplicaSet, kubectl create -f replica_set_example.yaml,執(zhí)行如下
[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml replicaset.extensions/nginx-relica created [root@k8s-master01 sc_work]# kubectl get replicaset NAME DESIRED CURRENT READY AGE nginx-relica 3 3 3 12s [root@k8s-master01 sc_work]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-relica-8b26w 1/1 Running 0 20s nginx-relica-grs84 1/1 Running 0 20s nginx-relica-ts6n4 1/1 Running 0 20s2、刪除一個(gè)pod
ReplicaSet管理了3個(gè)副本的pod,刪除其中一個(gè)pod后,ReplicaSet會(huì)根據(jù)副本數(shù)重新啟動(dòng)一個(gè)pod,保持集群中有3個(gè)副本,如命令所示
[root@k8s-master01 sc_work]# kubectl delete pod nginx-relica-grs84 pod "nginx-relica-grs84" deleted [root@k8s-master01 sc_work]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-relica-kpq7k 1/1 Running 0 33s nginx-relica-rrsph 1/1 Running 0 2m13s nginx-relica-ts6n4 1/1 Running 0 3m5s3、修改pod標(biāo)簽
通過ReplicaSet創(chuàng)建pod后,如果修改了pod的標(biāo)簽,ReplicaSet檢查管理的pod數(shù)量少于副本數(shù),會(huì)重新啟動(dòng)pod維持副本數(shù)量的pod。為修改pod標(biāo)簽前如下
[root@k8s-master01 sc_work]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-relica-kpq7k 1/1 Running 47 47h app=nginx-label nginx-relica-rrsph 1/1 Running 47 47h app=nginx-label nginx-relica-ts6n4 1/1 Running 47 47h app=nginx-label修改其中一個(gè)pod的標(biāo)簽app=nginx-label修改為app=nginx-debug
[root@k8s-master01 sc_work]# kubectl label pod nginx-relica-kpq7k app=nginx-debug --overwrite pod/nginx-relica-kpq7k labeled然后再查詢pod數(shù)量
[root@k8s-master01 sc_work]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-relica-hpk5f 1/1 Running 0 15s app=nginx-label nginx-relica-kpq7k 1/1 Running 47 47h app=nginx-debug nginx-relica-rrsph 1/1 Running 47 47h app=nginx-label nginx-relica-ts6n4 1/1 Running 47 47h app=nginx-label發(fā)現(xiàn)又重新啟動(dòng)了一個(gè)app=nginx-label的pod,始終維持在副本數(shù)量的pod。
4、標(biāo)簽選擇器
前面示例已經(jīng)用過了標(biāo)簽選擇器,標(biāo)簽選擇器主要是用來控制pod的
spec: #ReplicaSet控制器的描述replicas: 3 #pod的副本數(shù)selector: #ReplicaSet控制器的選擇器matchLabels: #ReplicaSet控制器定義標(biāo)簽app: nginx-label #ReplicaSet控制器管理標(biāo)簽為app=nginx-label的podselector選擇器下的matchLabels用來匹配單個(gè)標(biāo)簽鍵值對形式的,相當(dāng)于k8s老版本中ReplicationController控制器的作用。另外selector選擇器下的matchExpressions擁有更強(qiáng)大的選擇功能。例如
spec:replicas: 3selector:matchExpressions:- key: app #matchExpressions為list類型operator: Invalues:- nginx-prod #values為List類型該標(biāo)簽選擇器會(huì)選擇標(biāo)簽app在nginx-prod標(biāo)簽的pod進(jìn)行管理。
matchExpressions選擇模式強(qiáng)大,有如下幾種選擇模式:
- In : key指定的標(biāo)簽必須與values中列舉的標(biāo)簽其中一個(gè)匹配;
- Notin : key指定的標(biāo)簽與values中列舉的標(biāo)簽任何一個(gè)都不匹配;
- Exists : key指定的標(biāo)簽名字只要與pod中標(biāo)簽名字一致,pod就會(huì)被管理,不管標(biāo)簽的value值是否一致,只要標(biāo)簽的名字一致就可以;
- DoesNotExist : 與Exists 相反。
例如,只要?jiǎng)?chuàng)建的pod含有便簽app,不管標(biāo)簽的value值如何,都會(huì)被ReplicaSet進(jìn)行管理。
spec:replicas: 3selector:matchExpressions:- key: appoperator: Exists注意:上面示例中,只指定了matchExpressions中的一個(gè)標(biāo)簽表達(dá)式,因?yàn)閙atchExpressions是list類型,可以指定多個(gè)選擇器表達(dá)式,如果指定多個(gè)表達(dá)式,多有選擇器必須與Pod匹配才能選中并管理pod。另外,如果同時(shí)指定了matchExpressions和matchLabels兩種選擇模式,則兩種選擇模式必須都匹配,pod才會(huì)被選中并進(jìn)行管理。
4、修改ReplicaSet標(biāo)簽選擇器
replicaset管理pod后,如果修改了ReplicaSet標(biāo)簽選擇器,會(huì)使ReplicaSet放棄正在管理的pod,轉(zhuǎn)而去管理修改選擇器后的指定的pod或者重新創(chuàng)建指定標(biāo)簽的pod。
比如用replica_set_example.yaml創(chuàng)建replicaset,并創(chuàng)建管理4個(gè)pod
執(zhí)行上述命令后,nginx-relica管理著4個(gè)標(biāo)簽為nginx-prod的pod,下面修改一下nginx-relica的選擇器,使其管理4個(gè)標(biāo)簽為nginx-debug的pod
kubectl edit rs nginx-relica #編輯nginx-relica ……省略 spec:replicas: 4selector:matchLabels:app: nginx-debug #標(biāo)簽選擇器從nginx-prod修改為nginx-debugtemplate:metadata:creationTimestamp: nulllabels:app: nginx-debug #pod的模板標(biāo)簽從nginx-prod修改為nginx-debugspec:……省略編輯完replicaset后,重新查看pod情況,發(fā)現(xiàn)replicaset重新管理了4個(gè)標(biāo)簽為app=nginx-debug的pod,但原來的app=nginx-prod的pod并沒有自動(dòng)刪除,如果手動(dòng)刪除后,不會(huì)再自動(dòng)重建,如果手動(dòng)刪除標(biāo)簽為app=nginx-debug的pod,replicaset會(huì)自動(dòng)進(jìn)行重新重建標(biāo)簽為app=nginx-debug的pod,使其數(shù)量達(dá)到副本數(shù)。
[root@k8s-master01 sc_work]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-relica-4wcvq 1/1 Running 0 4m26s app=nginx-prod nginx-relica-5q59d 1/1 Running 0 4m26s app=nginx-prod nginx-relica-5wspn 1/1 Running 0 21s app=nginx-debug nginx-relica-795dg 1/1 Running 0 21s app=nginx-debug nginx-relica-cp2fx 1/1 Running 0 21s app=nginx-debug nginx-relica-nx8d6 1/1 Running 0 21s app=nginx-debug nginx-relica-x694n 1/1 Running 0 4m26s app=nginx-prod nginx-relica-ztp6p 1/1 Running 0 4m26s app=nginx-prod5、水平縮放pod
集群中,有時(shí)訪問量增加,需要水平擴(kuò)展pod數(shù)量,或者晚上訪問量小,縮小pod數(shù)量,節(jié)省資源。
下面通過ReplicaSet創(chuàng)建3個(gè)pod,然后再水平擴(kuò)展到4個(gè)pod
6、刪除ReplicaSet控制器
- 直接刪除ReplicaSet后也會(huì)連帶刪除ReplicaSet控制器管理的Pod
- 刪除ReplicaSet但保留pod運(yùn)行
注:ReplicaSet可以簡寫為rs,比如
kubectl get rs參考《kubernetes in action》
總結(jié)
以上是生活随笔為你收集整理的3.1 控制器之ReplicaSet/ReplicationController的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜狗安装输入法操作
- 下一篇: 音频单元组件服务参考(Audio Uni