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组件。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击应用管理页签,然后在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