首頁 > 軟體

Deployment副本無狀態服務建立及水平擴充套件

2022-03-18 19:00:07

本文單詞:

replace(/rɪˈpleɪs/)替換、取代;在本文中是修改後的yaml檔案替換舊的yaml檔案

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

describe(/dɪˈskraɪb/)描述;在本文中是說記錄過程

scale(/skeɪl/)縮放;在本文中是說縮放副本的個數

pause(/pɔːz/)暫停;在本文中是說暫停更新

resume(/rɪˈzjuːm/)恢復;在本文中是說從暫停恢復到正常狀態

RC(Replication Controller)和RS(ReplicaSet)

(幾乎棄用)RC是複製控制器,確保Pod數量達到期望值,保證副本始終處於可用的狀態。

(不建議單獨使用)RS是RC的下一代,支援標籤集。

無狀態服務Deployment意思就是無狀態的。。。用於部署無狀態的服務。

類似網頁存取之類的請求就是無狀態的,每次請求都包含了需要的所有資訊,每次請求都和上次沒有關係。
Deployment是最常用的控制器。一般用於管理維護企業內部的無狀態的微服務,比如configserver、zuul、springboot。可以管理多個副本的Pod實現無縫遷移、自動擴容縮容、自動災難恢復、一鍵回滾等功能。

deployment的建立

可以通過命令建立一個Deployment:

kubectl create deployment nginx --image=nginx:1.20.2

可以將建立的副本生成yaml檔案:

kubectl get deployment nginx -o yaml > nginx.yaml

然後可以修改yaml檔案的引數,然後重新載入新的yaml檔案:

kubectl replace -f nginx.yaml

也可以通過線上修改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  # 副本數
    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狀態說明:

[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的狀態,已經達到Ready的個數

UP-TO-DATE:已經達到期望狀態的副本數

AVAILABLE:已經可以使用的個數

AGE:程式執行的時間

CONTAINERS:容器的自定義名稱

IMAGES:容器映象名稱

SELECTOR:管理的Pod標籤

deployment的升級

檢視建立nginx的deploy中映象的版本:可以看到是1.18.0

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

我們可以使用set命令更新映象的版本:這裡的set是設定的意思。

[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

可以使用下列命令檢視升級過程:

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

升級過程大概為:建立deploy時,系統也會同時建立depoly的RS,更新deploy時,系統會增加一個新的RS,舊的RS會相應減少1,直到替換完成。

deployment的回滾

deployment的回滾可以回滾到上個版本,也可以回滾到指定指定版本,歷史版本的數量由下面這個引數控制:

    revisionHistoryLimit: 10

檢視歷史版本:可以看到副本發生了幾次變化

[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

回滾到上一個版本:undo是復原的意思(我的理解是復原現在的版本回到之前的版本)

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

檢視已經由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

如果多次釋出,回滾到指定版本:

[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

可以看到以上資訊版本已經回滾到1.20.2版本;另外就算更新時候失敗,新映象拉取失敗,舊的副本不會停止工作,會一直持續工作,直到升級成功。

deployment的擴容和縮容

使用命令擴容:將nginx副本由一個變成兩個,注意擴容RS不會發生變化,因為Pod的本質沒有發生改變。scale這個單詞在這裡是縮放的意思。

[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的更新暫停及恢復

更新暫停:這條命令的作用是將更新暫停後,你使用kubectl set命令修改Pod的設定後不會立刻生效,即使多次修改也只是積累起來不會馬上生效。

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

暫停恢復:解除之前的更新暫停功能,在暫停期間做過的修改將都會生效

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

deployment的注意項

  • .spec.revisionHistoryLimit: 10:設定保留RS的舊的版本的個數,為0的話不儲存
  • .spec.minReadySeconds:可選,指定新建立的Pod在沒有任何容器崩潰的情況下是為Ready的最小秒數,預設為0,就是一但建立就被視為可用

捲動更新的策略:就是建立一個新的Pod,然後刪除一箇舊的Pod,用新的替換舊的。

spec.strategy.type:更新deploy的方式,預設是RollingUpdate

RollingUpdate:捲動更新,可以指定maxSurge和maxUnavailable

maxUnavailable:指定在回滾或更新時最大不可用的Pod數量,預設25%,也可以設定數位;如果為0那麼maxSurge就不能為0 。

maxSurge:可以超過期望值的的最大Pod數,可選,預設為25%。如果為0那maxUnavailable就不能為0 。

Recreate:重建,先刪除舊的Pod,在建立新的Pod。

以上就是Deployment副本無狀態服務及水平擴充套件的詳細內容,更多關於Deployment無狀態服務擴充套件的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com