在完整的CI/CD流水线中,您可以通过修改代码自动触发CI构建,并将镜像推送到容器镜像服务ACR,然后触发ACK One GitOps将应用持续部署到各个集群。本文通过示例介绍完整流程中ACK One GitOps最佳实践的相关概念和流程。
相关概念
流程概述
本实践基于ACK One GitOps和ACR来构建开发(Dev)、预发(Staging)、生产(Production)集群的CI/CD流水线,实现代码修改提交到Git仓库后,自动将最新镜像更新至应用,并按以下方式部署最新镜像到各环境中。
Dev集群:应用自动同步,部署最新镜像。
Staging、Produciton集群:应用手动同步,并基于Rollout灰度发布,部署最新镜像。
准备业务仓库代码仓库和应用部署代码仓库。
开启和登录ACK One GitOps后,运维团队首先配置CI构建流程和规则,并关联ACR EE实例。
开发团队将代码推送到代码仓库中,触发ACR EE构建镜像,并将新版本的镜像推送到ACR EE镜像仓库中。
镜像仓库的变更会被ACK One GitOps检测到,然后,ACK One GitOps将新的镜像版本号回写到应用部署代码仓库中。
ACK One GitOps检测到应用部署代码仓库中镜像版本号的变化后,触发Application将最新镜像部署到持续集成开发集群(Dev)。
对于配置了自动同步Application的持续集成测试集群,ACK One GitOps会自动变更应用的镜像版本。
Image Updater会监测镜像仓库中符合配置规则的镜像的更新。
ArgoCD会监测应用部署仓库中YAML的变化。
在完成持续部署之后,开发团队验证Dev环境中的应用是否符合预期。
Dev环境验证符合预期后,由运维团队手动触发预发(Staging)和生产(Production)环境的应用同步,并使用Argo Rollout或Kruise Rollout实现灰度发布,最终更新预发和生产环境中应用的镜像。更多信息,请参见基于ACK One Gitops使用Argo Rollouts实现金丝雀发布、基于ACK One Gitops使用Kruise Rollout实现金丝雀发布。
重要预发(Staging)和生产(Production)集群一般需要通过额外的发布流程来做多集群多地域的滚动发布,不能通过代码变更直接影响到预发和生产环境。
步骤一:应用部署代码仓库的目录结构介绍
本实践中应用部署代码仓库的目录结构可供您参考。详细的目录结构,请参见基于ACK One GitOps部署的应用示例介绍。
步骤二:开启和登录ACK One GitOps
您可以通过ACK One控制台和CLI两种方式开启和登录ACK One GitOps。
通过控制台开启和登录
登录ACK One控制台,在左侧导航栏选择 。
在GitOps页面左上角单击舰队名称后的按钮,在下拉列表中选择目标舰队。
新建舰队默认已开启GitOps,如果您的舰队未开启,可单击开启GitOps,在弹出的对话框中单击确定完成开启。
若舰队已开启GitOps,GitOps页面会显示GitOps控制台和访问控制。
在GitOps页面,单击GitOps控制台完成登录。
如需通过公网访问,请先开通GitOps公网访问。具体操作,请参见开通公网访问GitOps。
通过CLI开启和登录
关于通过CLI方式开启和登录CLI的具体操作,请参见在ACK One Fleet实例中开启GitOps和登录GitOps系统。
步骤三:构建容器镜像CI
您可以通过以下两种方式构建容器镜像CI,也可以替换成任意的第三方CI系统完成容器镜像CI的创建。
方式一:基于ACR构建CI
创建ACR EE镜像仓库,绑定您的代码仓库,并设置构建规则。具体操作,请参见使用企业版实例构建镜像。您可以在企业版实例的概览页开启公开匿名拉取或通过免密组件拉取镜像。具体操作,请参见使用免密组件拉取容器镜像。
如果您使用的代码源是Github,并且遇到了拉取代码超时的问题,可开启海外机器构建尝试解决问题。
方式二:基于ACK One工作流集群构建CI
关于基于ACK One工作流集群构建CI的具体操作,请参见使用ACK One分布式工作流集群构建容器镜像CI。
步骤四:使用ACK One GitOps部署应用
开启ACK One GitOps后,您可以通过ACK One GitOps(ArgoCD)控制台和ArgoCD CLI两种方式部署管理应用,并可以使用ApplicationSet实现多集群GitOps部署。更多信息,请参见使用ACK One GitOps部署应用。
步骤五:通过ACK One GitOps Image Updater构建完整的CI/CD流水线
ACK One GitOps解决了应用持续部署的问题,但开发团队有时需要从代码提交、镜像构建到自动部署的E2E的全流程全自动方案,以此提高研发效能。
为解决此问题,ACK One GitOps集成开源ArgoCD Image Updater项目,并扩展支持了ACR镜像仓库。当构建容器镜像CI在代码修改后,构建镜像并推送到ACR EE镜像仓库中,Image Updater可以监控到镜像的变更,自动更新应用部署代码仓库中的Image Tag。
应用部署代码仓库更新后,ArgoCD Application会监控到应用部署代码仓库变更,发起Sync部署应用。通过Image Updater的串联,ACK One GitOps可以实现CI流水线联动,提供E2E全流程的CI+CD全自动化方案。
更多信息,请参见基于ACK One GitOps和ACR构建CI/CD流水线。
由于ArgoCD会监测应用部署仓库的变化,所以,如果您希望通过直接变更应用部署仓库中应用YAML的镜像,来触发应用新镜像到集群的更新,则可以不使用Image Updater来自动监测镜像仓库的变化。
步骤六:灰度发布
预发(Staging)和生产(Production)集群一般需要通过额外的发布流程来做多集群多地域的滚动发布,不能通过代码变更直接影响到预发和生产环境。详细信息,请参见基于ACK One Gitops使用Argo Rollouts实现金丝雀发布和使用Kruise Rollout实现灰度发布(金丝雀&A/B Testing)。
步骤七:回滚应用
如果应用发布失败,则需要回滚应用。您可以通过以下两种方式进行应用回滚。
快速回滚
在ArgoCD控制台的应用页面,单击HISTORY AND ROLLBACK,然后选择相应版本,单击ROLLBACK进行回滚。更多信息,请参见回滚应用版本。
通过ArgoCD CLI回滚应用。具体操作,请参见通过Argo CLI回滚应用。
端到端回滚
您可以通过以下Git命令完成回滚提交的代码,并自动触发CI/CD。
# 回滚上一个commit。
git revert HEAD
# git revert HEAD~3..HEAD 表示从当前 HEAD 节点开始向前回退3个commit。
# git revert <commit-id-1> <commit-id-2> ... <commit-id-n> 可用来回退非连续的多个commit。
# revert完后,推送至原来分支,触发CI/CD。
git push origin HEAD:${branch}
回滚后的变更被Image Updater更新到应用部署代码仓库后,再次同步到应用中。
步骤八:管理ACK One GitOps用户权限
ArgoCD提供强大的用户权限管理功能。基于以下权限策略模板,您可以灵活配置某个用户对某个资源具有某种权限。支持的Resource资源类型包括Applications、Clusters、Repositories等,还支持指定具体的资源名称所属的Project。权限Action包括create、update、delete、get等。
p, <user/group>, <resource>, <action>, <project>/<object>
更多用户权限示例和说明,请参见配置ACK One GitOps多租户权限。