Kubernetes 應用滾動更新

Kubernetes 應用版本號

在 Kubernetes 里,版本更新使用的不是 API 對象,而是兩個命令:kubectl applykubectl rollout,當然它們也要搭配部署應用所需要的 Deployment、DaemonSet 等 YAML 文件。

在 Kubernetes 里應用都是以 Pod 的形式運行的,而 Pod 通常又會被 Deployment 等對象來管理,所以應用的“版本更新”實際上更新的是整個 Pod。

Pod 是由 YAML 描述文件來確定的,更準確地說,是 Deployment 等對象里的字段 template。

所以 Kubernetes 就使用了“摘要”功能,用摘要算法計算 template 的 Hash 值作為“版本號”。

#獲取ngx的pod
kubectl get pod
#刪除其中一個
kubectl delete pod ngx-dep-6796688696-9zwxh
#再獲取ngx的pod,查看變化
kubectl get pod

在這里插入圖片描述
可以看到,Pod 名字里的那串隨機數“6796……”是沒有變化的,變化的是數字后面的pod編號的隨機字符。中間的隨機數字就是 Pod 模板的 Hash 值,也就是 Pod 的“版本號”。

如果變動了 Pod YAML 描述,比如把鏡像改成 nginx:stable-alpine會生成一個新的應用版本,kubectl apply 后就會重新創建 Pod。

命令操作

#刪除pod
kubectl delete -f nginx-deploy.yml
#查看刪除結果
kubectl get pod
# 不改yaml,再次生成pod
kubectl apply -f nginx-deploy.yml
#查看生成pod的版本號是否改變
kubectl get pod
#刪除pod
kubectl delete -f nginx-deploy.yml
#查看刪除結果
kubectl get pod
#編輯pod yaml,修改版本號
vim nginx-deploy.yml
# 重新生成pod
kubectl apply -f nginx-deploy.yml
#查看生成pod的版本號是否改變
kubectl get pod

更改后的yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:replicas: 2selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:stable-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol
~                              

在這里插入圖片描述
在這里插入圖片描述

不改變yaml,重新生成的pod的版本號還是6796688696
更改了yaml后,生成的pod的版本號就變成了574d5f9d4d

Kubernetes 實現應用更新

修改 ConfigMap,讓它輸出 Nginx 的版本號,方便 curl 查看版本:
nginx-config-cm.yml

apiVersion: v1
kind: ConfigMap
metadata:name: ngx-confdata:default.conf: |server {listen 80;location / {default_type text/plain;return 200'ver : $nginx_version\nsrv : $server_addr:$server_port\nhost: $hostname\n';}}

執行命令

# 編輯configMap內容
vim nginx-config-cm.yml 
# 更新 ConfigMap
kubectl apply -f nginx-config-cm.yml 

在這里插入圖片描述
創建 Pod 鏡像,明確地指定版本號是 1.21-alpine,實例數設置為 4 個

nginx-deploy-v1.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.21-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

執行命令

# 刪除現有的nginx pod
kubectl delete -f nginx-deploy.yml 
# 創建新版本的nginx yml
vim nginx-deploy-v1.yml
# 生成4個pod
kubectl apply -f nginx-deploy-v1.yml 
# 查看生成pod
kubectl get pod

在這里插入圖片描述

本地端口轉發到 Kubernetes 集群中的服務

