雲效 AppStack + 阿里雲 MSE 實現應用服務全鏈路灰度

作者:周靜、吳宇奇、泮聖偉

在應用開發測試驗證通過後、進行生產發佈前,爲了降低新版本發佈帶來的風險,期望能夠先部署到灰度環境,用小部分業務流量進行全鏈路灰度驗證,驗證通過後再全量發佈生產。本文主要介紹如何通過阿里雲 MSE 微服務引擎和雲效應用交付平臺AppStack 實現灰度發佈。

讀完本文,你將瞭解到:

  • 以 SpringCloud 應用爲例,瞭解全鏈路灰度場景及其工作原理;
  • 如何基於雲效 Appstack 完成應用基線環境的部署,實時觀測環境部署進度;
  • 如何平滑爲存量應用添加灰度環境、灰度發佈流程,不影響已有發佈流程;
  • 如何基於 MSE 實現自定義多種灰度路由規則條件,精準測試灰度流量;
  • 如何實現應用灰度環境下線,及時清理無用資源。

場景描述

本文將以 A、B、C 三個 SpringCloud 應用爲例,展示如何通過阿里云云效 AppStack 來整合 MSE 全鏈路灰度的功能,實現將應用一鍵部署到灰度環境,並進行全鏈路灰度的測試。

假設已有 A、B、C 三個應用的基線版本正在運行。整體上應用的調用鏈路是,客戶端入口流量首先到達網關應用,而後按順序經過 A、B、C 三個應用:

一次需求發佈窗口中,應用 A 和 C 進行了迭代,需要對 A 和 C 的新版本進行全鏈路灰度測試,調用鏈路如下:

整體方案

通過雲效 AppStack,在應用發佈流程上增加一個灰度流程。每個應用走到生產環境部署前,都會先發布到灰度環境。通過灰度標識對灰度環境進行驗證,等到開發/測試人員對灰度環境的應用測試沒有問題時,再手工放行流水線走到真正的線上發佈部署階段。

操作實踐

前提條件

1)開通雲效高級版(可免費試用 1 個月),確保在雲效應用交付 AppStack 內打開研發流程功能 [ 1] 了。

2)開通 MSE 微服務治理 [ 2]

3.1 開啓 MSE 微服務治理

1)將 ACK 微服務應用接入 MSE 治理中心。具體操作,請參見 ACK 微服務應用接入 MSE 治理中心 [ 3]

2)創建 MSE nacos,並複製其內網域名。具體操作,請參見創建 Nacos 引擎 [ 4]

3)創建 MSE 雲原生網關,並關聯第一步創建的 Nacos。具體操作,請參見創建 MSE 雲原生網關 [ 5] 和新建服務來源 [ 6]

3.2 在雲效 AppStack 創建三個應用,部署應用基線版本

在雲效 AppStack 創建三個應用,部署應用基線版本。

我們以 spring-cloud-a 應用爲例,詳細介紹一個應用的配置流程:

第 1 步:應用關聯代碼倉庫,可以在雲效 Codeup 中導入示例代碼:https://github.com/aliyun/alibabacloud-microservice-demo.git

第 2 步:應用環境配置,一個應用通常可以劃分爲測試環境(test)、預發環境(pre)、灰度環境(gray)、生產環境(prod),環境關聯不同的部署資源(如 K8s 集羣),部署服務分別用於不同階段進行測試驗證,並最終提供線上服務。

第 3 步:應用 Kubernetes 部署編排 YAML 配置。

  • 將容器鏡像定義成佔位符 {{ .AppStack.image.backend }},由流水線運行時傳入構建好的鏡像。
  • 在應用配置的 spec.template.metadata.labels 下加入 MSE 基本配置及灰度相關。

