背景
對于業務和產品來講,隨時都有緊急小版本功能上線,對于研發人員來講,線上如果有一些緊急的bug,都需要隨時發版修正;而對于產品使用用戶來講,任何的功能和版本發布,要盡可能對用戶無感知,方案
- 灰度發布,自動小批量流量切換,
- 產品層面要切分小版本,研發設計細節上要向上兼容(諸如介面層面),
- 服務發布要實作滾動發布,發布例外要自動回滾,中間不斷服,
k8s 滾動發布方案:
1. 歷史實踐方案- rancher
k8s采用rancher部署, 1)采用rancher cli 客戶端工具登陸rancher,獲取發布日志,掃描啟動日志“成功標記位”,超過掃描周期,判定為發布失敗,通知rancher進行回滾, 2)應用行程關閉前自動通知網關注銷節點,通知eureka下線,關閉流量,如果關閉行程超時,則強殺! 實踐心得:正常發布情況下基本可用,回滾情況下基本可用;如果出現超時,可能會出現流量少量時間例外,因為靠超時保證穩定性,所以有時發布周期較長,2. 現有實踐方案 - 阿里云k8s
k8s采用阿里云部署, 1) 采用kubectl 工具,yml檔案部署, 2)yml定義readinessProbe 就緒探針實作優雅上線,preStop 關閉前事件實作優雅下線, 3)采用發布“部署結果”狀態檢測,如果發布超過時間(超時),則立即通知回滾上一個版本,yml定義檔案如圖所示:

一. 優雅上線的http狀態請求實作
1. 基于bsf框架底層(業務統一使用的底層基礎架構),內部實作基于springboot的生命周期,識別應用行程所處的“啟動完成”,“關閉事件”,從而識別應用是否已完全啟動成功以及下線后撤銷就緒狀態,同樣業務也可以訂閱生命周期事件并加入自定義邏輯,從而保證 業務特殊場景的初始化完成才“處于就緒狀態”,開始接收業務流量, 2. 代碼外層邏輯如下:bsf-statusFilterjava-stop.sh檔案如圖所示:
二. 優雅下線的shell腳本實作
- 基于bsf框架底層(業務統一使用的底層基礎架構),內部實作對于eureka服務的狀態修改及自動下線,從而實作應用行程關閉時通知eureka注銷自身應用服務下線,同樣也會通知當前生命周期處于stopping狀態,從而引發“就緒探針”的就緒狀態失效,
- 代碼外層邏輯如下:bsf-eurekaStatusFilter
- podstopsleeptime 時間為eureka注銷后,默認eureka下線真正生效時間(因為eureka客戶端可能有快取),需要看eureka情況調整,比如eureka需要調優幾個引數,其中涉及到eureka消費者端的訂閱實體重繪的周期,eureka實體的eureka服務端快取時間,理論上手工下線后5秒生效,如果手工下線失效,保守時間應該是消費者端實體重繪時間+eureka服務端實體快取時間=生效時間;在eureka客戶端配置如圖調優后,考慮設定為10秒,
eureka 調優參考如下:
三. 發布例外檢測邏輯實作
核心實作基于兩個關鍵k8s 命令: 1. kubectl rollout status deploy {服務名} -n {namespace} 定期檢查當前發布狀態,如果長時間沒有發布成功,則通知回滾,(風險:假如此時有人工控制臺或命令介入操作,會干預正常自動化發版) 2. kubectl -n {namespace} rollout undo deploy {服務名} 通知服務回滾上一個版本,(風險:上一個版本可能失敗,或者出現例外?不一定是程式問題,可能資料庫出現例外等等?所以一般人工介入確認一下比較好,同時發出飛書通知提醒!)發布例外檢測處理邏輯如圖:

四. 驗證滾動發布是否有效
1. 外層網關驗證 采用全自動化全鏈路壓測工具(自動流量錄制,自動生成報告,壓測效能提升10倍),設定自動化壓測任務,進行長時間不間斷掃描!驗證發布/回滾時,流量驗證是否出現中斷! 結論: 配置2個執行緒持續掃描空介面的情況下,沒有出現http鏈接例外,在滾動發布的時候出現流量的波谷,但是服務沒有中斷,壓測工具報告如圖所示:
2. 內部服務呼叫驗證: 基于eureka情況下,內部rpc呼叫是否有效?尚未檢驗, 3. 多種例外情況下的發布是否正常回滾? 諸如常見的編譯錯誤或者系統配置一樣導致打包問題,會不會影響線上(應該是終止的),多種服務啟動錯誤能不能自動回滾?(有些場景下應該還是不能回滾的) 4. 內部大范圍專案推廣驗證!!! 待實踐,
總結:
此為k8s滾動發布實踐記錄,目前已初步實作滾動發布效果,細節仍然需要檢驗,勤做筆記,以待備忘!!! by 車江毅 2022-10-20 開源是一種態度,分享是一種精神,學習仍需堅持,進步仍需努力,.net生態圈因你我更加美好,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518698.html
標籤:Java
