詳細(xì)聊聊k8s deployment的滾動(dòng)更新(一)

一、知識(shí)準(zhǔn)備

● 本文詳細(xì)探索deployment在滾動(dòng)更新時(shí)候的行為


二、環(huán)境準(zhǔn)備

組件 版本
OS Ubuntu 18.04.1 LTS
docker 18.06.0-ce


三、準(zhǔn)備鏡像

首先準(zhǔn)備2個(gè)不同版本的鏡像,用于測(cè)試(已經(jīng)在阿里云上創(chuàng)建好2個(gè)不同版本的nginx鏡像)

docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1
docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2
root@k8s-master:~# docker run -d --rm -p 10080:80 nginx:v1
e88097841c5feef92e4285a2448b943934ade5d86412946bc8d86e262f80a050
root@k8s-master:~# curl http://127.0.0.1:10080
----------
version: v1
hostname: f5189a5d3ad3

四、deployment、replicaset、pod之間的關(guān)系

                           +------------+
                           | deployment |
                           +-----+------+
                                 |
                                 |
                                 |
                                 |
       +--------------------------------------------------+
       |                         |                        |
       |                         |                        |
       |                         |                        |
       |                         |                        |
       |                         |                        |
       |                         |                        |
+------v------+           +------v------+          +------v------+
|replicaset:v1|           |replicaset:v2|          |replicaset:v3|
+-------------+           +------+------+          +-------------+
                                 |
                                 |
                        +--------+---------+
                        |                  |
                        |                  |
                    +---v---+          +---v---+
                    |pod:v2 |          |pod:v2 |
                    +-------+          +-------+


● deployment調(diào)度replicaset,pod由replicaset調(diào)度
● deployment管理多個(gè)replicaset版本,可用于回滾
● replicaset控制pod的行為,包括新增pod、刪除pod

我們首先準(zhǔn)備一個(gè)yaml文件用于測(cè)試:

root@k8s-master:~# more roll_update.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: image-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: image-update
    spec:
      containers:
      - name: nginx
        image: registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1
        imagePullPolicy: Always

簡(jiǎn)單驗(yàn)證一下:

root@k8s-master:~# kubectl apply -f roll_update.yaml
deployment.extensions "update-deployment" created
root@k8s-master:~# kubectl get deploy
NAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
update-deployment   3         3         3            3           54s
root@k8s-master:~# kubectl get rs
NAME                           DESIRED   CURRENT   READY     AGE
update-deployment-7db77f7cc6   3         3         3         56s
root@k8s-master:~# kubectl get pod
NAME                                 READY     STATUS    RESTARTS   AGE
update-deployment-7db77f7cc6-7j49g   1/1       Running   0          1m
update-deployment-7db77f7cc6-b75wn   1/1       Running   0          1m
update-deployment-7db77f7cc6-cfnt5   1/1       Running   0          1m

deployment、replicaset、pod都已經(jīng)正常啟動(dòng),下面分析一下他們的行為:

deployment

root@k8s-master:~# kubectl describe deploy update-deployment
Name:                   update-deployment
Namespace:              default
...
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
...
NewReplicaSet:   update-deployment-7db77f7cc6 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  1m    deployment-controller  Scaled up replica set update-deployment-7db77f7cc6 to 3

● deployment創(chuàng)建了一個(gè)replicaset,叫做update-deployment-7db77f7cc6(7db77f7cc6是replicaset的template hash值)
● 根據(jù)配置文件的要求,replicaset的副本數(shù)為3


replicaset

root@k8s-master:~# kubectl describe rs update-deployment-7db77f7cc6
Name:           update-deployment-7db77f7cc6
Namespace:      default
...
Controlled By:  Deployment/update-deployment
Replicas:       3 current / 3 desired
Pods Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed
...
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-7j49g
  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-b75wn
  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-cfnt5

● replicaset創(chuàng)建了3個(gè)pod