🔔 說明:

  • msePilotCreateAppName 爲 MSE 服務治理接入的應用名;msePilotAutoEnable 爲是否接入 MSE 服務治理的開關 on 表示開啓,off 表示關閉;alicloud.service.tag 則是 MSE 用於灰度發佈的節點標籤。您可以在 MSE 服務治理控制檯,節點詳情頁面看到節點的標籤情況。更多信息,請參見 ACK 微服務應用接入 MSE 治理中心微服務治理 [ 7] 、節點詳情 [ 8]
  • {{if eq .AppStack.envName "gray" }} 是基於 GO template 的方式識別當前雲效發佈的應用環境。如果環境名稱爲 gray,則爲灰度服務。更多信息,請參見 Kubernetes 部署編排 [ 9]
  • 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'
{{ ifeq.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 內網域名

第 4 步:應用研發流程配置,通常一個應用的研發流程可以分爲測試階段、預發階段、生產階段。

生產階段通常包括鏡像構建(也可以選擇已有鏡像發佈)、發佈審覈、生產發佈多個任務。

  • 鏡像構建:選擇「鏡像構建」組件,配置需要推送到的鏡像倉庫、標籤默認 ${DATETIME}、用於構建的 Dockerfile 路徑本示例爲 mse-simple-demo/A/Dockerfile。
  • 人工卡點:配置生產發佈的審批人。
  • 生產環境部署:選擇「AppStack 部署」組件,應用自動填充當前應用、環境選擇「生產環境-prod」,製品選擇構建的鏡像。

第 5 步:點擊「運行」生產發佈流程,觸發應用鏡像構建,鏡像構建成功後推送到目標鏡像倉庫。

人工審批通過後,觸發部署正式環境。點擊查看「部署單詳情」,查看部署進度。部署單成功後即完成了正式(基線)環境的部署。

進入環境詳情可以查看 Deployment 資源狀態和詳細信息。

以上即完成了應用 spring-cloud-a 的代碼、環境、編排 YAML、研發流程等配置,完成了 spring-cloud-a 基線環境的部署。spring-cloud-b、 spring-cloud-c 應用配置和上線流程相同。

🔔 注: 當應用較多時,推薦使用應用模板,來完成應用的批量初始化(詳見應用模板 [ 10] )。

3.3 配置灰度流程

3.3.1 創建 MSE 全鏈路灰度泳道

創建全鏈路灰度泳道組:進入 MSE 治理中心 > 全鏈路灰度,單擊+創建泳道組及泳道(如果您已經創建過泳道組,則單擊+創建泳道組)。入口類型選擇「MSE 雲原生網關」,泳道組流量入口選擇目標雲原生網關,泳道組涉及應用選擇 spring-cloud-a、spring-cloud-b、spring-cloud-c。

創建分流泳道:泳道標籤設置爲 gray,路由規則條件列表添加 Parameter group=gray,則請求參數中攜帶 group=gray 的去往灰度泳道。

3.3.2 AppStack 應用增加灰度流程

進入雲效 AppStack 應用-設置-研發流程,編輯「生產階段」流程:

在人工卡點任務後添加「灰度環境部署」任務:選擇「AppStack 部署」組件,應用自動填充當前應用,環境選擇「灰度環境-gray」,製品選擇構建的鏡像。

在生產發佈任務後添加「灰度環境清理」任務:選擇「AppStack 清理環境」組件,應用自動填充當前應用,環境選擇「灰度環境-gray」,選擇「僅清理資源保留環境元數據」,下次發佈時可以重新部署拉起灰度服務資源。

配置完成後,保存生產階段流程,即可進入下一步。

3.4 新需求發佈,部署灰度環境,灰度驗證

3.4.1 灰度環境部署

當接收到一個新的業務需求,涉及 spring-cloud-a 和 spring-cloud-c 兩個應用的改動。A、C 兩個應用各自完成代碼開發、測試預發驗證後,進入生產發佈階段。分別點擊「運行」A、C 生產階段研發流程,觸發 A、C 灰度環境部署,點擊查看「部署單詳情」,部署單成功後即完成 A、C 灰度環境的部署。

3.4.2 開始灰度驗證

發起帶灰度標識的請求,則結果如下(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=gray
Agray[192.168.110.161][config=base] -> B[192.168.110.14] -> Cgray[192.168.110.160]

可以在 MSE 控制檯上看到剛剛發起的灰度請求:

3.5 灰度驗證通過,發佈生產環境

上述灰度驗證通過後,即可繼續發佈生產環境。點擊手動觸發生產環境發佈,查看生產發佈批次,觀測新老版本號,部署完成後觀測生產監控日誌。

3.6 生產發佈成功後,銷燬灰度環境

生產發佈成功後,銷燬灰度環境資源,所有流量都進入生產環境。

至此即完成了應用基線環境的準備、灰度流程配置、灰度發佈驗證、生產發佈、灰度銷燬完整流程。

相關鏈接:

[1] 確保在雲效應用交付 AppStack 內打開研發流程功能

https://help.aliyun.com/document_detail/2399732.html

[2] 開通 MSE 微服務治理

https://help.aliyun.com/zh/mse/getting-started/activate-microservices-governance#task-2140253

[3] ACK 微服務應用接入 MSE 治理中心

https://help.aliyun.com/zh/mse/getting-started/enable-microservices-governance-for-microservice-applications-in-an-ack-cluster

[4] 創建 Nacos 引擎

https://help.aliyun.com/zh/mse/getting-started/create-a-nacos-engine#task-2261346

[5] 創建 MSE 雲原生網關

https://help.aliyun.com/zh/mse/getting-started/create-a-cloud-native-gateway#task-2140895

[6] 新建服務來源

https://help.aliyun.com/zh/mse/user-guide/add-a-service-source#task-2081169

[7] ACK 微服務應用接入 MSE 治理中心微服務治理

https://help.aliyun.com/zh/mse/user-guide/enable-microservices-governance-for-microservice-applications-in-an-ack-cluster-1

[8] 節點詳情

https://help.aliyun.com/zh/mse/user-guide/node-details

[9] Kubernetes 部署編排

https://help.aliyun.com/document_detail/461384.html

[10] 應用模板

https://help.aliyun.com/document_detail/2674996.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章