簡介
前面我們一直介紹的是直接創(chuàng)建Pod呼巴,但是在生產(chǎn)環(huán)境中基本很少讓K8s直接創(chuàng)建Pod泽腮,因?yàn)檫@種方式創(chuàng)建出來的Pod刪除就沒有了御蒲,也不會重建诊赊。我們希望Pod資源出現(xiàn)故障的時候能夠嘗試著重啟或者創(chuàng)建出新的Pod厚满,擴(kuò)縮容能夠更加方便,更新升級能夠更加合理碧磅,這個時候就需要用到Pod的控制器來實(shí)現(xiàn)
在K8s中有很多種Pod碘箍,分別作用域不同的場景鲸郊,上面介紹的場景就是我們本文要介紹的控制器ReplicaSet(簡稱RS)丰榴,其它控制器后續(xù)文章逐一介紹
ReplicationController
在使用ReplicaSet之前我們先來了解下ReplicationController簡稱RC,它是比較原始的控制器秆撮,新的版本已經(jīng)被RS所取代
RC會持續(xù)監(jiān)控正在運(yùn)行的Pod列表四濒,保證相應(yīng)標(biāo)簽下的Pod數(shù)量與期望的數(shù)量相符合职辨,一旦出現(xiàn)故障峻黍,就會重啟或重建,數(shù)量少了便根據(jù)模板創(chuàng)建新的副本拨匆,數(shù)量多了就刪除多余的副本
RC主要有三大部分組成
Label Selector 標(biāo)簽選擇器,表示RC需要管理的Pod
Replica 副本數(shù)挽拂,Pod運(yùn)行的數(shù)量
Pod template 創(chuàng)建Pod的模板
ReplicaSet
上面簡單介紹的RC其實(shí)也是RS的功能,目前來說他們的不同存在于標(biāo)簽選擇器上亏栈,RC只能選擇一個標(biāo)簽台腥,RS則多了一種選擇可以根據(jù)操作符操作多個標(biāo)簽集合。但即便是RS官方也是不建議直接使用的绒北,后面文章還會介紹更好的控制器Deployment
資源清單文件
apiVersion: apps/v1 # 版本號
kind: ReplicaSet # 表示RS
metadata: # 元數(shù)據(jù)
name: # RS的名稱
namespace: # 與Pod一樣,有歸屬于某個命名空間
labels: # 標(biāo)簽
spec:
replicas: # 期望的副本數(shù)量
selector: # 標(biāo)簽選擇器闷游,定于需要管理的Pod
matchLabels:
matchExpressions:
- key:
operator: # 操作符 In, NotIn, Exists and DoesNotExist
values:
template: #模板 與Pod的定義一樣
metadata:
spec:
與RC一樣最重要的就是replicas峻汉、selector與template
創(chuàng)建
創(chuàng)建一個RS管理三個Pod
編寫 replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset
spec:
replicas: 3
selector:
matchExpressions:
- {key: app, operator: In,values: [nginx]}
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.1
啟動控制器,查看控制器詳情脐往,查看Pod詳情
# 啟動控制器RS
[root@master rs]# kubectl create -f replicaset.yaml
replicaset.apps/replicaset created
# 查看控制器休吠,有三個正常運(yùn)行的副本
[root@master rs]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset 3 3 3 8s nginx nginx:1.19.1 app in (nginx)
# 查看Pod 確實(shí)有三個正常的Pod
[root@master rs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-6622b 1/1 Running 0 18s
replicaset-pn66p 1/1 Running 0 18s
replicaset-wf6pz 1/1 Running 0 18s
# 查看RS事件 創(chuàng)建了三個Pod
[root@master rs]# kubectl describe rs replicaset | grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 29s replicaset-controller Created pod: replicaset-6622b
Normal SuccessfulCreate 29s replicaset-controller Created pod: replicaset-pn66p
Normal SuccessfulCreate 29s replicaset-controller Created pod: replicaset-wf6pz
注意觀察上面的NAME业簿,RS的name為replicaset瘤礁,Pod的name便是被管理的RS的name加上一串隨機(jī)字符串,從名字上可以看出Pod是被哪個RS所管理
既然RS可以感知到Pod的異常并且根據(jù)策略重啟或重建梅尤,那么我們手動刪除一個Pod柜思,看副本數(shù)是否還能保持三個
# 刪除一個Pod
[root@master rs]# kubectl delete pod replicaset-wf6pz
pod "replicaset-wf6pz" deleted
# Pod還是有三個,并且看時間是剛剛啟動赡盘,通過與上面的對比wf6pz的Pod刪除后新加入了一個jqmf5
[root@master rs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-6622b 1/1 Running 0 61s
replicaset-jqmf5 1/1 Running 0 13s
replicaset-pn66p 1/1 Running 0 61s
# 查看事件号枕,多了一次創(chuàng)建replicaset-jqmf5
[root@master rs]# kubectl describe rs replicaset | grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 113s replicaset-controller Created pod: replicaset-6622b
Normal SuccessfulCreate 113s replicaset-controller Created pod: replicaset-pn66p
Normal SuccessfulCreate 113s replicaset-controller Created pod: replicaset-wf6pz
Normal SuccessfulCreate 65s replicaset-controller Created pod: replicaset-jqmf5
擴(kuò)縮容
RS可以很方便的進(jìn)行擴(kuò)縮容,擴(kuò)縮容的方式有兩種亡脑,一是通過edit編輯資源清單文件,二是直接使用命令
我們分別使用文件編輯方式擴(kuò)容與命令方式縮容
擴(kuò)容
# 編輯yaml 修改如下部分
# spec:
# replicas: 5
[root@master rs]# kubectl edit rs replicaset
replicaset.apps/replicaset edited
# 發(fā)現(xiàn)新增了兩個Pod dtmkl and rvw6s
[root@master rs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-6622b 1/1 Running 0 3m33s
replicaset-dtmkl 1/1 Running 0 10s
replicaset-jqmf5 1/1 Running 0 2m45s
replicaset-pn66p 1/1 Running 0 3m33s
replicaset-rvw6s 1/1 Running 0 10s
# 事件霉咨,多了兩次創(chuàng)建
[root@master rs]# kubectl describe rs replicaset | grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m50s replicaset-controller Created pod: replicaset-6622b
Normal SuccessfulCreate 3m50s replicaset-controller Created pod: replicaset-pn66p
Normal SuccessfulCreate 3m50s replicaset-controller Created pod: replicaset-wf6pz
Normal SuccessfulCreate 3m2s replicaset-controller Created pod: replicaset-jqmf5
Normal SuccessfulCreate 27s replicaset-controller Created pod: replicaset-rvw6s
Normal SuccessfulCreate 27s replicaset-controller Created pod: replicaset-dtmkl
縮容
kubectl scale rs 名字 --replicas=副本數(shù)
將副本數(shù)減到2
# 縮容
[root@master rs]# kubectl scale rs replicaset --replicas=2
replicaset.apps/replicaset scaled
# Pod數(shù)量變?yōu)闉榱?2
[root@master rs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-6622b 1/1 Running 0 5m10s
replicaset-pn66p 1/1 Running 0 5m10s
# 查看事件 多了三次delete事件
[root@master rs]# kubectl describe rs replicaset | grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 5m24s replicaset-controller Created pod: replicaset-6622b
Normal SuccessfulCreate 5m24s replicaset-controller Created pod: replicaset-pn66p
Normal SuccessfulCreate 5m24s replicaset-controller Created pod: replicaset-wf6pz
Normal SuccessfulCreate 4m36s replicaset-controller Created pod: replicaset-jqmf5
Normal SuccessfulCreate 2m1s replicaset-controller Created pod: replicaset-rvw6s
Normal SuccessfulCreate 2m1s replicaset-controller Created pod: replicaset-dtmkl
Normal SuccessfulDelete 21s replicaset-controller Deleted pod: replicaset-jqmf5
Normal SuccessfulDelete 21s replicaset-controller Deleted pod: replicaset-rvw6s
Normal SuccessfulDelete 21s replicaset-controller Deleted pod: replicaset-dtmkl
鏡像升級
查看當(dāng)前RS使用的nginx版本
# 當(dāng)前RS使用nginx:1.19.1版本
[root@master rs]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset 2 2 2 7m7s nginx nginx:1.19.1 app in (nginx)
鏡像升級也是有兩種方式蛙紫,通過編輯文件與命令方式
通過編輯文件方式將版本改為1.17.1
# 編輯文件內(nèi)容改為如下
# spec:
# containers:
# - image: nginx:1.17.1
[root@master rs]# kubectl edit rs replicaset
replicaset.apps/replicaset edited
# 查看rs使用的模板鏡像已經(jīng)變成1.17.1
[root@master rs]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset 2 2 2 8m17s nginx nginx:1.17.1 app in (nginx)
上面雖然顯示版本已經(jīng)改為1.17.1了,但是Pod中的鏡像真的改變了嗎途戒?下面檢測一下是否真的替換了鏡像
# 通過 kubectl describe rs replicasetc 查看RS并無新的事件發(fā)生
# 查看Pod的啟動事件,并沒有替換新的1.17.1,依然是老的1.19.1
[root@master rs]# kubectl describe pod replicaset-6622b | grep -A 100 Events
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 11m default-scheduler Successfully assigned default/replicaset-6622b to node01
Normal Pulled 11m kubelet Container image "nginx:1.19.1" already present on machine
Normal Created 11m kubelet Created container nginx
Normal Started 11m kubelet Started container nginx
# 直接訪問Pod坑傅,執(zhí)行命令查看版本,發(fā)現(xiàn)并沒有改變
[root@master rs]# kubectl exec replicaset-6622b -- nginx -V
nginx version: nginx/1.19.1
通過上面檢測喷斋,發(fā)現(xiàn)RS升級鏡像并不能自動更新唁毒,也就是不會影響正在運(yùn)行的Pod,那么我們刪除一個Pod再觀測自動創(chuàng)建的新Pod是否會拉取1.17.1版本鏡像
# 刪除一個Pod
[root@master rs]# kubectl delete pod replicaset-6622b
pod "replicaset-6622b" deleted
# 查看正在運(yùn)行的Pod 新創(chuàng)建了replicaset-xcm6l
[root@master rs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-pn66p 1/1 Running 0 20m
replicaset-xcm6l 1/1 Running 0 2s
# 查看版本發(fā)現(xiàn)有兩個Pod版本不同浆西,并且他們可以并存
[root@master rs]# kubectl exec replicaset-xcm6l -- nginx -V
nginx version: nginx/1.17.1
[root@master rs]# kubectl exec replicaset-pn66p -- nginx -V
nginx version: nginx/1.19.1
命令方式格式
kubectl set image rs 名稱 容器=鏡像版本
使用命令方式將nginx的版本改回1.19.1
# 修改鏡像版本
[root@master rs]# kubectl set image rs replicaset nginx=nginx:1.19.1
replicaset.apps/replicaset image updated
# 查看RS詳情 鏡像已經(jīng)變?yōu)?.19.1
[root@master rs]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset 2 2 2 23m nginx nginx:1.19.1 app in (nginx)
命令方式也與上面編輯文件方式一樣,不會自動更新升級顽腾,正在運(yùn)行Pod不會受影響近零,如果有新的Pod創(chuàng)建那么會使用修改過后的鏡像。
基于這種效果我們想想抄肖,如果替換鏡像后能夠自動按批次刪除指定數(shù)量Pod,是不是可以達(dá)到滾動升級的效果漓摩,如果刪除指定Pod后暫停裙士,觀察一段時間再刪除剩余的Pod,是不是可以達(dá)到灰度發(fā)布的效果管毙。后面我們介紹Deployment控制器會詳細(xì)介紹這兩種發(fā)布腿椎。
RS控制器就介紹到這,后面介紹Deployment控制器
歡迎關(guān)注酥诽,學(xué)習(xí)不迷路!