溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Deployment副本無(wú)狀態(tài)服務(wù)創(chuàng)建及水平擴(kuò)展的方法

發(fā)布時(shí)間:2022-03-19 08:56:50 來(lái)源:億速云 閱讀:201 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Deployment副本無(wú)狀態(tài)服務(wù)創(chuàng)建及水平擴(kuò)展的方法”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Deployment副本無(wú)狀態(tài)服務(wù)創(chuàng)建及水平擴(kuò)展的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

本文單詞:

replace(/r??ple?s/)替換、取代;在本文中是修改后的yaml文件替換舊的yaml文件

rollout(/ɑ?®/)記錄;在本文中是記錄歷史的deploy副本版本

describe(/d??skra?b/)描述;在本文中是說(shuō)記錄過(guò)程

scale(/ske?l/)縮放;在本文中是說(shuō)縮放副本的個(gè)數(shù)

pause(/p??z/)暫停;在本文中是說(shuō)暫停更新

resume(/r??zju?m/)恢復(fù);在本文中是說(shuō)從暫停恢復(fù)到正常狀態(tài)

RC(Replication Controller)和RS(ReplicaSet)

(幾乎棄用)RC是復(fù)制控制器,確保Pod數(shù)量達(dá)到期望值,保證副本始終處于可用的狀態(tài)。

(不建議單獨(dú)使用)RS是RC的下一代,支持標(biāo)簽集。

無(wú)狀態(tài)服務(wù)Deployment意思就是無(wú)狀態(tài)的。。。用于部署無(wú)狀態(tài)的服務(wù)。

類似網(wǎng)頁(yè)訪問(wèn)之類的請(qǐng)求就是無(wú)狀態(tài)的,每次請(qǐng)求都包含了需要的所有信息,每次請(qǐng)求都和上次沒有關(guān)系。
Deployment是最常用的控制器。一般用于管理維護(hù)企業(yè)內(nèi)部的無(wú)狀態(tài)的微服務(wù),比如configserver、zuul、springboot。可以管理多個(gè)副本的Pod實(shí)現(xiàn)無(wú)縫遷移、自動(dòng)擴(kuò)容縮容、自動(dòng)災(zāi)難恢復(fù)、一鍵回滾等功能。

deployment的創(chuàng)建

可以通過(guò)命令創(chuàng)建一個(gè)Deployment:

kubectl create deployment nginx --image=nginx:1.20.2

可以將創(chuàng)建的副本生成yaml文件:

kubectl get deployment nginx -o yaml > nginx.yaml

然后可以修改yaml文件的參數(shù),然后重新加載新的yaml文件:

kubectl replace -f nginx.yaml

也可以通過(guò)在線修改yaml文件,退出后直接生效:

kubectl edit deploy nginx

從yaml文件生成deployment:

apiVersion: v1
items:
- apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      deployment.kubernetes.io/revision: "2"
    creationTimestamp: "2022-02-08T07:52:05Z"
    generation: 2
    labels:
      app: nginx
    name: nginx
    namespace: default
    resourceVersion: "266395"
    uid: d4a3dbe9-5156-42cf-aaf5-3dfefccf4753
  spec:
    progressDeadlineSeconds: 600
    replicas: 1  # 副本數(shù)
    revisionHistoryLimit: 10  # 保留歷史的版本
    selector:
      matchLabels:
        app: nginx
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
      type: RollingUpdate
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: nginx
      spec:
        containers:
        - image: nginx:1.18.0
          imagePullPolicy: Always
          name: nginx
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        terminationGracePeriodSeconds: 30
  status:
    availableReplicas: 1
    conditions:
    - lastTransitionTime: "2022-02-08T07:52:10Z"
      lastUpdateTime: "2022-02-08T07:52:10Z"
      message: Deployment has minimum availability.
      reason: MinimumReplicasAvailable
      status: "True"
      type: Available
    - lastTransitionTime: "2022-02-08T07:52:05Z"
      lastUpdateTime: "2022-02-08T07:55:54Z"
      message: ReplicaSet "nginx-86dddd6686" is progressing.
      reason: ReplicaSetUpdated
      status: "True"
      type: Progressing
    observedGeneration: 2
    readyReplicas: 1
    replicas: 2
    unavailableReplicas: 1
    updatedReplicas: 1
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

deployment狀態(tài)說(shuō)明:

[root@k8s-master01 ~]# kubectl get deployments.apps -o wide 
NAME      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES   SELECTOR
mynginx   1/1     1            1           4d5h   mynginx      nginx    k8s-app=mynginx

NAME:Deployment名稱

READY:Pod的狀態(tài),已經(jīng)達(dá)到Ready的個(gè)數(shù)

UP-TO-DATE:已經(jīng)達(dá)到期望狀態(tài)的副本數(shù)

AVAILABLE:已經(jīng)可以使用的個(gè)數(shù)

AGE:程序運(yùn)行的時(shí)間

CONTAINERS:容器的自定義名稱

IMAGES:容器鏡像名稱

SELECTOR:管理的Pod標(biāo)簽

deployment的升級(jí)

查看創(chuàng)建nginx的deploy中鏡像的版本:可以看到是1.18.0

[root@k8s-master01 ~]# kubectl get deploy -o yaml | grep image
        - image: nginx:1.18.0
          imagePullPolicy: Always

