全部產品
Search
文件中心

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

更新時間:Jan 26, 2025

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

前提條件

  • 已開啟艦隊管理功能。具體操作,請參見開啟艦隊管理功能

  • 已建立ACK叢集,並將其關聯至ACK One Fleet執行個體。具體操作,請參見建立Kubernetes託管版叢集添加關聯集群

    • 如需使用A/B Testing或金絲雀發布的能力,叢集版本需為1.19及以上版本。

    • 如需使用分批發布能力,則叢集版本需為1.16及以上版本。

  • 已從ACK One控制台擷取Fleet執行個體的KubeConfig,並通過kubectl串連至Fleet執行個體。

  • 已安裝kubectl-kruise。關於kubectl-kruise安裝路徑,請參見kubectl-kruise

Kruise Rollout介紹

Kruise Rollout是OpenKruise社區開源的漸進式交付架構。Kruise Rollout支援配合流量和執行個體灰階的灰階發布、藍綠髮布、A/B Testing發布。基於Prometheus Metrics指標,Kruise Rollout還可以實現發布過程的自動化分批與暫停,並提供旁路的無感對接、相容已有的多種工作負載(Deployment、CloneSet、StatefulSet)。更多資訊,請參見Kruise Rollout

Kruise Rollout是一種旁路式的工作機制。您只需配置一份Rollout資源並將其下發到K8s叢集中,後續的業務發布、升級均無需額外操作,並且可以與Helm、PaaS平台低成本地無縫對接。使用Kruise Rollout實現灰階發布架構如下圖所示。gray

注意事項

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

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

步驟一:在ACK叢集中部署Kruise Rollout組件

安裝Kruise Rollout組件。

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

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

  3. 組件管理頁面,單擊應用管理頁簽,然後在ack-kruise卡片右下方,單擊安裝

  4. 在彈出的對話方塊確認資訊後,單擊確定

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

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

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

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

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

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

    預期輸出:

    Repository 'https://github.com/openkruise/samples.git' added

    執行以下命令,查看已添加的Git Repo列表。

    argocd repo list

    預期輸出:

    TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT
    git gitops-demo https://github.com/openkruise/samples.git false false false false Successful
  2. 執行以下命令,查看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.
  3. 執行以下命令,通過Application方式建立應用,其中revision為穩定版本的Tag。

    argocd app create rollouts-demo --repo https://github.com/openkruise/samples.git --project default --sync-policy none --revision gitops-demo-version-stable --path gitops-demo --dest-namespace default --dest-server https://192.168.XX.XX:6443
  4. 執行以下命令,查看應用列表。

    argocd app list

    預期輸出:

    NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
    
    rollouts-demo https://192.168.XX.XX:6443 default default OutOfSync Healthy <none> <none> https://github.com/openkruise/samples.git gitops-demo 616b4b6 
  5. 執行以下命令,同步應用。

    argocd app sync rollouts-demo

    預期輸出:

    Name: argocd/rollouts-demo
    Project: default
    Server: https://192.168.XX.XX:6443
    Namespace: default
    URL: https://127.0.0.1:61231/applications/rollouts-demo
    Repo: https://github.com/openkruise/samples.git
    Target: 616b4b6
    Path: gitops-demo
    SyncWindow: Sync Allowed
    Sync Policy: <none>
    Sync Status: Synced to 616b4b6
    Health Status: Progressing
    
    Operation: Sync
    Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7
    Phase: Succeeded
    Start: 2023-08-07 16:02:12 +0800 CST
    Finished: 2023-08-07 16:02:13 +0800 CST
    Duration: 1s
    Message: successfully synced (all tasks run)
    
    GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
     Service default echo-server Synced Healthy service/echo-server created
    apps Deployment default echo-server Synced Progressing deployment.apps/echo-server created
    networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo created
    rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo created
  6. 在ArgoCD UI中Applications中單擊rollouts-demo應用,應用詳情如下圖所示。

    image.png

  7. 執行以下命令,查看Rollouts運行狀態。

    kubectl get rollout --kubeconfig <子叢集KubeConfig檔案路徑>
    重要
    • 查看Rollouts運行狀態需要在子叢集查看,通過kubectl get rollout查看時需要指定子叢集的KubeConfig檔案路徑。

    • 您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。

    預期輸出:

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Healthy 4 Completed workload deployment is completed 3m22s

步驟三:開始金絲雀發布

Git倉庫中的rollout.yaml檔案為Rollouts設定檔。rollout配置如下所示,發布過程分為四步:

  • 將舊版本應用的20%更新為新版本應用,並將20%的流量轉寄至新版本應用中,需要手動確認繼續發布

  • 將舊版本應用的40%更新為新版本應用,並將40%的流量轉寄至新版本應用中,暫停60秒後自動繼續發布

  • 將舊版本應用的60%更新為新版本應用,並將60%的流量轉寄至新版本應用中,暫停60秒後自動繼續發布

  • 將舊版本應用的80%更新為新版本應用,並將80%的流量轉寄至新版本應用中,暫停60秒後自動繼續發布

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
  annotations:
    rollouts.kruise.io/rolling-style: partition
