全部產品
Search
文件中心

Container Service for Kubernetes:基於ACK One Gitops使用Argo Rollouts實現金絲雀發布

更新時間:Jan 26, 2025

ACK One整合了ArgoCD GitOps的能力,同時結合漸進式發布組件Argo Rollouts,通過Git Commit實現全自動的金絲雀發布。本文介紹如何通過ACK One GitOps結合Argo Rollouts組件快速構建應用的金絲雀發布能力。

前提條件

相關概念

展開查看GitOps相關概念

GitOps

GitOps是使用Git倉庫來管理應用的部署模板,將Git倉庫作為Kubernetes叢集中部署應用的唯一來源,實現應用的持續部署。關於GitOps的更多介紹,請參見GitOps概述

image

展開查看Argo Rollouts相關概念

Argo Rollouts

Argo Rollouts是基於Kubernetes的一個標準向外延展群組件,可以提供進階的部署能力,例如藍綠髮布、金絲雀發布,以及Kubernetes漸進交付功能。關於Argo Rollouts的更多介紹,請參見Argo Rollouts官方文檔

image

展開查看金絲雀(Canary)發布相關概念

金絲雀(Canary)發布

金絲雀(Canary)發布是一種發布策略,即灰階發布。金絲雀發布指的是在生產環境中分階段逐步更新後端應用的版本(版本需要具備流量控制能力,例如可以通過Ingress控制器),在小範圍內驗證符合預期後,再推廣至整個生產環境。

金絲雀發布的優勢

金絲雀發布可以使用真實環境測試新版本,當新版本存在問題時,新版本最多隻影響部分使用者,且支援安全快速的復原策略,即將路由到新版本上的流量切換到其他老版本上。

金絲雀發布流程

image

注意事項

  • 如果您選擇GitHub倉庫,則不推薦使用中國內地地區。如需在中國內地地區運行,您可以選擇適合的Git服務提供者。

  • 本文艦隊管理的Fleet執行個體和關聯的ACK叢集的地區均以中國香港地區為例介紹。

步驟一:在ACK叢集中部署Argo Rollouts組件

執行以下命令,在ACK叢集中部署Argo Rollouts組件。關於安裝Argo Rollouts組件的更多資訊,請參見Argo Rollouts官方文檔

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

步驟二:在ACK叢集中部署ack-arms-prometheus組件

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面,單擊日誌與監控頁簽,找到ack-arms-prometheus組件。

    • 若在卡片右上方顯示已安裝,說明在建立叢集時已安裝ack-arms-prometheus組件,您無需處理。

    • 若在卡片右上方未顯示資訊,您需要單擊卡片右下方的安裝,在ACK叢集中安裝該組件。

步驟三:使用ACK One GitOps發布應用

通過GitOps發布應用支援以下兩種方式。

  • 通過ArgoCD CLI的方式發布應用。下文以此方式為例,介紹如何使用GitOps發布應用。

  • 通過GitOps控制台發布應用。具體操作,請參見GitOps快速入門

  1. 執行以下命令,添加Git Repo。

    argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name gitops-demo

    預期輸出:

    Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added
  2. 執行以下命令,查看已添加的Git Repo列表。

    argocd repo list

    預期輸出:

    TYPE  NAME         REPO                                                       INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
    git   gitops-demo  https://github.com/AliyunContainerService/gitops-demo.git  false     false  false  false  Successful
  3. 執行以下命令,查看Cluster列表。

    argocd cluster list

    預期輸出:

    SERVER                          NAME                                                                 VERSION  STATUS      MESSAGE                                                  PROJECT
    https://192.168.XX.XX:6443      c76073b011afb4de2a8****-ack-gitops-demo-192-10-110-0-0-16  1.26+    Successful
    https://kubernetes.default.svc  in-cluster                                                                    Unknown     Cluster has no applications and is not being monitored.
  4. 執行以下命令,通過Application方式建立應用。

    argocd app create rollouts-demo --repo https://github.com/AliyunContainerService/gitops-demo.git --project default --sync-policy automated --revision rollouts --path  . --dest-namespace default --dest-server https://192.168.XX.XX:6443 
  5. 執行以下列表,查看應用列表。

    argocd app list

    預期輸出:

    NAME           CLUSTER                     NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                            PATH  TARGET
    rollouts-demo  https://192.168.XX.XX:6443  default    default  Synced  Healthy  Auto        <none>      https://github.com/AliyunContainerService/gitops-demo.git  .     rollouts
  6. 執行以下命令,查看Rollouts運行狀態。

    kubectl argo rollouts get rollout rollouts-demo --watch

    預期輸出:

    1234..png

步驟四:開始金絲雀發布

Argo Rollouts金絲雀發布的過程中,您可以通過以下兩種方式確認新版本的應用是否正常,進而決定是否進一步增加新版本的流量權重,直到全部流量都指向新版本。一種是人工確認;另一種是通過ARMS Prometheus監控採集到的新版本應用的業務指標狀態,決定是否增加新版本流量權重。