我們可以使用set命令更新鏡像的版本:這里的set是設(shè)置的意思。

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.20.2 --record
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true
      - image: nginx:1.20.2
        imagePullPolicy: Always

可以使用下列命令查看升級(jí)過(guò)程:

[root@k8s-master01 ~]# kubectl rollout status deployment nginx
[root@k8s-master01 ~]# kubectl describe deployments.apps nginx

升級(jí)過(guò)程大概為:創(chuàng)建deploy時(shí),系統(tǒng)也會(huì)同時(shí)創(chuàng)建depoly的RS,更新deploy時(shí),系統(tǒng)會(huì)增加一個(gè)新的RS,舊的RS會(huì)相應(yīng)減少1,直到替換完成。

deployment的回滾

deployment的回滾可以回滾到上個(gè)版本,也可以回滾到指定指定版本,歷史版本的數(shù)量由下面這個(gè)參數(shù)控制:

    revisionHistoryLimit: 10

查看歷史版本:可以看到副本發(fā)生了幾次變化

[root@k8s-master01 ~]# kubectl rollout history deployment nginx 
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
8         kubectl set image deploy nginx nginx=1.18.1 --record=true
9         kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true

回滾到上一個(gè)版本:undo是撤銷的意思(我的理解是撤銷現(xiàn)在的版本回到之前的版本)

[root@k8s-master01 ~]# kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back

查看已經(jīng)由1.20.2回到了1.18.0版本:

[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=1.18.1 --record=true
      - image: nginx:1.18.0
        imagePullPolicy: Always

如果多次發(fā)布,回滾到指定版本:

[root@k8s-master01 ~]# kubectl rollout history deployment nginx 
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
9         kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
10        kubectl set image deploy nginx nginx=1.18.1 --record=true
您在 /var/spool/mail/root 中有新郵件
[root@k8s-master01 ~]# kubectl rollout history deployment nginx --revision=9
deployment.apps/nginx with revision #9
Pod Template:
  Labels:	app=nginx
	pod-template-hash=67d5b4548c
  Annotations:	kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2 --record=true
  Containers:
   nginx:
    Image:	nginx:1.20.2
    Port:	<none>
    Host Port:	<none>
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>
[root@k8s-master01 ~]# kubectl rollout undo deployment nginx --to-revision=9
deployment.apps/nginx rolled back
[root@k8s-master01 ~]# kubectl get deployments.apps nginx -o yaml | grep image
    kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.20.2
      - image: nginx:1.20.2
        imagePullPolicy: Always

可以看到以上信息版本已經(jīng)回滾到1.20.2版本;另外就算更新時(shí)候失敗,新鏡像拉取失敗,舊的副本不會(huì)停止工作,會(huì)一直持續(xù)工作,直到升級(jí)成功。

deployment的擴(kuò)容和縮容

使用命令擴(kuò)容:將nginx副本由一個(gè)變成兩個(gè),注意擴(kuò)容RS不會(huì)發(fā)生變化,因?yàn)镻od的本質(zhì)沒有發(fā)生改變。scale這個(gè)單詞在這里是縮放的意思。

[root@k8s-master01 ~]# kubectl get deployments.apps 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           17h
[root@k8s-master01 ~]# kubectl scale --replicas=2 deployment nginx 
deployment.apps/nginx scaled
[root@k8s-master01 ~]# kubectl get deployments.apps 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           17h

deployment的更新暫停及恢復(fù)

更新暫停:這條命令的作用是將更新暫停后,你使用kubectl set命令修改Pod的配置后不會(huì)立刻生效,即使多次修改也只是積累起來(lái)不會(huì)馬上生效。

[root@k8s-master01 ~]# kubectl rollout pause deployment nginx

暫?;謴?fù):解除之前的更新暫停功能,在暫停期間做過(guò)的修改將都會(huì)生效

[root@k8s-master01 ~]# kubectl rollout resume deployment nginx

deployment的注意項(xiàng)

  • .spec.revisionHistoryLimit: 10:設(shè)置保留RS的舊的版本的個(gè)數(shù),為0的話不保存

  • .spec.minReadySeconds:可選,指定新創(chuàng)建的Pod在沒有任何容器崩潰的情況下是為Ready的最小秒數(shù),默認(rèn)為0,就是一但創(chuàng)建就被視為可用

滾動(dòng)更新的策略:就是創(chuàng)建一個(gè)新的Pod,然后刪除一個(gè)舊的Pod,用新的替換舊的。

spec.strategy.type:更新deploy的方式,默認(rèn)是RollingUpdate

RollingUpdate:滾動(dòng)更新,可以指定maxSurge和maxUnavailable

maxUnavailable:指定在回滾或更新時(shí)最大不可用的Pod數(shù)量,默認(rèn)25%,也可以設(shè)置數(shù)字;如果為0那么maxSurge就不能為0 。

maxSurge:可以超過(guò)期望值的的最大Pod數(shù),可選,默認(rèn)為25%。如果為0那maxUnavailable就不能為0 。

Recreate:重建,先刪除舊的Pod,在創(chuàng)建新的Pod。

讀到這里,這篇“Deployment副本無(wú)狀態(tài)服務(wù)創(chuàng)建及水平擴(kuò)展的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI