天天看點

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

作者:技術聯盟總壇

帶來 ZadigX 的 阿裡雲雲原生 2023-07-27 18:30 發表于浙江

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

作者: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 + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

工作流程描述:

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」項目。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

步驟二:建立服務

在 ZadigX 服務-生産服務子產品建立 nacos、spring-a、spring-b、spring-c 服務并配置對應的 YAML。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
注意:在服務 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 上建立生産環境

阿裡雲 MSE + 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 + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

步驟四:配置 MSE 灰階釋出工作流

1. 建立釋出工作流 mse-gray-workflow,添加任務,配置如下。

    1. MSE 灰階釋出:用于部署灰階服務
    2. [可選]通用任務 :用于驗證灰階後的新版本
    3. 下線 MSE 灰階:用于下線灰階服務
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

2. 建立釋出工作流 prod-workflow ,添加部署任務,用于執行生産釋出,配置如下圖所示。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

工程師執行 MSE 灰階釋出

Cloud Native

多個灰階服務部署

執行 mse-gray-workflow,選擇服務元件 spring-cloud-a和spring-cloud-c ,設定灰階标,選擇對應的灰階鏡像、副本數量、修改灰階服務 YAML 配置,點選執行即可完成灰階服務部署。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

此處 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: {}           

部署完成後,可在生産環境中檢視灰階服務的運作狀态和基本資訊。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

灰階結果驗證

灰階服務部署完成後,自動執行新版本功能驗證或通過其他業務方法驗證灰階結果。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

正式釋出生産服務

灰階服務驗證沒有問題後,執行 prod-workflow 工作流,選擇更新的服務及對應的鏡像,即可更新生産服務。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

灰階服務清理與下線

生産釋出成功後,執行 mse-gray-workflow 工作流,選擇需要下線的灰階标,即可下線對應的灰階服務。

阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出
阿裡雲 MSE + ZadigX ,無門檻實作雲原生全鍊路灰階釋出

總結

Cloud Native

面向開發者的全鍊路灰階釋出解決方案通過與阿裡雲 MSE 的聯合,為企業提供雲原生能力、自動化平台支援,顯著提高釋出效率和軟體傳遞品質,為使用者帶來卓越體驗。

參考連結:

[1] ACK 微服務接入 MSE

[2] 建立 MSE 雲原生網關

[3] MSE Ingress 通路容器服務

繼續閱讀