在應用開發、測試驗證通過后,進行生產發布前,為了降低新版本發布帶來的風險,期望能夠先部署到灰度環境,用小部分業務流量進行全鏈路灰度驗證,驗證通過后再全量發布生產。本文主要介紹如何通過云效 AppStack 和 MSE 微服務引擎實現灰度發布。
場景描述
本文將以 A、B、C 三個 SpringCloud 應用為例,展示如何通過阿里云云效 AppStack 來整合 MSE 全鏈路灰度的功能,實現將應用一鍵部署到灰度環境,并進行全鏈路灰度的測試。假設已有 A、B、C 三個應用的基線版本正在運行。整體上應用的調用鏈路是,客戶端入口流量首先達到網關應用,而后按順序經過 A、B、C 三個應用:
一次需求發布窗口中,應用 A 和 C 進行了迭代,需要對 A 和 C 的新版本進行全鏈路灰度測試,調用鏈路如下:
前提條件
開啟 MSE 微服務治理
將 ACK 微服務應用接入 MSE 治理中心。具體操作,請參見ACK微服務應用接入MSE治理中心。
創建 MSE nacos,并復制其內網域名。具體操作,請參見創建Nacos引擎。
創建 MSE 云原生網關,并關聯第一步創建的 Nacos。具體操作,請參見創建MSE云原生網關和新建服務來源。
操作步驟
步驟一:創建應用,部署基線版本
在云效 應用交付AppStack 創建三個應用,用于部署應用的基線版本。應用的初始化可以使用應用模板批量配置(詳見 應用模板)。
以 spring-cloud-a 應用為例配置流程如下:
應用關聯代碼倉庫,可以在Codeup中導入示例代碼 https://github.com/aliyun/alibabacloud-microservice-demo.git。
應用環境配置,應用通常可以劃分開發環境、測試環境、預發環境、生產環境,可以關聯不同的部署資源(如K8s集群),分別對不同階段測試驗證,并最終提供線上服務。
應用 Kubernetes 部署編排 YAML 配置。
將容器鏡像定義成占位符
{{ .AppStack.image.backend }}
,由流水線運行時傳入構建好的鏡像。在應用配置的
spec.template.metadata.labels
下加入 MSE 基本配置及灰度相關。
說明msePilotCreateAppName
為 MSE 服務治理接入的應用名;msePilotAutoEnable
為是否接入MSE服務治理的開關 on 表示開啟,off 表示關閉;alicloud.service.tag
則是 MSE 用于灰度發布的節點標簽。您可以在 MSE 服務治理控制臺,節點詳情頁面看到節點的標簽情況。更多信息,請參見ACK和ACS微服務應用接入MSE治理中心(Java版)、節點詳情。{{if eq .AppStack.envName "gray" }}
是基于 GO template 的方式識別當前云效發布的應用環境。如果環境名稱為gray
,則為灰度服務。更多信息,請參見Kubernetes 部署編排。nacos-server
需要替換成上述創建的 Nacos 內網域名。
apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a-{{ .AppStack.envName }} labels: run: spring-cloud-a-{{ .AppStack.envName }} namespace: {{ .Values.namespace }} spec: selector: matchLabels: app: spring-cloud-a-{{ .AppStack.envName }} template: metadata: labels: app: spring-cloud-a-{{ .AppStack.envName }} # MSE 灰度相關配置 msePilotCreateAppName: spring-cloud-a msePilotAutoEnable: 'on' {{ if eq .AppStack.envName "gray" }} alicloud.service.tag: gray {{ end }} spec: containers: - name: spring-cloud-a image: {{ .AppStack.image.backend }} # 應用鏡像占位符,由流水線運行時傳入 imagePullPolicy: Always ports: - containerPort: 20001 livenessProbe: tcpSocket: port: 20001 initialDelaySeconds: 30 periodSeconds: 60 env: - name: spring.cloud.nacos.discovery.server-addr value: 'nacos-server' # nacos-server 替換為上述創建的 Nacos 內網域名 - name: dubbo.registry.address value: 'nacos://nacos-server:8848' # nacos-server 替換為上述創建的 Nacos 內網域名
應用研發流程配置分為測試階段、預發階段、生產階段。生產階段包括鏡像構建(也可以選擇已有鏡像發布)、發布審核、生產發布多個任務。
鏡像構建:選擇鏡像構建組件,配置需要推送到的鏡像倉庫、標簽默認
${DATETIME}
、用于構建的 Dockerfile 路徑本示例為mse-simple-demo/A/Dockerfile
。人工卡點:配置生產發布的審批人。
生產環境部署:選擇AppStack部署組件,應用自動填充當前應用、環境選擇「生產環境-prod」,制品選擇構建的鏡像。
單擊運行生產發布流程,觸發應用鏡像構建,鏡像構建成功后推送到目標鏡像倉庫。人工審批通過后,觸發部署正式環境,單擊查看部署單詳情,查看部署進度,部署單成功后即完成了正式(基線)環境的部署。進入環境詳情可以查看 Deployment 資源狀態和詳細信息。
以上即完成了一個應用的配置和上線流程,從應用 spring-cloud-a 的代碼、環境、編排 YAML、研發流程等配置實現spring-cloud-a 基線環境的部署。spring-cloud-b、 spring-cloud-c 部署流程同上即可。
步驟二:配置灰度流程
創建 MSE 全鏈路灰度泳道。
創建全鏈路灰度泳道組:進入 MSE 治理中心 > 全鏈路灰度,單擊+ 創建泳道組及泳道(如果您已經創建過泳道組,則單擊+ 創建泳道組)。入口類型選擇MSE 云原生網關,泳道組流量入口選擇目標云原生網關,泳道組涉及應用選擇 spring-cloud-a、spring-cloud-b、spring-cloud-c。
創建分流泳道:泳道標簽設置為 gray,路由規則條件列表添加 Parameter group=gray,則請求參數中攜帶 group=gray的請求將去往灰度泳道。
AppStack 應用增加灰度流程。
進入云效應用交付AppStack應用,在 編輯流水線。
在發布階段添加灰度環境部署任務,選擇AppStack 部署組件,應用自動填充當前應用,環境選擇灰度環境-gray,制品選擇構建的鏡像。
在灰度環境清理階段添加灰度環境清理任務,選擇AppStack清理環境組件,應用自動填充當前應用,環境選擇灰度環境-gray,選擇僅清理資源保留環境元數據,下次發布時可以重新部署拉起灰度服務資源。
配置完成后,保存生產階段流程,即可進入下一步。
步驟三:新需求發布,部署灰度環境,灰度驗證
灰度環境部署。
當接收到一個新的業務需求,涉及 spring-cloud-a 和 spring-cloud-c 應用的改動。A、C應用各自完成代碼開發、測試預發驗證后,進入生產發布階段。分別單擊運行A、C 生產階段研發流程,觸發A、C灰度環境部署,單擊查看部署單詳情,部署單成功后即完成 A、C 灰度環境的部署。
開始灰度驗證。
發起帶灰度標識的請求,則結果如下(A 和 C 進行了灰度發布,B 沒有進行灰度發布,所以請求去往了 B 的基線環境):
> curl -X GET http://47.96.XX.XXX/A/a?group=gray Agray[192.168.110.161][config=base] -> B[192.168.110.14] -> Cgray[192.168.110.160]
如果請求不帶灰度標識,則去往 A、B、C 的基線環境:
> curl -X GET http://47.96.XX.XXX/A/a?group=xxx A[192.168.110.162][config=base] -> B[192.168.110.57] -> C[192.168.110.62]
可以在 MSE 控制臺上看到剛剛發起的灰度請求。
步驟四:灰度驗證通過,發布生產環境
上述灰度驗證通過后,即可繼續發布生產環境。點擊手動觸發生產環境發布,查看生產發布批次,觀測新老版本號,部署完成后觀測生產監控日志。
步驟五:生產發布成功后,銷毀灰度環境
生產發布成功后,銷毀灰度環境資源,所有流量都進入生產環境。
至此即完成了應用基線環境的準備、灰度流程配置、灰度發布驗證、生產發布、灰度銷毀完整流程。