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實現灰階發布架構如下圖所示。
注意事項
如果您選擇GitHub倉庫,則不推薦使用中國內地地區。如需在中國內地地區運行,您可以選擇適合的Git服務提供者。
本文艦隊管理的Fleet執行個體和關聯的ACK叢集的地區均以中國香港地區為例。
步驟一:在ACK叢集中部署Kruise Rollout組件
安裝Kruise Rollout組件。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在組件管理頁面,單擊應用管理頁簽,然後在ack-kruise卡片右下方,單擊安裝。
在彈出的對話方塊確認資訊後,單擊確定。
步驟二:使用ACK One GitOps發布應用
通過GitOps發布應用支援以下兩種方式。
通過ArgoCD CLI的方式發布應用。下文以此方式為例,介紹如何使用GitOps發布應用。
通過GitOps控制台發布應用。具體操作,請參見GitOps快速入門。
執行以下命令,添加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執行以下命令,查看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.執行以下命令,通過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執行以下命令,查看應用列表。
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執行以下命令,同步應用。
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在ArgoCD UI中Applications中單擊rollouts-demo應用,應用詳情如下圖所示。

執行以下命令,查看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執行以下命令,同步應用至新版本,其中
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等待本步完成,在執行以下命令,查看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執行以下命令,恢複金絲雀發布。
kubectl-kruise rollout approve rollout/rollouts-demo --kubeconfig <子叢集KubeConfig檔案路徑>重要需要在子叢集執行
kubectl-kruise命令來恢複發布,命令中需要指定子叢集的KubeConfig檔案路徑。您也可以通過設定KUBECONFIG環境變數或其他方式來切換到子叢集的KubeConfig。
預期輸出:
rollout.rollouts.kruise.io/rollouts-demo approved等待本步完成,執行以下命令,查看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之後Kruise Rollout將每隔60秒開始下一次發布,直至發布完成。
等待發布完成,執行以下命令,查看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