創建部署詳見 Kubernetes(K8S) Deployment 部署 Pod
傳統應用升級,一般是V1.0的jar包,有一個應對 1.0 的 shell 啟動腳本,升級時,傳 2.0 的 jar包,配置 2.0 的 shell 腳本,
執行順序為,停1.0的服務,啟2.0的服務,有問題時,把2.0停掉再執行 1.0的shell腳本,手動恢復到1.0 版本,服務多的情況下,就很崩潰,而且服務會中斷不可用,
高并發、高可用系統普及的今天,服務的升級更新至少要做到“業務不中斷”,而滾動更新(Rolling-update)恰是滿足這一需求的一種系統更新升級方案,對于Kubernetes集群部署的Service來說,Rolling update就是指一次僅更新一個Pod,然后逐個進行更新,而不是在同一時刻將該Service下面的所有Pod shutdown,然后去更新,逐個更新可以避免將業務中斷;
RollingUpdate命令:通過自動擴縮容實作自動滾動升級
指令格式:kubectl rolling-update 舊控制器 新控制器 --image=新鏡像
1. 發布新版到阿里云鏡像倉庫
Last login: Tue Oct 18 16:39:53 2022 from 172.16.0.66
[root@localhost ~]# cd /opt/demo/
[root@localhost demo]# ll
總用量 17160
-rw-r--r--. 1 root root 17566582 10月 19 11:50 demojenkins.jar
-rw-r--r--. 1 root root 126 10月 18 17:56 Dockerfile
[root@localhost demo]# docker login [email protected] registry.cn-shanghai.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost demo]# docker build -t demo:2.0 .
Sending build context to Docker daemon 17.57MB
Step 1/4 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/4 : VOLUME /tmp
---> Using cache
---> a98cf1fbeb9d
Step 3/4 : ADD ./demojenkins.jar demojenkins.jar
---> 12bfc15e5295
Step 4/4 : ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]
---> Running in 2908dd94dfa7
Removing intermediate container 2908dd94dfa7
---> 3041db93b6df
Successfully built 3041db93b6df
Successfully tagged demo:2.0
[root@localhost demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo 2.0 3041db93b6df About a minute ago 122MB
demo 1.0 1952e02daef9 19 hours ago 122MB
openjdk 8-jdk-alpine a3562aa0b991 3 years ago 105MB
java 8 d23bdf5b1b1b 5 years ago 643MB
[root@localhost demo]# docker tag 3041db93b6df registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
[root@localhost demo]# docker push registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
The push refers to repository [registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft]
c38fa2e9a247: Pushed
ceaf9e1ebef5: Layer already exists
9b9b7f3d56a0: Layer already exists
f1b5933fe4b5: Layer already exists
2.0: digest: sha256:785c4707e7e629d22b5609310d8f945c107b277b94925cc0dbebdb3621b size: 1159
[root@localhost demo]#

2. 查看現有Pod資訊(升級后對比用)
# 查看創建的 Deployment 物件
[root@k8smaster ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
javademo1 3/3 3 3 19h
nginx 1/1 1 1 5d21h
# 查看 Deployment 上線狀態
[root@k8smaster ~]# kubectl rollout status deployment/javademo1
deployment "javademo1" successfully rolled out
# 查看 Deployment 物件創建的 ReplicaSet:
[root@k8smaster ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
javademo1-84dd5c9485 3 3 3 4h25m
nginx-f89759699 1 1 1 5d21h
# 查看 Deployment 物件操作 ReplicaSet 創建的 Pod,并顯示生成的標簽:
[root@k8smaster ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
javademo1-84dd5c9485-7vgkr 1/1 Running 0 4h20m app=javademo1,pod-template-hash=84dd5c9485
javademo1-84dd5c9485-8ckk6 1/1 Running 0 4h26m app=javademo1,pod-template-hash=84dd5c9485
javademo1-84dd5c9485-8hfmd 1/1 Running 0 4h20m app=javademo1,pod-template-hash=84dd5c9485
nginx-f89759699-5hkdw 1/1 Running 0 5d21h app=nginx,pod-template-hash=f89759699
#查看當前運行的 Pod
[root@k8smaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
javademo1-84dd5c9485-7vgkr 1/1 Running 0 4h31m
javademo1-84dd5c9485-8ckk6 1/1 Running 0 4h37m
javademo1-84dd5c9485-8hfmd 1/1 Running 0 4h31m
nginx-f89759699-5hkdw 1/1 Running 0 5d21h
# 查看 Deployeement 詳情
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-84dd5c9485 (3/3 replicas created)
Events: <none>
Deployment, kubectl get deployments 所顯示的欄位有:
- NAME:列出了名字空間中 Deployment 的名稱,
- READY:顯示應用程式的可用的“副本”數,顯示的模式是“就緒個數/期望個數”,
- UP-TO-DATE:顯示為了達到期望狀態已經更新的副本數,
- AVAILABLE:顯示應用可供用戶使用的副本數,
- AGE:顯示應用程式運行的時間,
ReplicaSet, kubectl get rs 輸出中包含以下欄位:
- NAME:列出名字空間中 ReplicaSet 的名稱;[Deployment名稱]-[隨機字串]
- DESIRED:顯示應用的期望副本個數,即在創建 Deployment 時所定義的值, 此為期望狀態;
- CURRENT:顯示當前運行狀態中的副本個數;
- READY:顯示應用中有多少副本可以為用戶提供服務;
- AGE:顯示應用已經運行的時間長度,
3. Deployment 升級
方法1
# 查看 Deployeement 詳情 里可以看到 Containers 內容
[root@k8smaster ~]# kubectl set image deployment/javademo1 vipsoft=registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
deployment.apps/javademo1 image updated
[root@k8smaster ~]# kubectl rollout status deployment/javademo1
deployment "javademo1" successfully rolled out
[root@k8smaster ~]#
方法2
# Containers:
# vipsoft:
# Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0 #將 :1.0 改成 2.0
# 一旦鏡像名(或 Pod 定義)發生了修改,則觸發 k8s 系統完成 Deployment 所有運行 Pod 的滾動升級操作
[root@k8smaster ~]# kubectl edit deployment/javademo1
deployment "javademo1" edited
查看已更新的 Deployment 的資訊
[root@k8smaster ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
javademo1 3/3 3 3 20h
nginx 1/1 1 1 5d22h
# 擴容了3個副本,將舊的 ReplicaSet 縮容到了 0 個副本,完成了Pod的升級
[root@k8smaster ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
javademo1-5476dc8d7d 3 3 3 11m
javademo1-84dd5c9485 0 0 0 5h17m
nginx-f89759699 1 1 1 5d22h
#只有最新的 5476dc8d7d 資訊
[root@k8smaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
javademo1-5476dc8d7d-bf6m5 1/1 Running 0 11m
javademo1-5476dc8d7d-ttt5b 1/1 Running 0 11m
javademo1-5476dc8d7d-zd4c7 1/1 Running 0 11m
nginx-f89759699-5hkdw 1/1 Running 0 5d22h
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-5476dc8d7d (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 3
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 0
[root@k8smaster ~]#

上面 Events: 可以看出,先 up javademo1-5476dc8d7d to 1,再停 javademo1-84dd5c9485 to 2,Pod 逐個 滾動式更新,如下圖:

Deployment 更新策略
在 Deployment 的定義中,可以通過 spec.strategy 指定 Pod 的更新策略,目前支持兩種更新策略:
Recreate(重建):設定 spec.strategy.type=Recreate,表示 Deployment 在更新 Pod 時,會先殺掉所有正在運行的 Pod,然后創建新的 Pod,
RollingUpdate(滾動更新):設定 spec.strategy.type=RollingUpdate,表示 Deployment 會以滾動更新的方式來逐個更新 Pod,同時,可以通過設定 spec.strategy.rollingUpdate 下的兩個引數(maxUnavailable 和 maxSurge)來控制滾動更新的程序,
4. Deployment 回滾
# 查看 Deployment 部署歷史, CHANGE-CAUSE 里沒有值,需要在創建 Deployment 時,使用 --record 引數,就可以在 CHANGE-CAUSE 列看到每個版本使用的命令了
[root@k8smaster ~]# kubectl rollout history deployment/javademo1
deployment.apps/javademo1
REVISION CHANGE-CAUSE
1 <none>
2 <none>
# 查看版本 2 的資訊:
[root@k8smaster ~]# kubectl rollout history deployment/javademo1 --revision=2
deployment.apps/javademo1 with revision #2
Pod Template:
Labels: app=javademo1
pod-template-hash=84dd5c9485
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
# kubeetl rollout undo deployment/javademo1 --to-revision=2 加上引數,回滾到指定版本
# 這邊沒加參加,回滾到上一個版本
[root@k8smaster ~]# kubectl rollout undo deployment/javademo1
deployment.apps/javademo1 rolled back
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-84dd5c9485 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 51m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 50m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 50m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 3
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 0
Normal ScalingReplicaSet 20s (x2 over 5h57m) deployment-controller Scaled up replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 17s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 14s (x2 over 5h51m) deployment-controller Scaled up replica set javademo1-84dd5c9485 to 3
Normal ScalingReplicaSet 9s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 0
[root@k8smaster ~]#
history 中 CHANGE-CAUSE 里沒有值,需要在創建 Deployment 時,使用 --record 引數,就可以在 CHANGE-CAUSE 列看到每個版本使用的命令了


看了很多貼子,這篇不錯:Pod 的升級和回滾
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/518535.html
標籤:其他
上一篇:如何在微信公眾號文章中插入word檔案和excel表格,超實用教程
下一篇:[Leetcode62]不同路徑