pod

root@k8s-master:~# kubectl describe pod update-deployment-7db77f7cc6-7j49g
Name:           update-deployment-7db77f7cc6-7j49g
Namespace:      default
...
Status:         Running
IP:             10.10.169.140
Controlled By:  ReplicaSet/update-deployment-7db77f7cc6
...
Events:
  Type    Reason                 Age   From                Message
  ----    ------                 ----  ----                -------
  Normal  Scheduled              9m    default-scheduler   Successfully assigned update-deployment-7db77f7cc6-7j49g to k8s-node2
  Normal  SuccessfulMountVolume  9m    kubelet, k8s-node2  MountVolume.SetUp succeeded for volume "default-token-v9nkm"
  Normal  Pulling                9m    kubelet, k8s-node2  pulling image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"
  Normal  Pulled                 9m    kubelet, k8s-node2  Successfully pulled image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"
  Normal  Created                9m    kubelet, k8s-node2  Created container
  Normal  Started                9m    kubelet, k8s-node2  Started container

● pod被replicaset創(chuàng)建之后,開(kāi)始分配到worker節(jié)點(diǎn)、拉取鏡像、啟動(dòng)容器等一系列操作
● 所以pod的命名方式是:update-deployment-7db77f7cc6-7j49g(deployment名字-replicaset模板hash名字-pod模板hash名字)


不禁有同學(xué)要問(wèn),為什么搞這么復(fù)雜,啟動(dòng)一個(gè)pod需要?jiǎng)佑眠@么多組件呢?下面用一個(gè)場(chǎng)景說(shuō)明為啥需要這么多組件:

鏡像版本更新

● 當(dāng)鏡像版本有更新時(shí)(三種方法都可以實(shí)現(xiàn),參考前一篇文章:更新k8s鏡像版本的三種方式),既要保證服務(wù)可用,又要保證在線更新,流程應(yīng)該是:
??1、先增加一個(gè)pod,鏡像版本為新版本
??2、pod可用之后,刪除一個(gè)老版本pod
??3、循環(huán)第1、2步,直到老版本pod全部刪除,新版本的pod全部可用
● 上述的這個(gè)過(guò)程就是replicaset的作用,它根據(jù)需求,自動(dòng)的增加新版本pod,然后刪除老版本pod,直到老版本pod全部刪除,新版本的pod全部可用
● 如果此時(shí)版本需要回退,那replicaset需要把剛才的步驟逆向更新一遍,實(shí)現(xiàn)版本回退
● deployment的作用就是管理replicaset。deployment會(huì)保存各個(gè)版本的replicaset,一旦需要進(jìn)行版本回滾,deployment會(huì)立即回滾replicaset的版本,從而控制pod狀態(tài)


下面測(cè)試一下:

使用patch命令更新鏡像版本,并且使用pause命令來(lái)觀察:

root@k8s-master:~# kubectl patch deployment update-deployment \
--patch '{"spec": {"template": {"spec": {"containers": [{"name": "nginx","image":"registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2"}]}}}}' \
&& kubectl rollout pause deployment update-deployment
deployment.extensions "update-deployment" patched
deployment.apps "update-deployment" paused

此時(shí)pod狀態(tài):

root@k8s-master:~# kubectl get pod -owide
NAME                                 READY     STATUS        RESTARTS   AGE       IP              NODE
update-deployment-7db77f7cc6-7j49g   1/1       Running       0          1h        10.10.169.140   k8s-node2
update-deployment-7db77f7cc6-b75wn   1/1       Running       0          1h        10.10.235.211   k8s-master
update-deployment-7db77f7cc6-cfnt5   1/1       Terminating   0          1h        10.10.36.126    k8s-node1
update-deployment-7fb7b4b557-6987x   1/1       Running       0          7s        10.10.36.127    k8s-node1
update-deployment-7fb7b4b557-dxdqb   1/1       Running       0          10s       10.10.169.139   k8s-node2

