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