入門Kubernetes - 滾動升級/回滾


一、前言

 上一篇文章中對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的其他特性繼續學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM