最佳实践概述

在完整的CI/CD流水线中,您可以通过修改代码自动触发CI构建,并将镜像推送到容器镜像服务ACR,然后触发ACK One GitOps将应用持续部署到各个集群。本文通过示例介绍完整流程中ACK One GitOps最佳实践的相关概念和流程。

相关概念

展开查看GitOps相关概念

GitOps介绍

应用分发GitOps的核心是使用Git仓库来管理应用的部署模板,将应用持续部署到指定Kubernetes集群中,并以Git仓库作为应用部署的唯一来源,不断调整Kubernetes集群上应用的状态,使集群应用的状态最终与Git仓库中的期待状态保持一致。

image

GitOps优势

  • 简单易学:Git易于被开发者接受,易于集成,无需额外学习成本。

  • 可靠性强:Git仓库作为应用部署的唯一来源,可提供版本控制、快速回滚和审计能力。

  • 安全性高:开发者使用GitOps无需任何Kubernetes集群权限,仅需要Git仓库权限,保证集群安全可靠。

  • 应用持续部署:Kubernetes集群和Git仓库中的应用状态自动同步,保持一致,实现应用持续部署。

展开查看ACK One GitOps相关概念

ACK One GitOps介绍

ACK One舰队的Fleet实例托管了开源ArgoCD实现应用的GitOps持续交付,同时集成ACK One舰队能力实现多集群的GitOps持续交付,满足应用的高可用部署、系统组件的多集群分发等需求。

ArgoCD是CNCF开源项目,遵循声明式GitOps理念的持续交付工具,对接Git仓库和Helm仓库,提供功能强大的可视化页面。ArgoCD作为控制器运行在Kubernetes集群中,可以持续监控应用的实际状态,并与Git仓库中声明的期望状态保持同步。关于ArgoCD的更多信息,请参见ArgoCD

image

ACK One GitOps优势

  • 托管开源ArgoCD,提供ArgoCD原生CLI和UI体验。

  • 专属ArgoCD控制台域名,集成阿里云账号SSO登录,支持ArgoCD多用户权限设置。

  • 多集群分发,ACK One关联集群自动加入ArgoCD,成为应用分发GitOps的目标集群。

  • 支持ArgoCD ApplicationSet,提升多集群应用分发体验。

  • 开箱即用,免运维。

使用ACK One GitOps,您可以开箱即用获得CNCF毕业项目ArgoCD的GitOps能力,包括与阿里云账号集成的ArgoCD原生控制台和CLI、多用户权限管理、多集群发布能力等,帮助您快速构建多集群发布流水线。

流程概述

本实践基于ACK One GitOps和ACR来构建开发(Dev)、预发(Staging)、生产(Production)集群的CI/CD流水线,实现代码修改提交到Git仓库后,自动将最新镜像更新至应用,并按以下方式部署最新镜像到各环境中。

  • Dev集群:应用自动同步,部署最新镜像。

  • Staging、Produciton集群:应用手动同步,并基于Rollout灰度发布,部署最新镜像。

image
  1. 准备业务仓库代码仓库和应用部署代码仓库。

  2. 开启和登录ACK One GitOps后,运维团队首先配置CI构建流程和规则,并关联ACR EE实例。

  3. 开发团队将代码推送到代码仓库中,触发ACR EE构建镜像,并将新版本的镜像推送到ACR EE镜像仓库中。

  4. 镜像仓库的变更会被ACK One GitOps检测到,然后,ACK One GitOps将新的镜像版本号回写到应用部署代码仓库中。

  5. ACK One GitOps检测到应用部署代码仓库中镜像版本号的变化后,触发Application将最新镜像部署到持续集成开发集群(Dev)。

    • 对于配置了自动同步Application的持续集成测试集群,ACK One GitOps会自动变更应用的镜像版本。

    • Image Updater会监测镜像仓库中符合配置规则的镜像的更新。

    • ArgoCD会监测应用部署仓库中YAML的变化。

  6. 在完成持续部署之后,开发团队验证Dev环境中的应用是否符合预期。

  7. 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。

通过控制台开启和登录

  1. 登录ACK One控制台,在左侧导航栏选择舰队 > GitOps

  2. GitOps页面左上角单击舰队名称后的Dingtalk_20231226104633.jpg按钮,在下拉列表中选择目标舰队。

  3. 新建舰队默认已开启GitOps,如果您的舰队未开启,可单击开启GitOps,在弹出的对话框中单击确定完成开启。

    若舰队已开启GitOps,GitOps页面会显示GitOps控制台访问控制

  4. 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多租户权限