Kubernetes 滾動更新及回滾

2020-12-22 abcdocker運維博客

Kubernetes Pod滾動升級及回滾

Kubernetes

當集群中的某個服務需要升級時,我們需要停止目前與該服務相關的所有Pod,然後重新拉取鏡像並啟動。如果集群規模比較大,則這個工作就變成了一個挑戰,而且先全部停止然後逐步升級的方式會導致長時間的服務不可用。Kubernetes提供了rolling-update滾動升級功能來解決上述問題

滾動升級通過執行kubectl rolling-update命令一鍵完成,該命令創建了一個新的RC,然後自動控制舊的RC中的Pod副本數量逐漸減少到0,同時新的RC中的Pod副本的數量從0逐步增加到目標值,最終實現了Pod的升級。系統會要求新的RC和舊的RC在相同的命名空間下

創建演示文件

cat >>abcdocker-test.yaml <<EOFapiVersion: apps/v1beta2kind:Deploymentmetadata: name: nginx-deploymentspec: replicas:3 selector: matchLabels: app: nginxtemplate: metadata: labels: app: nginx spec: containers:- name: nginx image: nginx:1.13.0-alpine imagePullPolicy:IfNotPresent ports:- containerPort:80EOF創建

[root@abcdocker ~]# kubectl apply -f abcdocker-test.yaml --record已運行的Pod副本數量有3個

