帶來 ZadigX 的 阿裡雲雲原生 2023-07-27 18:30 發表于浙江
作者:ZadigX
企業釋出現狀痛點
Cloud Native
目前企業在選擇和實施釋出政策時面臨以下困境:
1. 缺乏雲原生能力:由于從傳統部署轉變為雲原生模式後,技術架構改造需要具備相關能力的人才。這使得企業在釋出政策方面難以入手。
2. 缺乏自動化平台支援:即使找到适合産品現狀的釋出政策,仍然依賴手工逐漸執行。這可能導緻流程遺漏或人工操作失誤,造成生産事故的風險。
3. 釋出效率低下:僅實作了服務級别的灰階能力,逐個釋出服務耗時長,導緻釋出過程緩慢,驗證效果不佳。
針對以上問題,ZadigX 與阿裡雲 MSE 聯合釋出「面向開發者的全鍊路灰階釋出解決方案」,幫助企業應對這些痛點。
阿裡雲 MSE 為 Java 應用提供了便捷實作全鍊路灰階的能力。MSE 微服務引擎是基于 Java Agent 實作的無侵入式企業生産級服務治理産品,不需要修改任何一行業務代碼,即可擁有不限于全鍊路灰階的治理能力,并且支援近 5 年内所有的 Spring Boot、Spring Cloud 和 Dubbo。
使用 MSE 進行灰階釋出的過程中,ZadigX 可以便捷地建立灰階環境和灰階 K8S 資源,結合釋出工作流編排能力,自動為 K8S 資源設定 MSE 所需的資源标記,并內建了 MSE API 以降低重複工作量。開發無需切換平台,管理者一次配置即可。開發可以基于 ZadigX 與日常工作平滑結合,完成高效、安全、快捷的釋出。
工作原理介紹
Cloud Native
工作原理圖示:
工作流程描述:
MSE 灰階釋出任務
1. 複制一份基于基準環境中服務的 YAML
2. 自動為 YAML 中的資源名稱 metadata.name 添加字尾 -mse-<grayTag>
3. 自動為 YAML 中的資源添加 MSE 全鍊路灰階釋出所需的相關 label
4. 使用者可以設定灰階鏡像、副本數,此外可以直接在渲染後的 YAML 中修改其他需要改動的字段(不可删除灰階過程中使用的 label)
5. 根據最終的 YAML 生成灰階版本資源
下線 MSE 灰階服務
1. 通過灰階資源被設定的相關 label ,找到并删除它們
前置操作
Cloud Native
MSE 全鍊路灰階能力可以支援任意 K8S 叢集,全鍊路灰階場景需基于網關能力建設,下面以 MSE 自帶的雲原生網關為例介紹場景,使用者可以根據自身情況選擇合适的網關。
安裝 MSE 元件
在阿裡雲 ACK 叢集中安裝 MSE 元件,安裝方式參考文檔:安裝 ack-onepilot 元件[1]。
安裝 MSE Ingress 雲原生網關
安裝方式參考文檔
1. 建立 MSE 雲原生網關[2]
2. 通過 MSE Ingress 通路容器服務[3]
下面以 spring-a、spring-b、spring-c、nacos 這幾個服務結合 MSE 雲原生網關組成的項目為例示範項目初始化和 MSE 灰階釋出過程。
管理者做項目初始化
Cloud Native
運維或者 DevOps 工程師在 ZadigX 上進行項目的初始化,包括建立項目、建立服務、建立環境并啟用 MSE、建立灰階釋出工作流等步驟。以下操作是一次性操作,後續隻需按需配置執行工作流即可。
步驟一:建立項目
在 ZadigX 上建立項目,輸入項目名稱,項目類型選擇 「K8s YAML」項目。
步驟二:建立服務
在 ZadigX 服務-生産服務子產品建立 nacos、spring-a、spring-b、spring-c 服務并配置對應的 YAML。
注意:在服務 deployment 中需添加以下 selector 和 template.metadata.labels:zadigx-release-version: original
服務 YAML 如下所示:
- nacos 服務 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
spec:
replicas: 1
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
spec:
containers:
- env:
- name: MODE
value: standalone
image: nacos/nacos-server:v2.2.0
imagePullPolicy: Always
name: nacos-server
dnsPolicy: ClusterFirst
restartPolicy: Always
# Nacos Server Service配置
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: ClusterIP
- spring-a 服務 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-a
zadigx-release-version: original
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-a
app: spring-cloud-a
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-base
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
zadigx-release-version: original
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-cloud-a
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: spring-cloud-a-base
port:
number: 20001
path: /
pathType: Prefix
- spring-b 服務 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-b
zadigx-release-version: original
strategy:
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-b
app: spring-cloud-b
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-b
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
- spring-c 服務 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-c
zadigx-release-version: original
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-c
app: spring-cloud-c
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-c
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
步驟三:建立環境并啟用 MSE
1. 在 ZadigX 上建立生産環境
2. 執行以下指令啟用 MSE,對灰階過程所有涉及到的命名空間(上圖中為:mse-customer) 打上 mse-enable 标簽。
kubectl label namespace <NAMESPACE> mse-enable=enabled
3. 在生産環境中添加服務spring-a、spring-b、spring-c、nacos。
4. 檢查服務是否成功接入 MSE。在 ZadigX 環境中選擇服務,比如spring-a,檢查 Pod YAML 中是否成功注入one-pilot-initcontainer,如下圖所示。
步驟四:配置 MSE 灰階釋出工作流
1. 建立釋出工作流 mse-gray-workflow,添加任務,配置如下。
- MSE 灰階釋出:用于部署灰階服務
- [可選]通用任務 :用于驗證灰階後的新版本
- 下線 MSE 灰階:用于下線灰階服務
2. 建立釋出工作流 prod-workflow ,添加部署任務,用于執行生産釋出,配置如下圖所示。
工程師執行 MSE 灰階釋出
Cloud Native
多個灰階服務部署
執行 mse-gray-workflow,選擇服務元件 spring-cloud-a和spring-cloud-c ,設定灰階标,選擇對應的灰階鏡像、副本數量、修改灰階服務 YAML 配置,點選執行即可完成灰階服務部署。
此處 spring-cloud-a 為流量入口,是以需要在灰階服務 YAML 中手動添加/修改 Service 和 MSE Ingress 資源的一些相關字段:
1. 通過 MSE Ingress 的 annotations 設定灰階流量規則,并為灰階流量帶上灰階标 Header
2. 設定灰階路由規則的 backend.service.name 為其下的灰階 Service 名稱
具體改動内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: x-user-id
nginx.ingress.kubernetes.io/canary-by-header-value: "100"
nginx.ingress.kubernetes.io/canary-weight: "0"
creationTimestamp: null
labels:
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
name: spring-cloud-a-mse-gray
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: spring-cloud-a-mse-gray
port:
number: 20001
path: /
pathType: Prefix
status:
loadBalancer: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
name: spring-cloud-a-mse-gray
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
status:
loadBalancer: {}
部署完成後,可在生産環境中檢視灰階服務的運作狀态和基本資訊。
灰階結果驗證
灰階服務部署完成後,自動執行新版本功能驗證或通過其他業務方法驗證灰階結果。
正式釋出生産服務
灰階服務驗證沒有問題後,執行 prod-workflow 工作流,選擇更新的服務及對應的鏡像,即可更新生産服務。
灰階服務清理與下線
生産釋出成功後,執行 mse-gray-workflow 工作流,選擇需要下線的灰階标,即可下線對應的灰階服務。
總結
Cloud Native
面向開發者的全鍊路灰階釋出解決方案通過與阿裡雲 MSE 的聯合,為企業提供雲原生能力、自動化平台支援,顯著提高釋出效率和軟體傳遞品質,為使用者帶來卓越體驗。
參考連結:
[1] ACK 微服務接入 MSE
[2] 建立 MSE 雲原生網關
[3] MSE Ingress 通路容器服務