ACK One整合了ArgoCD GitOps的能力,同時結合漸進式發布組件Argo Rollouts,通過Git Commit實現全自動的金絲雀發布。本文介紹如何通過ACK One GitOps結合Argo Rollouts組件快速構建應用的金絲雀發布能力。
前提條件
已開啟艦隊管理功能。具體操作,請參見開啟艦隊管理功能。
已建立ACK叢集,並將其關聯至ACK One Fleet執行個體。具體操作,請參見建立Kubernetes託管版叢集和添加關聯集群。
已從ACK One控制台擷取Fleet執行個體的KubeConfig,並通過kubectl串連至Fleet執行個體。
已安裝最新的Argo Rollouts kubectl plugin。更多資訊,請參見Argo Rollouts官方文檔。
相關概念
注意事項
如果您選擇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組件
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在組件管理頁面,單擊日誌與監控頁簽,找到ack-arms-prometheus組件。
若在卡片右上方顯示已安裝,說明在建立叢集時已安裝ack-arms-prometheus組件,您無需處理。
若在卡片右上方未顯示資訊,您需要單擊卡片右下方的安裝,在ACK叢集中安裝該組件。
步驟三:使用ACK One GitOps發布應用
通過GitOps發布應用支援以下兩種方式。
通過ArgoCD CLI的方式發布應用。下文以此方式為例,介紹如何使用GitOps發布應用。
通過GitOps控制台發布應用。具體操作,請參見GitOps快速入門。
執行以下命令,添加Git Repo。
argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name gitops-demo預期輸出:
Repository 'https://github.com/AliyunContainerService/gitops-demo.git' added執行以下命令,查看已添加的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執行以下命令,查看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方式建立應用。
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執行以下列表,查看應用列表。
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執行以下命令,查看Rollouts運行狀態。
kubectl argo rollouts get rollout rollouts-demo --watch預期輸出:

步驟四:開始金絲雀發布
Argo Rollouts金絲雀發布的過程中,您可以通過以下兩種方式確認新版本的應用是否正常,進而決定是否進一步增加新版本的流量權重,直到全部流量都指向新版本。一種是人工確認;另一種是通過ARMS Prometheus監控採集到的新版本應用的業務指標狀態,決定是否增加新版本流量權重。
人工確認方式
在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執行以下命令,查看Rollouts運行狀態。
kubectl argo rollouts get rollout rollouts-demo --watch預期輸出:

在rollout.yaml檔案中,在第一個
puase的位置,由於未設定暫停時間,因此金絲雀發布會一直暫停在該處,直到有resumed或promoted動作為止。恢複金絲雀發布。
在rollout.yaml檔案中,修改如下內容,然後儲存並提交。
steps: - setWeight: 20 - pause: {duration: 10s} # 此處增加一個較短的duration,使其快速進入下一步。再次執行以下命令,恢複金絲雀發布。
kubectl argo rollouts get rollout rollouts-demo --watch預期輸出:

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

通過ARMS Prometheus監控指標自動確認
在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。擷取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。在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]) )確保Arms Prometheus有持續的指標資料。
執行以下命令,持續訪問應用的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修改本地Hosts檔案,新增如下配置。
8.217.XX.XX rollouts-demo.local在新的視窗中,執行以下命令,持續為應用增加訪問流量。
while true; do curl -s "http://rollouts-demo.local/" | grep -o "<title>.*</title>" ;sleep 200ms;done
執行以下命令,查看Rollouts運行狀態。
kubectl argo rollouts get rollout rollouts-demo --watch預期輸出:

查看ARMS Prometheus監控指標。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Prometheus 監控頁面,單擊網路監控頁簽,然後單擊叢集Ingress流量監控。
查看ARMS監控指標如下圖所示。

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

(可選)步驟五:金絲雀發布復原
在金絲雀發布過程中,如果您發現應用異常,可以通過修改rollout.yaml檔案進行復原。具體操作如下。
在rollout.yaml檔案中,修改如下內容,然後儲存並提交。
spec:
containers:
- name: rollouts-demo
image: argoproj/rollouts-demo:yellow # 僅需把該處調整為穩定版本的Tag,儲存並提交Git倉庫。預期輸出:
