入門Kubernetes - 滾動升級/回滾

chaney1992發表於2021-07-04

一、前言

 上一篇文章中對yaml檔案格式進行了解,並對k8s中各種主要資源通過yaml建立時的定義模板。接來下就進一步學習k8s的各種特點。並應用在示例中。

 接下來先實現.Net Core Api程式版本滾動升級、回滾,並在過程中進一步的對k8s進行了解

二、滾動升級

 1、推送新版本服務映象v3到docker hub。  

   

  2、實現k8s中滾動升級:

  新建k8sweb-dep.yaml檔案,用於建立Deployment資源:

apiVersion: apps/v1
kind: Deployment                             #定義Kubernetes資源的型別為Deployment
metadata:
  name: k8sweb-deployment                    #定義資源的名稱
spec:
  replicas: 3                                #定義執行Pod數量
  selector:                                  
    matchLabels:                             #定義該部署匹配哪些Pod
      name: k8sweb                           #定義Pod名稱
  template:
    metadata:                                #定義指定Pod的模板
      labels:                                #根據模板建立的Pod會被貼上該標籤,與上面的matchLabels對應
        name: k8sweb
    spec:
      containers:                            #容器定義
      - name: k8sweb                         #容器名
        image: cwsheng/k8sdemoweb:latest     #映象地址
        ports:
        - containerPort: 80
        imagePullPolicy: IfNotPresent        #不是最新則拉取

  表面上本次Deployment指定建立3個Pod、1個Deployment資源,實際上在Deployment和Pod中間還有ReplicaSet。

  Deployment 實際上一個兩層控制器,Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod。ReplicaSet 有版本區分,滾動更新的能力就是基於 ReplicaSet 的版本來實現。如下圖:

  

  a)執行命令:

kubectl apply -f k8sweb-dep.yaml

 b)檢視 deployment狀態:

kubectl get deployments

  結果如下:

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
k8sweb-deployment       3/3     3            3           54m
  • READY:當前處於 Running 狀態的 Pod 的個數/使用者期望的 Pod 個數(配置檔案設定的 replicas 值);
  • UP-TO-DATE:當前處於最新版本的 Pod 個數(Pod 的 Spec 部分與 Deployment 裡 Pod 模板裡定義的完全一致),在滾動更新過程中會有不一致的階段;
  • AVAILABLE:當前可用的 Pod 個數。

 c)檢視上圖中說描述的ReplicaSet資源:

kubectl describe replicaset

  結果如下:可以看出:Pod是由ReplicaSet控制著(建立、刪除)、ReplicaSet則由Deployment控制 。結果和上圖相同

  可發現:ReplicaSet 的名字是由 Deployment 名字 + 隨機字串,Pod 的名字是由 ReplicaSet 名字 + 隨機字串

  

 d)滾動更新

  該更新實際上是更新Pod中映象版本。

  修改deployment檔案中映象檔案進行更新,修改檔名加上版本號(k8s-dep-v3.yaml)

apiVersion: apps/v1
kind: Deployment                             #定義Kubernetes資源的型別為Deployment
metadata:
  name: k8sweb-deployment                    #定義資源的名稱
spec:
  replicas: 3                                #定義執行Pod數量
  selector:                                  
    matchLabels:                             #定義該部署匹配哪些Pod
      name: k8sweb                           #定義Pod名稱
  template:
    metadata:                                #定義指定Pod的模板
      labels:                                #根據模板建立的Pod會被貼上該標籤,與上面的matchLabels對應
        name: k8sweb
    spec:
      containers:                            #容器定義
      - name: k8sweb                         #容器名
        image:cwsheng/k8sdemoweb:v3          #映象地址
        ports:
        - containerPort: 80
        imagePullPolicy: IfNotPresent        #不是最新則拉取

  重新執行命令

kubectl apply -f k8s-dep-v3.yaml --record

  --record的作用是將當前命令記錄到 revision 記錄中,這樣我們就可以知道每個 revison 對應的是哪個配置檔案。

  檢視事件看資源如何變化:

kubectl describe deployment k8sweb-deployment

  

   Deployment 控制器根據修改後的 Pod 模板,建立新的 ReplicaSet(k8sweb-deployment-6594dd8ff7),Pod 數預設是 0,然後老的 ReplicaSet (k8sweb-deployment-954845689)Pod 數逐漸減少,

  新的 ReplicaSet 的 Pod 數逐漸增加,兩個過程交替進行,新的增加一個,老的減少一個,直到全部升級完成。

  檢視ReplicaSet狀態:舊的ReplicaSet的Pod 已經縮減為 0 個,新的 ReplicaSet 的 Pod 擴充套件為 3 個,每次配置修改重新部署都可能建立一個新的 ReplicaSet

PS F:\coding\project\k8s.demo\k8s> kubectl get rs
NAME                               DESIRED   CURRENT   READY   AGE
k8sweb-deployment-6594dd8ff7       0         0         0       2m14s
k8sweb-deployment-954845689        3         3         3       116s

三、回滾升級

 回滾操作前,需要知道當前的版本記錄情況:

 rollout 命令:

命令 說明
history 顯示 rollout 歷史
pause 標記提供的 resource 為中止狀態
resume 繼續一個停止的 resource
status 顯示 rollout 的狀態
undo 撤銷上一次的 rollout

 a)通過命令:kubectl rollout history 檢視歷史版本。

PS F:\coding\project\k8s.demo\k8s> kubectl rollout history deployment.apps/k8sweb-deployment
deployment.apps/k8sweb-deployment
REVISION  CHANGE-CAUSE
1         kubectl.exe apply --filename=k8s-dep.yaml --record=true
2         kubectl.exe apply --filename=k8s-dep-v3.yaml --record=true

  CHANGE-CAUSE 為命令內容。--record=true才會儲存,否則為空:<none> 

 b)通過命令:kubectl rollout undo 將deployment回滾到指定的版本

#指定恢復到上一個版本
kubectl rollout undo deployment/k8sweb-deployment

#恢復到指定版本1 
kubectl rollout undo deployment/k8sweb-deployment --to-revision=1

 c)配置歷史記錄儲存數量

  可以在 Deployment 配置檔案中通過 revisionHistoryLimit 屬性增加 revision 數量。

#……
spec:
  replicas: 3
  revisionHistoryLimit: 10        #Deployment revision history儲存在它控制的ReplicaSets中。預設儲存記錄5個
  strategy:                       #設定更新策略
    rollingUpdate:                #RollingUpdate更新設定
      maxSurge: 25%               #指定可以超過期望的Pod數量的最大數量。可以是一個絕對值(例如5)或者是期望的Pod數量的百分比(例如10%)。當MaxUnavailable為0時該值不可以為0。通過百分比計算的絕對值向上取整。預設值是1。
      maxUnavailable: 25%         #指定在升級過程中不可用Pod的最大數量。該值可以是一個絕對值(例如5),也可以是期望Pod數量的百分比(例如10%)。通過計算百分比的絕對值向下取整.
                     #如果.spec.strategy.rollingUpdate.maxSurge 為0時,這個值不可以為0。預設值是1。
type: RollingUpdate #Recreate:重建式更新(首先刪除現有的Pod物件,然後由控制器基於新模板重新建立新版本資源物件),rollingUpdate:滾動更新 #……

在配置時,使用者還可以使用Deployment控制器的spec.minReadySeconds屬性來控制應用升級的速度。新舊更替過程中,新建立的Pod物件一旦成功響應就緒探測即被認為是可用狀態,然後進行下一輪的替換。
而spec.minReadySeconds能夠定義在新的Pod物件建立後至少需要等待多長的時間才能會被認為其就緒,在該段時間內,更新操作會被阻塞。

總結:

 本次對k8s中Deployment、ReplicaSet、Pod之間的關係有了更深的理解,並通過配置實現了滾動升級、回滾的效果。後續還將繼續對k8s的其他特性繼續學習。

 

相關文章