spec:
  objectRef:
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: echo-server
  strategy:
    canary:
      steps:
      - replicas: 20%
        weight: 20 # 該發布步驟不設定暫停時間,需要手動確認繼續發布
      - replicas: 40%
        weight: 40
        pause:
          duration: 60
      - replicas: 60%
        weight: 60
        pause:
          duration: 60
      - replicas: 80%
        weight: 80
        pause:
          duration: 60
      trafficRoutings:
      - service: echo-server
        ingress:
          classType: nginx
          name: ingress-demo
  1. 執行以下命令,同步應用至新版本,其中revision為新版本的Tag。

    argocd app sync rollouts-demo --revision gitops-demo-version-canary

    預期輸出:

    Name: argocd/rollouts-demo
    Project: default
    Server: https://192.168.XX.XX:6443
    Namespace: default
    URL: https://127.0.0.1:62461/applications/rollouts-demo
    Repo: https://github.com/openkruise/samples.git
    Target: 616b4b6
    Path: gitops-demo
    SyncWindow: Sync Allowed
    Sync Policy: <none>
    Sync Status: OutOfSync from 616b4b6
    Health Status: Progressing
    
    Operation: Sync
    Sync Revision: 3d14cc011bb090dd2243f70a3741e9b8f5332cb9
    Phase: Succeeded
    Start: 2023-08-07 16:20:07 +0800 CST
    Finished: 2023-08-07 16:20:07 +0800 CST
    Duration: 0s
    Message: successfully synced (all tasks run)
    
    GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
     Service default echo-server Synced Healthy service/echo-server unchanged
    apps Deployment default echo-server OutOfSync Suspended deployment.apps/echo-server configured
    networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged
    rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo configured
  2. 等待本步完成,在執行以下命令,查看Rollouts運行狀態。

    kubectl get rollout --kubeconfig <子叢集KubeConfig檔案路徑>
    重要
    • 查看Rollouts運行狀態需要在子叢集查看,通過kubectl get rollout查看時需要指定子叢集的KubeConfig檔案路徑。

    • 您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。

    預期輸出如下,提示需要手動繼續下一步發布:

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Progressing 1 StepPaused Rollout is in step(1/4), and you need manually confirm to enter the next step 7m57s
  3. 執行以下命令,恢複金絲雀發布。

    kubectl-kruise rollout approve rollout/rollouts-demo  --kubeconfig <子叢集KubeConfig檔案路徑>
    重要
    • 需要在子叢集執行kubectl-kruise命令來恢複發布,命令中需要指定子叢集的KubeConfig檔案路徑。

    • 您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。

    預期輸出:

    rollout.rollouts.kruise.io/rollouts-demo approved
  4. 等待本步完成,執行以下命令,查看Rollouts運行狀態。

    kubectl get rollout --kubeconfig <子叢集KubeConfig檔案路徑>
    重要
    • 查看Rollouts運行狀態需要在子叢集查看,通過kubectl get rollout查看時需要指定子叢集的KubeConfig檔案路徑。

    • 您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。

    預期輸出如下,提示60秒後將進入下一步發布。

    NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE
    rollouts-demo Progressing 2 StepPaused Rollout is in step(2/4), and wait duration(60 seconds) to enter the next step 9m56s
  5. 之後Kruise Rollout將每隔60秒開始下一次發布,直至發布完成。

  6. 等待發布完成,執行以下命令,查看Rollouts運行狀態。

    kubectl get rollout --kubeconfig <子叢集KubeConfig檔案路徑>
    重要
    • 查看Rollouts運行狀態需要在子叢集查看,通過kubectl get rollout查看時需要指定子叢集的KubeConfig檔案路徑。

    • 您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。

    預期輸出如下,提示發布完成。

    NAME            STATUS    CANARY_STEP   CANARY_STATE   MESSAGE                                  AGE
    rollouts-demo   Healthy   4             Completed      Rollout progressing has been completed   15m

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

在金絲雀發布過程中,如果您發現應用異常,可以將應用的revison同步至舊版本commit進行復原。

執行以下命令,同步應用至舊版本,其中revision為舊版本的Tag。

argocd app sync rollouts-demo --revision gitops-demo-version-stable

預期輸出:

Project: default
Server: https://192.168.XX.XX:6443
Namespace: default
URL: https://127.0.0.1:49922/applications/rollouts-demo
Repo: https://github.com/Kuromesi/samples.git
Target: 616b4b6
Path: gitops-demo
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to 616b4b6
Health Status: Progressing

Operation: Sync
Sync Revision: 616b4b6e010ba4d71a92c0e7d050162956b169b7
Phase: Succeeded
Start: 2023-08-07 16:52:53 +0800 CST
Finished: 2023-08-07 16:52:54 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
 Service default echo-server Synced Healthy service/echo-server unchanged
apps Deployment default echo-server Synced Suspended deployment.apps/echo-server configured
networking.k8s.io Ingress default ingress-demo Synced Progressing ingress.networking.k8s.io/ingress-demo unchanged
rollouts.kruise.io Rollout default rollouts-demo Synced rollout.rollouts.kruise.io/rollouts-demo unchanged

相關文檔