人工確認方式

  1. 在rollout.yaml檔案中,修改如下內容,然後儲存並提交。

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: rollouts-demo
    spec:
      replicas: 4
      strategy:
        canary:            # 無需添加analysis指標採集部分。
          canaryService: rollouts-demo-canary
          stableService: rollouts-demo-stable
          trafficRouting:
            nginx:
              stableIngress: rollouts-demo-stable
          steps:
            - setWeight: 20
            - pause: {}          # 該處為暫停,需要介入處理。
            - setWeight: 40
            - pause: {duration: 5m}
            - setWeight: 60
            - pause: {duration: 5m}
            - setWeight: 80
            - pause: {duration: 5m}
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: rollouts-demo
      template:
        metadata:
          labels:
            app: rollouts-demo
        spec:
          containers:
          - name: rollouts-demo
            image: argoproj/rollouts-demo:yellow   # 修改鏡像Tag。
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m        
  2. 執行以下命令,查看Rollouts運行狀態。

    kubectl argo rollouts get rollout rollouts-demo --watch

    預期輸出:

    123..png

    在rollout.yaml檔案中,在第一個puase的位置,由於未設定暫停時間,因此金絲雀發布會一直暫停在該處,直到有resumed或promoted動作為止。

  3. 恢複金絲雀發布。

    1. 在rollout.yaml檔案中,修改如下內容,然後儲存並提交。

            steps:
              - setWeight: 20
              - pause: {duration: 10s}   # 此處增加一個較短的duration,使其快速進入下一步。
    2. 再次執行以下命令,恢複金絲雀發布。

      kubectl argo rollouts get rollout rollouts-demo --watch

      預期輸出:3..png

    金絲雀發布完成後,效果如下圖所示。

    4..png

通過ARMS Prometheus監控指標自動確認

  1. 在rollout.yaml檔案中,修改如下內容,然後儲存並提交。

      strategy:
        canary:
          analysis:        # 指標分析配置。
            templates:     # 指標分析模板。
            - templateName: success-rate
            startingStep: 2 #delay starting analysis run until setWeight: 40%
            args:
              - name: service-name
                value: rollouts-demo-stable
          canaryService: rollouts-demo-canary
          stableService: rollouts-demo-stable
          trafficRouting:
            nginx:
              stableIngress: rollouts-demo-stable
          steps:
            - setWeight: 20
            - pause: {duration: 5m}
            - setWeight: 40
            - pause: {duration: 5m}
            - setWeight: 60
            - pause: {duration: 5m}
            - setWeight: 80
            - pause: {duration: 5m}
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: rollouts-demo
      template:
        metadata:
          labels:
            app: rollouts-demo
        spec:
          containers:
          - name: rollouts-demo
            image: argoproj/rollouts-demo:blue  # 設定新的鏡像Tag。        
  2. 擷取ARMS Prometheus的服務地址address。

    該服務地址為標準的Kubernetes Service地址格式{ServiceName}.{Namespace}.svc.{ClusterDomain}:{ServicePort},例如,本文ARMS Prometheus的Service部署在arms-prom命名空間下,暴露的服務名稱為arms-prom-server,並且叢集預設的ClusterDomain為cluster.local,服務連接埠為9090,所以ARMS Prometheus的服務地址為http://arms-prom-server.arms-prom.svc.cluster.local:9090

  3. 在analysis.yaml檔案中,增加如下關於ARMS Prometheus業務指標的配置內容。

    以下ARMS Prometheus的服務地址address為上一步擷取的服務地址adress。例如下方範例程式碼中金絲雀發布成功的條件為當在採集周期內請求灰階應用成功的比例達到95%時,金絲雀發布將會自動進入下一流程。關於更多採集指標的配置,請參見指標採集官方文檔

    apiVersion: argoproj.io/v1alpha1
    kind: AnalysisTemplate
    metadata:
      name: success-rate
    spec:
      args:
      - name: service-name
      metrics:
      - name: success-rate
        interval: 5m
        successCondition: result[0] >= 0.95   # 指標判斷條件。
        failureLimit: 10
        provider:
          prometheus:   # 指標採集服務地址。
            address: http://arms-prom-server.arms-prom.svc.cluster.local:9090  # ARMS Prometheus服務地址,為上一步擷取的服務地址address。
            query: |
              sum(
                irate(nginx_ingress_controller_requests{status=~"(1|2).*", canary!="" ,service="{{args.service-name}}"}[5m]))
                /
                sum(irate(nginx_ingress_controller_requests{canary!="",service="{{args.service-name}}"}[5m])
              )
  4. 確保Arms Prometheus有持續的指標資料。

    1. 執行以下命令,持續訪問應用的Ingress入口,擷取ACK叢集的Ingress資訊。

      kubectl get ingress

      預期輸出:

      NAME                                        CLASS   HOSTS                 ADDRESS         PORTS   AGE
      rollouts-demo-rollouts-demo-stable-canary   nginx   rollouts-demo.local   8.217.XX.XX   80      9h
      rollouts-demo-stable                        nginx   rollouts-demo.local   8.217.XX.XX   80      9h
    2. 修改本地Hosts檔案,新增如下配置。

      8.217.XX.XX  rollouts-demo.local
    3. 在新的視窗中,執行以下命令,持續為應用增加訪問流量。

       while true; do curl -s "http://rollouts-demo.local/" | grep -o "<title>.*</title>" ;sleep 200ms;done
  5. 執行以下命令,查看Rollouts運行狀態。

    kubectl argo rollouts get rollout rollouts-demo --watch

    預期輸出:

    自動..png

  6. 查看ARMS Prometheus監控指標。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > Prometheus 監控

    3. Prometheus 監控頁面,單擊網路監控頁簽,然後單擊叢集Ingress流量監控

      查看ARMS監控指標如下圖所示。

      arms..png

    金絲雀發布完成後,效果如下圖所示。

    自動發布完成..png

(可選)步驟五:金絲雀發布復原

在金絲雀發布過程中,如果您發現應用異常,可以通過修改rollout.yaml檔案進行復原。具體操作如下。

在rollout.yaml檔案中,修改如下內容,然後儲存並提交。

    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:yellow  # 僅需把該處調整為穩定版本的Tag,儲存並提交Git倉庫。

預期輸出:

復原..png

相關文檔