Pod控制器之ReplicaSet

簡介

前面我們一直介紹的是直接創(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í)不迷路!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皱埠,一起剝皮案震驚了整個濱河市肮帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖训枢,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恒界,居然都是意外死亡睦刃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門十酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耸采,你說我怎么就攤上這事兴泥。” “怎么了虾宇?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵搓彻,是天一觀的道長嘱朽。 經(jīng)常有香客問我旭贬,道長,這世上最難降的妖魔是什么搪泳? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任稀轨,我火速辦了婚禮,結(jié)果婚禮上岸军,老公的妹妹穿的比我還像新娘。我一直安慰自己凛膏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布脏榆。 她就那樣靜靜地躺著猖毫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪须喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天坞生,我揣著相機(jī)與錄音仔役,去河邊找鬼。 笑死是己,一個胖子當(dāng)著我的面吹牛又兵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沛厨,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宙地,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逆皮?” 一聲冷哼從身側(cè)響起宅粥,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掺喻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拯辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剿牺,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡企垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年牢贸,在試婚紗的時候發(fā)現(xiàn)自己被綠了竹观。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡潜索,死狀恐怖臭增,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情誊抛,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布整陌,位于F島的核電站拗窃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泌辫。R本人自食惡果不足惜随夸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一震放、第九天 我趴在偏房一處隱蔽的房頂上張望宾毒。 院中可真熱鬧,春花似錦殿遂、人聲如沸诈铛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恩静,卻和暖如春焕毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工咬荷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冠句,地道東北人幸乒。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓懦底,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罕扎。 傳聞我的和親對象是個殘疾皇子聚唐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容