[root@abcdocker ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deployment-859fff59fb-488zc1/1Running075snginx-deployment-859fff59fb-b8vwq 1/1Running075snginx-deployment-859fff59fb-mzbwt 1/1Running075sKubernetes 更新

更新實際上就是替換鏡像版本,有以下幾種方式進行更新

① 修改deployment文件進行更新

sed -i 's#1.13.0-alpine#1.10.0-alpine#g' abcdocker-test.yamlkubectl apply -f abcdocker-test.yaml --record

我們可以看到pod執行過程是等待新的pod啟動完成,在進行銷毀舊的pod,這樣就完成了集群的更新工作

--record的作用是將當前命令記錄到 revision 記錄中,這樣我們就可以知道每個 revison 對應的是哪個配置文件。② 直接修改deployment進行更新鏡像deployment文件支持動態更新,我們使用edit參數可以直接更新deployment文件

[root@abcdocker ~]# kubectl get deploymentNAME READY UP-TO-DATE AVAILABLE AGEnginx-deployment 3/33314m[root@abcdocker ~]# kubectl edit deployments nginx-deploymentdeployment.extensions/nginx-deployment edited#再次查看pod的時候已經被更新[root@abcdocker ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deployment-5fc7b9784f-dq56f 0/1Pending01snginx-deployment-5fc7b9784f-r6v9w 1/1Running045snginx-deployment-66c45bd65-4f8zn1/1Terminating06m47snginx-deployment-66c45bd65-64zsl1/1Running07m22snginx-deployment-66c45bd65-ktjcd 1/1Running06m56s不太推薦使用edit進行編輯,退出即保存,同時也會在我們的rollout裡面產生一個版本號

③ 接下來是使用kubectl set命令進行替換鏡像命令格式如下

kubectl set image deployment/SVC_NAME -n namespace_name container_name=images:v1#注意後面是容器名稱,並不是svc名稱本次環境演示

[root@abcdocker ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.10.1deployment.extensions/nginx-deployment image updated回滾

我們使用上面的更新應用時Kubernetes都會記錄下當前的配置文件,保存為一個revision (版本),這樣就可以通過這個版本回滾到特定的時間

我們可以通過rollout參數查看當前版本號

#查看revison歷史記錄[root@abcdocker ~]# kubectl rollout history deployment nginx-deploymentdeployment.extensions/nginx-deploymentREVISION CHANGE-CAUSE1 kubectl apply --filename=abcdocker-test.yaml --record=true2 kubectl apply --filename=abcdocker-test.yaml --record=true3 kubectl apply --filename=abcdocker-test.yaml --record=true4 kubectl apply --filename=abcdocker-test.yaml --record=true#nginx-deployment為deployment名稱,可以通過kubectl get deployment查看到我們可以通過kubectl rollout undo 將deployment回滾到指定的版本,這裡模擬回滾到第一個版本

默認情況下,如果不加–to-revision=版本號,默認回退到上一個版本

[root@yzsjhl82-135 tmp]# kubectl rollout undo deployment nginx-deployment --to-revision=1deployment.extensions/nginx-deployment rolled back[root@yzsjhl82-135 tmp]#[root@yzsjhl82-135 tmp]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deployment-589c48ccfb-c74dk 1/1Running05m36snginx-deployment-589c48ccfb-r6nmr 1/1Running07m7snginx-deployment-589c48ccfb-wl8x9 1/1Running06m17snginx-deployment-859fff59fb-cswks 0/1ContainerCreating04s如果我們使用kubectl apply -f xx.yaml不加任何參數,那麼在rollout將不會記錄任何描述

如果我們想讓rollout裡面記錄的文件帶有版本號,只需要將文件修改一個名稱更新時加上–record參數就可以,下面就會顯示版本號

[root@abcdocker ~]# cp abcdocker-test.yaml abcdocker-v1.yaml[root@abcdocker ~]# kubectl apply -f abcdocker-v1.yaml --recorddeployment.apps/nginx-deployment configured[root@abcdocker ~]# kubectl rollout history deployment nginx-deploymentdeployment.extensions/nginx-deploymentREVISION CHANGE-CAUSE3 kubectl apply --filename=abcdocker-test.yaml --record=true4 kubectl apply --filename=abcdocker-test.yaml --record=true5 kubectl apply --filename=abcdocker-test.yaml --record=true6 kubectl apply --filename=abcdocker-test.yaml --record=true7 kubectl apply --filename=abcdocker-v1.yaml --record=truerollout命令參數如下

[root@yzsjhl82-135 tmp]# kubectl rollout -hManage the rollout of a resource.Valid resource types include:#支持的資源格式* deployments* daemonsets* statefulsetsExamples:# Rollback to the previous deployment kubectl rollout undo deployment/abc# Check the rollout status of a daemonset kubectl rollout status daemonset/fooAvailableCommands: history 顯示 rollout 歷史 pause 標記提供的 resource 為中止狀態 resume 繼續一個停止的 resource status 顯示 rollout 的狀態 undo 撤銷上一次的 rollout參數使用格式kubectl rollout [XXXX] deployment nginx-deployment默認配置下,Kubernetes 只會保留最近的幾個 revision,可以在 Deployment 配置文件中通過 revisionHistoryLimit 屬性增加 revision 數量。

revisionHistoryLimit(歷史版本記錄):Deployment revision history存儲在它控制的ReplicaSets中。默認保存記錄5個    .spec.revisionHistoryLimit 是一個可選配置項,用來指定可以保留的舊的ReplicaSet數量。該理想值取決於心Deployment的頻率和穩定性。如果該值沒有設置的話,默認所有舊的Replicaset或會被保留,將資源存儲在etcd中,是用kubectl get rs查看輸出。每個Deployment的該配置都保存在ReplicaSet中,然而,一旦刪除的舊的RepelicaSet,Deployment就無法再回退到那個revison了。  如果將該值設置為0,所有具有0個replica的ReplicaSet都會被刪除。在這種情況下,新的Deployment rollout無法撤銷,因為revision history都被清理掉了。PS:為了保存版本升級的歷史,需要再創建Deployment對象時,在命令中使用"--record"選項一般配合revisionHistoryLimit使用的strategy (更新策略)

strategy(更新策略):  .spec.strategy 指定新的Pod替換舊的Pod的策略。.spec.strategy.type 可以是"Recreate"或者是"RollingUpdate"。"RollingUpdate"是默認值。  Recreate:重建式更新,就是刪一個建一個。類似於ReplicaSet的更新方式,即首先刪除現有的Pod對象,然後由控制器基於新模板重新創建新版本資源對象。  rollingUpdate:滾動更新,簡單定義更新期間pod最多有幾個等。可以指定maxUnavailable 和 maxSurge 來控制 rolling update 進程。  maxSurge:.spec.strategy.rollingUpdate.maxSurge 是可選配置項,用來指定可以超過期望的Pod數量的最大個數。該值可以是一個絕對值(例如5)或者是期望的Pod數量的百分比(例如10%)。當MaxUnavailable為0時該值不可以為0。通過百分比計算的絕對值向上取整。默認值是1。  例如,該值設置成30%,啟動rolling update後新的ReplicatSet將會立即擴容,新老Pod的總數不能超過期望的Pod數量的130%。舊的Pod被殺掉後,新的ReplicaSet將繼續擴容,舊的ReplicaSet會進一步縮容,確保在升級的所有時刻所有的Pod數量和不會超過期望Pod數量的130%。  maxUnavailable:.spec.strategy.rollingUpdate.maxUnavailable 是可選配置項,用來指定在升級過程中不可用Pod的最大數量。該值可以是一個絕對值(例如5),也可以是期望Pod數量的百分比(例如10%)。通過計算百分比的絕對值向下取整。如果.spec.strategy.rollingUpdate.maxSurge 為0時,這個值不可以為0。默認值是1。  例如,該值設置成30%,啟動rolling update後舊的ReplicatSet將會立即縮容到期望的Pod數量的70%。新的Pod ready後,隨著新的ReplicaSet的擴容,舊的ReplicaSet會進一步縮容確保在升級的所有時刻可以用的Pod數量至少是期望Pod數量的70%。PS:maxSurge和maxUnavailable的屬性值不可同時為0,否則Pod對象的副本數量在符合用戶期望的數量後無法做出合理變動以進行更新操作。  在配置時,用戶還可以使用Deployment控制器的spec.minReadySeconds屬性來控制應用升級的速度。新舊更替過程中,新創建的Pod對象一旦成功響應就緒探測即被認為是可用狀態,然後進行下一輪的替換。而spec.minReadySeconds能夠定義在新的Pod對象創建後至少需要等待多長的時間才能會被認為其就緒,在該段時間內,更新操作會被阻塞。這裡我提供revisionHistoryLimit和rollingUpdate的yaml文件 (完整yaml如下)

[root@abcdocker ~]# cat abcdocker-test.yamlapiVersion: apps/v1beta2kind:Deploymentmetadata: name: nginx-deploymentspec: replicas:3 revisionHistoryLimit:10 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge:25% maxUnavailable:25% type:RollingUpdatetemplate: metadata: labels: app: nginx spec: containers:- name: nginx image: nginx:1.13.0 imagePullPolicy:IfNotPresent ports:- containerPort:80具體參數可以查看上面解釋!

相關焦點

  • Kubernetes 疑難雜症排查分享: 詭異的 No route to host
    一、問題反饋有用戶反饋 Deployment 滾動更新的時候,業務日誌偶爾會報 「No route to host」 的錯誤。二、問題分析 之前沒遇到滾動更新會報 「No route to host」 的問題,我們先看下滾動更新導致連接異常有哪些常見的報錯:Connection reset by peer: 連接被重置。通常是連接建立過,但 server 端發現 client 發的包不對勁就返回 RST,應用層就報錯連接被重置。
  • Kubernetes 入門命令整理及解析
    方便記憶的規律kubernetes命令有一些相通的規律,可以幫助我們快速掌握。更改資源信息kubectl apply -f xxx.yml 依照某個資源文件申請更改kubectl apply -f httpd.v1.yml --record # 登記到revision,用於回滾kubectl rollout history
  • Android Q「時間膠囊」功能曝光:支持應用更新「回滾」
    近日在網上洩露的Android Q AOSP版本又曝光了新系統的新功能,新版Android系統可能允許用戶「回滾」應用。換句話說,如果用戶升級某個應用後導致系統的一些功能無法正常使用的話,用戶可以將該應用降級到之前的版本。
  • 開發人員Kubernetes的實用指南
    自動更新圖像標籤,無需手動更改在K8s manifest文件。一鍵構建/部署/推送不同的應用程式,非常適合微服務架構。支持開發和生產環境,只需運行一次manifests,或持續監控其變化。要詳細的Skaffold設置和使用的文檔,請查閱其官方文檔。
  • 誤升儘快回滾!微軟誤發Win 10 Build 18947更新 控制中心全改
    7月25日消息,昨晚微軟因配置上的問題,誤將本應推送到內部測試通道的Windows 10 Build 18947版本更新洩露。這款誤發的預覽版本顯示了不同於以往的開始菜單及控制中心。如果無意中參與升級的用戶不回滾系統的話,新系統中的眾多BUG和安全漏洞可能會使電腦完全無法使用,因為Build 18947是沒有經過內部測試的。Windows 10 Build 18947的開始菜單更新一改過去動態磁貼的樣式,而是採用了類似程序抽屜的菜單布局,平板模式中的菜單居中顯示,且背景透明化。有網友表示新版菜單「順眼多了」,但也有網友稱「醜拒」。
  • Rainbond 5.1.4 發布,複雜微服務架構整體升級和回滾
    今天為大家帶來Rainbond 5.1系列第四個更新版本,本次版本更新的主要內容是複雜微服務架構應用整體升級和回滾,能實現複雜微服務架構的持續交付
  • 《控制》發布更新加入DRM 出現問題並立刻回滾
    昨天,《控制》1.04更新檔,雖然更新說明裡只說了增加照片模式,但事實上本次更新還為PC版加入了DRM(數字版權管理,也就是反盜版的加密技術),不過這次DRM卻給遊戲帶來了意料之外的問題。1.04更新說明對DRM隻字未提:通用:- 增加照片模式,可在暫停菜單中選擇- 修復bug,提升戰鬥和總體操作性能:- 提升全平臺穩定性
  • 王者榮耀:后羿皮膚重做更新,露娜重做已回滾,或將不重做技能
    王者榮耀體驗服今日進行一次更新,露娜和馬可波羅恢復使用,但是並非新版露娜和馬可波羅,直接把兩個英雄回滾至正式服配置。露娜重做問題其實不大,但是回滾配置讓人聯想到策劃被懟事件,這事件評論有接近兩千條,並且大部分都是不支持露娜重做,並稱重做就退遊,或許官方會重新考慮,可能不會重做技能!
  • 「圖」微軟誤發Windows 10 Build 18947更新:Slow和RP通道可回滾
    Jason還提供了有關如何回滾至此前版本的說明。目前Release Preview和Slow通道分別處於19H1和19H2兩個開發分支中,所以顯然不應該接收20H1分支的預覽版。而Fast通道將會被下個預覽版所替代。
  • 滾動的天空2什麼時候更新 新版本更新時間一覽
    滾動的天空2什麼時候更新?遊戲每次更新總會帶來許許多多的新內容、新玩法,那麼滾動的天空2什麼更新呢?小編為大家帶來解答!
  • 深入解析Kubernetes service 概念
    在Kubernetes中,每個節點都安裝了kube-proxy,kube-proxy通過kubernetes中固有的watch請求方法持續監聽apiserver。該方式在大規模情況下存在一些性能問題;首先,iptables沒有增量更新的功能,更新一條規則需要整體flush,更新時間長,這段時間之內流量會有不同程度的影響;此外,iptables規則串行匹配,沒有預料到Kubernetes這種在一個機器上會有很多規則的情況,流量需要經過所有規則的匹配後在進行轉發,對時間和內存都是極大的小號,尤其在大規模情況下對性能的影響十分明顯
  • Kubernetes持續部署指南
    持續集成是在每次應用程式更新時構建和測試的實踐。通過以少量的工作,更早地檢測到錯誤並立即解決。集成完成並且所有測試都通過之後,我們就能夠添加持續交付到自動化發布和部署的流程中。使用CI/CD的項目可以更頻繁、更可靠地發布。
  • Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版
    在發布此博客時,已更新以下CSI驅動程序以支持Beta版的卷快照:GCE永久磁碟CSI驅動程序Portworx CSI驅動程序NetApp Trident CSI驅動程序其他CSI驅動程序的Beta級別卷快照支持正在掛起,應該很快就會提供。
  • kubernetes面試題匯總
    微信公眾號搜索  DevOps和k8s全棧技術 ,關注之後,在後臺回復 k8s面試題,可獲取最新完整的kubernetes面試題pdf文檔
  • 王者榮耀體驗服更新:五位英雄調整,女媧繼續削弱,達摩控制回滾
    王者榮耀體驗服12月6日進行了一次小更新,涉及到女媧、后羿、魯班七號、鍾無豔、達摩、蘇烈的調整,其中女媧、魯班七號、后羿繼續削弱,蘇烈、鍾無豔、達摩增強,達摩1技能控制已經回滾,1依然附帶擊飛效果。前期被動傷害再次被降低,不過相比目前正式服的魯班七號,體驗服的魯班還是增強了不少;后羿削弱:1技能傷害值降低,1技能無法附帶裝備效果,比如末世的百分比傷害,而且吸血效果也只有50%;蘇烈增強:初始血量小幅增加,成長血量小幅增加,戰士往坦克定位轉移;達摩增強:更改定位為戰士/坦克,回滾
  • Kubernetes ELK 日誌收集
    直接在宿主機上安裝,和在kubernetes效果一樣的。**> # 匹配tag為raw.kubernetes.**> @type record_transformer remove_keys $.docker.container_id,$.kubernetes.container_image_id,$.kubernetes.pod_id,$.kubernetes.namespace_id,$.kubernetes.master_url
  • Kubernetes 1.14 二進位集群安裝
    本文檔適用於Centos7.4及以上版本,隨著各個組件的更新,本文檔提供了相關鏡像的包,及時版本更新也不會影響文檔的使用。 如果有文檔相關問題可以直接在網站下面註冊回復,或者點擊右下角加群,我將在12小時內回復您。 並且建議您使用的環境及配置和我相同!
  • Kubernetes 1.8.0 版本發布
    存儲功能的更新是本次發布更新相對較多的模塊,也是才雲科技非常重視並且持續投入的小組。首先,Kubernetes 的存儲模型已經穩定,在 1.8 的發布中開始增加更多的擴展性和附加功能,例如支持掛載選擇,支持 StorageClass 參數化等。快照、擴容、本地存儲無疑是存儲模塊本次發布的亮點,儘管目前都是 alpha,甚至是 pre-alpha。
  • 滾動的天空2無法更新怎麼辦 新版本無法更新問題解決
    滾動的天空2無法更新怎麼辦?每次遊戲更新總是會帶來各種各樣的問題,那遊戲無法更新怎麼辦?18183小編來為大家解答!