新增了2個(gè)pod,而刪除了1個(gè)老版本的pod

此時(shí)replicaset狀態(tài):

root@k8s-master:~# kubectl get rs -owide
NAME                           DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                                                   SELECTOR
update-deployment-7db77f7cc6   2         2         2         1h        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1   app=roll-update,pod-template-hash=3863393772
update-deployment-7fb7b4b557   2         2         2         4m        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2   app=roll-update,pod-template-hash=3963606113

有一個(gè)新版本的replicaset創(chuàng)建了出來(lái),并且需求的pod數(shù)量為2,而原來(lái)的replicaset需求的pod數(shù)量從3降為2

查看replicaset版本:

root@k8s-master:~# kubectl rollout history deploy update-deployment
deployments "update-deployment"
REVISION  CHANGE-CAUSE
1         <none>
2         update version to v2

新增了一個(gè)版本2

由于使用pause命令,更新過(guò)程到此會(huì)卡主,我們讓更新的過(guò)程繼續(xù)下去:

root@k8s-master:~# kubectl rollout resume deployment update-deployment
deployment.apps "update-deployment" resumed

查看狀態(tài):

root@k8s-master:~# kubectl get pod
NAME                                 READY     STATUS    RESTARTS   AGE
update-deployment-7fb7b4b557-6987x   1/1       Running   0          15m
update-deployment-7fb7b4b557-dxdqb   1/1       Running   0          15m
update-deployment-7fb7b4b557-wg5c8   1/1       Running   0          1m
root@k8s-master:~# kubectl get rs -owide
NAME                           DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                                                   SELECTOR
update-deployment-7db77f7cc6   0         0         0         1h        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1   app=roll-update,pod-template-hash=3863393772
update-deployment-7fb7b4b557   3         3         3         14m       nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2   app=roll-update,pod-template-hash=3963606113

v1版本的replicaset已經(jīng)沒(méi)有pod,但是歷史記錄還是保留的,可以通過(guò)deployment調(diào)度快速回滾

五、小結(jié)

● 本文介紹了deployment滾動(dòng)更新時(shí),deployment、replicaset、pod的細(xì)節(jié)以及創(chuàng)建過(guò)程
● 介紹了deployment版本管理的方式
● 下一小節(jié)將會(huì)介紹在滾動(dòng)更新過(guò)程中最大可用、liveness以及readiness等



至此,本文結(jié)束
在下才疏學(xué)淺,有撒湯漏水的,請(qǐng)各位不吝賜教...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、基礎(chǔ)架構(gòu) 1.1 Master Master節(jié)點(diǎn)上面主要由四個(gè)模塊組成:APIServer、scheduler...
    阿斯蒂芬2閱讀 11,140評(píng)論 0 44
  • 一、知識(shí)準(zhǔn)備 ● 本文詳細(xì)探索deployment在滾動(dòng)更新時(shí)候的行為● 相關(guān)的參數(shù)介紹:??livenessPr...
    wilsonchai閱讀 1,063評(píng)論 0 1
  • 一、 K8s 是什么? Kubernetes(k8s)是自動(dòng)化容器操作的開(kāi)源平臺(tái),這些操作包括部署,調(diào)度和節(jié)點(diǎn)集群...
    loveroot閱讀 6,708評(píng)論 1 21
  • Kubernetes架構(gòu) Kubernetes是當(dāng)今最流行的開(kāi)源容器管理平臺(tái),來(lái)自Google Borg的開(kāi)源版本...
    華陽(yáng)_3bcf閱讀 1,496評(píng)論 0 0
  • 本來(lái)我和爸爸做的科技小制作是橡皮車(chē),用的廢紙箱、棉簽棍、皮筋和筆管這幾種材料,車(chē)子的輪子是圓形的,我們就用...
    楊焯閱讀 1,262評(píng)論 0 0

友情鏈接更多精彩內(nèi)容