# 查看service服務
kubectl get svc
# 綁定到svc service 轉發請求來查看狀態
kubectl port-forward svc/ngx-svc 8080:80 &
# 測試轉發
curl 127.1:8080
  • kubectl port-forward: 這個命令將本地端口轉發到 Kubernetes 集群中的某個資源(如 Pod 或 Service)。(只會將流量發送到一個特定的端點,而不是通過服務的負載均衡機制
  • svc/ngx-svc: 指定要轉發的目標資源,這里是名為 ngx-svc 的 Service。
  • 8080:80: 將本地的 8080 端口轉發到 ngx-svc 服務的 80 端口。
  • &: 將該命令放入后臺運行,這樣可以繼續在終端中執行其他命令。
    在這里插入圖片描述
    鏡像升級到 nginx:1.22-alpine

為了能夠觀察到應用更新的過程,我們還需要添加一個字段 minReadySeconds,讓 Kubernetes 在更新過程中等待一點時間,確認 Pod 沒問題才繼續其余 Pod 的創建工作。

minReadySeconds 這個字段不屬于 Pod 模板,所以它不會影響 Pod 版本

nginx-deploy-v2.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:minReadySeconds: 15      # 確認Pod就緒的等待時間replicas: 4selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.22-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol
~                               

執行命令

# 創建文件內容,把上面內容copy進來
vim nginx-deploy-v2.yml
# 更新成的新的pod
kubectl apply -f nginx-deploy-v2.yml
# 查看滾動更新過程
kubectl rollout status deployment ngx-dep
# 綁定到svc service 轉發請求來查看狀態
kubectl port-forward svc/ngx-svc 8080:80 &
# 測試轉發
curl 127.1:8080
# 查看滾動詳情信息
kubectl describe deploy ngx-dep

在這里插入圖片描述
在這里插入圖片描述
滾動更新圖

  • 一開始的時候 V1 Pod(即 ngx-dep-54b865d75)的數量是 4;
  • 當“滾動更新”開始的時候,Kubernetes 創建 1 個 V2 Pod(即 ngx-dep-d575d5776),并且把 V1 Pod 數量減少到 3;
  • 接著再增加 V2 Pod 的數量到 2,同時 V1 Pod 的數量變成了 1;
  • 最后 V2 Pod 的數量達到預期值 4,V1 Pod 的數量變成了 0,整個更新過程就結束了。

滾動更新”就是由 Deployment 控制的兩個同步進行的“應用伸縮”操作,老版本縮容到 0,同時新版本擴容到指定值,是一個“此消彼長”的過程。

在這里插入圖片描述

Kubernetes管理應用更新

如果更新過程中發生了錯誤或者更新后發現有 Bug,可以隨時使用 kubectl rollout pause 來暫停更新,檢查、修改 Pod,或者測試驗證,如果確認沒問題,再用 kubectl rollout resume 來繼續更新。

注意:它們只支持 Deployment,不能用在 DaemonSet、StatefulSet 上( 1.24 之后支持了 StatefulSet 的滾動更新)

Kubernetes應用版本回退

查看更新歷史使用的命令是 kubectl rollout history

#查看有哪些版本
kubectl rollout history deployment ngx-dep
#查看每個版本的詳細信息
kubectl rollout history deployment ngx-dep --revision=2
# 回退到上一個版本
kubectl rollout undo  deploy ngx-dep
# 回退到指定版本(--to-revision=1不能有空格)
kubectl rollout undo  deploy ngx-dep --to-revision=1

在這里插入圖片描述

kubectl rollout undo 的操作過程其實和 kubectl apply 是一樣的,執行的仍然是“滾動更新”,只不過使用的是舊版本 Pod 模板,把新版本 Pod 數量收縮到 0,同時把老版本 Pod 擴展到指定值。

在這里插入圖片描述

Kubernetes 添加更新描述

在Deployment 的 metadata 里加上一個新的字段 annotations。annotations 字段的含義是“注解”“注釋”,形式上和 labels 一樣,都是 Key-Value,也都是給 API 對象附加一些額外的信息,但是用途上區別很大。

  • annotations 添加的信息一般是給 Kubernetes 內部的各種對象使用的,有點像是“擴展屬性”;
  • labels 主要面對的是 Kubernetes 外部的用戶,用來篩選、過濾對象的。

annotations 里的值可以任意寫,Kubernetes 會自動忽略不理解的 Key-Value,但要編寫更新說明就需要使用特定的字段 kubernetes.io/change-cause。

創建 2 個版本的 Nginx 應用,同時添加更新說明:

nginx-deploy-v1.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depannotations:   kubernetes.io/change-cause: v1, ngx=1.21spec:replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.21-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

nginx-deploy-v2.yml

deployment.apps/ngx-dep 
REVISION  CHANGE-CAUSE
3         v1, ngx=1.21
4         update to v2, ngx=1.22[root@iZbp12ghzy6koox6fqt0svZ ~]# cat nginx-deploy-v2.yml 
apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depannotations:    kubernetes.io/change-cause: update to v2, ngx=1.22spec:minReadySeconds: 15      # 確認Pod就緒的等待時間replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.22-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

執行命令

vim nginx-deploy-v1.yml 
kubectl apply -f nginx-deploy-v1.yml
vim nginx-deploy-v2.yml 
kubectl apply -f nginx-deploy-v2.yml
#查看滾動更新
kubectl rollout status deployment ngx-dep
#查看一下更新歷史:
kubectl rollout history deployment ngx-dep 

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14475.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nssctf——web

[SWPUCTF 2021 新生賽]gift_F12 1.打開環境后,這里說要900多天會有flag,這是不可能的 2.f12查看源碼,然后在html中查找flag (在最上方的欄目中,或者按ctrlf) [SWPUCTF 2021 新生賽]jicao 1.打開環境是一段…

Fragment問題:java.lang.IllegalStateException

錯誤提示: Process: com.example.accountapp, PID: 3987 java.lang.IllegalStateException: Could not execute method for android:onClick …

Vue速成學習筆記

這兩天速成了一下Vue,在這里記錄一下相關的筆記,之后有時間詳細學Vue的時候再來回顧一下! 一、Vue理解 1、Vue的核心特征:雙向綁定。 在網頁中,存在視圖和數據。在Vue之前,需要使用JavaScript編寫復雜的邏…

web前端面試題

web前端面試題 1、前端如何實現優化性能 (1)減少網絡時間 ①使用DNS緩存技術 ? ②減少需要傳輸的文件尺寸 ? ③加快文件傳輸速度 (2)減少發送的請求數量 ①利用瀏覽器緩存 ? ②使用合并的圖片文件 (3)提高瀏覽器下載的并發度 ①JS文件放在HTML文檔最后 ? ②使用多個域名 (…

音視頻及H264/H256編碼相關原理

一、音視頻封裝格式原理: 我們播放的視頻文件一般都是用一種封裝格式封裝起來的,封裝格式的作用是什么呢?一般視頻文件里不光有視頻,還有音頻,封裝格式的作用就是把視頻和音頻打包起來。 所以我們先要解封裝格式&#…

谷歌上架,個人號比企業號好上?“14+20”封測如何解決,你知道了嗎

在Google Play上架應用,對開發者而言,既是挑戰也是機遇。隨著谷歌政策的不斷更新,特別是要求2023年11月13日后注冊的個人開發者賬號在發布正式版應用前,必須經過20人連續14天的封閉測試。 這一政策的改變使得許多開發者開始考慮使…

什么是物聯網通信網關?-天拓四方

在信息化、智能化的時代,物聯網技術的廣泛應用正在逐漸改變我們的生活方式。物聯網通過各種傳感器和設備,將現實世界與數字世界緊密相連,從而實現智能化、自動化的生活和工作方式。作為物聯網生態系統中的重要組成部分,物聯網通信…

【數據結構】堆(Heep)

???專欄:數據結構 🧑?🎓個人主頁:SWsunlight 目錄 一、堆: 定義: 性質: 大、小根堆: 二、實現堆(完全二叉樹): 前言: …

四、Filter

Filter簡介 Filter 的基本功能是對Servlet容器調用Servlet的過程進行攔截,從而在Servlet進行響應處理的前后實現一些特殊的功能.在Servlet API 中定義了三個接口類來供開發人員編寫Filter 程序:Filter,FilterChain,FilterConfigFilter 程序是一個實現了…

Spring:Spring事務失效的各種場景以及解決方法

一、前言 Spring事務是指Spring框架中提供的事務管理功能,它可以幫助開發者簡化事務管理的復雜性,提高代碼的可維護性和可擴展性。本文將總結并分析Spring事務失效的各種場景,幫助你全面了解事務失效的原因和解決方案。 二、Spring事務失效的…

51匯編--數碼管顯示

;將內部RAM30H~32H單元中存儲的6位十進制數顯示在6個數碼管上。 ;要求編寫將一個內存單元中的壓縮BCD碼轉換為兩個七段顯示碼的子程序和 ;延時子程序。不允許在程序中給30H、31H和32H單元賦值,要通過存 ;儲器窗口賦值。嘗試改變點亮數碼管的時間&#xf…

Linux軟硬鏈接及動靜態庫

軟硬鏈接與動靜態庫 軟連接 創建鏈接的方法: ln -s test1.txt test2.txt 其中ln 是link(鏈接),-s 是soft(軟),后者鏈接前者。 此時打開test2.txt,發現其中內容與test.txt一致。那么軟連接到底建立了什么聯系?…

輕松購物,盡在購物網

在忙碌的生活中,想要找到心儀的商品,卻總是苦于沒有時間和精力去實體店挑選?別擔心,購物網為您提供一站式的購物體驗。無論是時尚服飾、家居用品,還是美食特產,這里都能滿足您的需求。只需輕輕一點&#xf…

監聽element-ui表格滾動事件

當element-ui表格高度寫死之后,表格內容超出高度就會在右側顯示滾動條,監聽滾動事件 首先給表格加ref,ref"refTable" 然后在mounted生命周期里寫監聽事件 mounted() {this.$refs.refTable.$el.onwheel (e) > {console.log(滾…

深入解析線程上下文切換的原理與優化策略

深入解析線程上下文切換的原理與優化策略 定義觸發條件線程上下文切換的過程線程上下文切換的開銷減少上下文切換的方法示例代碼總結 線程上下文切換(Thread Context Switch)是操作系統調度機制的重要組成部分。它涉及保存當前線程的狀態并恢復新線程的狀…

vue中使用ant的rangePicker設置禁選時間和時間格式

<a-range-pickerstyle"width: 100%":disabled-date"disabledDate"v-model:value"time"valueFormat"YYYY-MM-DD" />valueFormat設置時間格式YYYY-MM-DD 通過dayjs獲取時間&#xff0c;return過濾后的時間 const disabledDate (…

安裝apex時遇到的問題

Apex是混合精度庫&#xff0c;安裝過程中常常出現各種問題&#xff0c;在此記錄一下 首先&#xff0c;不能使用pip install apex,這是兩個完全不同的庫&#xff0c;需要去官網下載 其次&#xff0c;參考官網安裝時可能會報錯&#xff1a;could not build wheels for apex, whic…

C/C++運行時庫和UCRT系統通用運行時庫總結及問題實例分享

目錄 1、概述 2、不同版本的Visual Studio對應的運行時庫說明 3、在Windbg10.0安裝目錄中獲取UCRT通用運行時庫 4、微軟官網對UCRT通用運行時庫的相關說明 5、使用Visual Studio 2017開發軟件初期遇到的UCRT通用運行時庫問題 6、如何查看軟件依賴了哪些C/C運行時庫&#…

后端雪花算法主鍵ID傳到前端變了

Mybatis Plus 的主鍵策略&#xff1a; /*** id*/TableId(type IdType.ASSIGN_ID)private Long id; 這個主鍵策略會用雪花算法生成一個 19位的ID&#xff0c;比如 1791006670084734978 現象 后端生成的 id 是正常的&#xff0c;通過 swagger 文檔此時獲取到的 id 也和數據庫中…

leetcode-盛水最多的容器-109

題目要求 思路 1.正常用雙循環外循環i從0開始&#xff0c;內循環從height.size()-1開始去計算每一個值是可以的&#xff0c;但是因為數據量太大&#xff0c;會超時。 2.考慮到超時&#xff0c;需要優化一些&#xff0c;比如第一個選下標1&#xff0c;第二個選下標3和第一個選下…