ACK One GitOps 最佳实践
创始人
2025-06-01 11:51:39
0

作者:庄宇、流生

ACK One 是阿里云面向混合云、多集群、分布式计算等场景推出的分布式云容器平台,能够统一管理阿里云上、边缘、部署在客户数据中心以及其他云上的 Kubernetes 集群,并简化集群管理界面。通过 ACK One 多集群管理,可以关联并管理各种形态的 Kubernetes 集群,提供统一的集群控制面,实现多集群统一的应用分发,流量管理,运维管理,安全管理,GitOps 能力。本文介绍如何使用 ACK One GitOps 能力在多集群发布应用,以及版本管理,自动更新,权限控制,CI 流水线集成等,帮助您快速上手 GitOps。

GitOps 概述

在这里插入图片描述

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

GitOps 的优势:

  • 简单易学

Git 易于被接受开发者接受,易于集成,无额外学习成本。

  • 可靠性强

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

  • 安全性高

开发者使用 GitOps 不需要任何 Kubernetes 集群权限,只需要 Git 仓库权限。

  • 应用持续部署

Kubernetes 集群和 Git 仓库中的应用状态自动同步,保持一致。

CNCF 在对2023 Cloud Native 的预测中指出 Gitops 已经成熟并进入生产力稳定期,CNCF Gitops 开源项目 **Argo 已经在 2022 年 12 月正式成为 CNCF 毕业项目 [ 1] **,标志着 Argo 项目的稳定性和成熟度,以及越来越多的用户使用 Argo 项目实现 GitOps 应用分发。

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

ACK One GitOps

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

在这里插入图片描述

ACK One GitOps 优势如下:

  • 托管开源 ArgoCD,提供 ArgoCD 原生 CLI 和 UI 体验。
  • 专属 ArgoCD 控制台域名,集成阿里云账号 SSO 登录,支持 ArgoCD 多用户权限设置。
  • 多集群分发,ACK One 关联子集群自动加入 ArgoCD,成为应用分发 GitOps 的目标集群。
  • 支持 ArgoCD Applicationset,提升多集群应用分发体验。
  • 开箱即用,免运维。

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

前提条件

  • 已开启多集群管理功能,具体操作,请参见**开启多集群管理 [ 2] **。
  • 主控实例已添加多个关联集群,本文示例为 ackpro-cluster1和ackpro-cluster2。具体操作,请参见**添加关联集群 [ 3] **。
  • 已在 ACK One 控制台 ****获取主控实例的 KubeConfig,并通过 kubectl 连接至主控实例。
  • 安装阿里云最新版 CLI **[ 4] ****并配置凭证 [ 5] **。如果是子账号操作,请在 RAM 中授予子账号 AliyunAdcpFullAccess 权限。
  • 访问 **ArgoCD [ 6] **,下载安装最新的 ArgoCD CLI。
  • 安装 AMC 命令行工具。具体操作,请参见 **AMC 命令行帮助 [ 7] **。

通过 ACK One GitOps 控制台部署应用

步骤一:一键开启 ACK One GitOps(ArgoCD)

运行如下命令开启 GitOps,替换 clusterid 为您的主控实例 ID。

aliyun adcp UpdateHubClusterFeature --ClusterId  --ArgoCDEnabled true

通过以上命令,ACK One 会在您的账号中创建一个 ECI 实例运行 ArgoCD 服务,创建一个内网 SLB 暴露ArgoCD Server 服务,同时生成 ArgoCD Server 域名,并设置 DNS 解析到 SLB 的内网 IP。

ArgoCD Server 域名格式:

https://argocd. cluster id>…alicontainer.com,


您可以运行一下命令查看 GitOps 开启结果:



#查看ArgoCD pod
kubectl get pod -n argocd
NAME                             READY   STATUS    RESTARTS   AGE
argocd-server-76c9b99f47-c8hwn   8/8     Running   0          41s#查看ArgoCD Server域名
kubectl get cm argocd-cm -n argocd -o json | jq .data.url
"https://argocd.xxx.cn-xxx.alicontainer.com"


步骤二:登录 ACK One GitOps(ArgoCD)控制台 并部署应用

1.您可以直接使用浏览器访问“步骤一”中获得的 ArgoCD Server 域名,点击“LOGIN VIA ALIYUN“,登录ArgoCD 控制台。

在这里插入图片描述

2.添加发布源 Git Repo。

a. 在“Settings > Repositories”页面中,单击“+ CONNECT REPO”。

b. 输入 Git Repo URL:https://github.com/AliyunContainerService/gitops-demo.git,单击“CONNECT”。

在这里插入图片描述

c. 添加成功后,该页面会显示 Git 的 CONNECTION STATUS 为 Successful。

在这里插入图片描述

3.创建 ArgoCD Application,并发布应用到目标集群。

a. 在“Application”页面中,单击“+ NEW APP”,配置如下。Application 讲拉取 GitRepo 中的Helm Chart 并部署到目标集群 default 命名空间。

在这里插入图片描述

  1. b. 创建完成后,在 ArgoCD 的 Applications 页面,即可查看 echo-server-app 的应用状态。

在这里插入图片描述

c. 单击目标应用下方的 SYNC,将应用同步部署至目标集群。

同步完成后,echo-server-app 应用的 Status 右侧出现 Healthy 和 Synced,表示应用已同步。单击echo-server,即可查看该应用详情,ArgoCD 将展示应用相关 kubernetes 资源的拓扑结构,及相应的状态。

在这里插入图片描述

步骤三:查看应用的实际部署情况

连接主控实例的 Kubeconfig,运行以下命令,主控实例将转发请求到特定集群。

//查看主控实例已关联的子集群
kubectl amc get managedcluster
Name       Alias             HubAccepted
cdxxx      ackpro-cluster2   true
cexxx      ackpro-cluster1   true    //GitOps部署目标集群//通过-m参数指定集群,查看default命令空间下的Deployment,Service, Pod资源。
kubectl amc get all -n default -m cexxx
Run on ManagedCluster cexxx (ackpro-cluster1)
NAME                               READY   STATUS    RESTARTS   AGE
pod/echo-server-5cf54bdbcb-jv58k   1/1     Running   0          59mNAME                  TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)          AGE
service/echo-server   LoadBalancer   192.xxx.xxx.xxx   39.xxx.xxx.xxx   8080:31769/TCP   59m        21dNAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echo-server   1/1     1            1           59m//访问Loadbalance Service的External-IP,验证应用执行情况,显示版本为v1.0curl http://39.xxx.xxx.xxx:8080/version
"Hello Echo Server v1.0"

步骤四:升级应用版本

1.更新 git 中的 image tag 版本,从“v1.0”到“v2.0”。

在这里插入图片描述

2.因为 GitRepo 发生变化,ArgoCD Application 显示“OutOfSync”。

在这里插入图片描述

点击黄色“OutOfSync”图标,可以查看详细的区别:

在这里插入图片描述

3.点击“Sync”,发起同步,同步完成后,Pod Image Tag 变成“v2.0”,与预期一致。

在这里插入图片描述

访问 Service,查看实际的效果,版本变为 v2.0。

curl http://39.98.55.113:8080/version
"Hello Echo Server v2.0"

步骤五:回滚应用版本

您可以发现,在发布版本“v2.0”后,ArgoCD 会保留之前的 replicaset,便于快速回滚之前的版本。

// 在ACK One主控实例上,通过amc -m参数,查看指定子集群的资源状态
kubectl amc get replicaset  -n default -m cexxx
Run on ManagedCluster cexxx (ackpro-cluster1)
NAME                     DESIRED   CURRENT   READY   AGE
echo-server-55664c4677   1         1         1       26m    // 版本v2.0
echo-server-5cf54bdbcb   0         0         0       109m   // 版本v1.0

现在我们假设 “v2.0 “有问题,想回滚到” v1.0”,点击应用的 “HISTORY AND ROLLBACK”,可以查看到应用所有历史版本,您可以选择相应的版本回滚,本示例选择 “v1.0",并点击 “Rollback”。

在这里插入图片描述

查看回滚情况,Pod Image Tag 已经回滚到 “v1.0”,由于和 GitRepo 相比出现不同,因此应用状态变成 “OutOfSync”,在问题修复后,可点击 Sync 同步。当然 ArgoCD 也支持自动同步。

在这里插入图片描述

通过 ArgoCD CLI 部署应用

开启 ACK One GitOps 后,您也可以通过 ArgoCD CLI 完成 GitOps 应用管理。

  1. 登陆 ArgoCD Server,CLI 将会打开浏览器完成 SSO 登录。
//登陆argocd server
argocd login argocd...alicontainer.com --sso
Opening browser for authentication
Performing authorization_code flow login: https://signin.aliyun.com/oauth2/v1/auth?xxx
Authentication successful
'root' logged in successfully
Context 'argocd...alicontainer.com' updated
  1. 增加并查看 Git Repo

//增加git repo
argocd repo add https://github.com/AliyunContainerService/gitops-demo.git --name echo-server
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         https://github.com/AliyunContainerService/gitops-demo.git  false     false  false  false  Successful           default
  1. 查看集群
argocd cluster list
SERVER                          NAME                    VERSION  STATUS   MESSAGE                                                  PROJECT
https://10.xxx.xxx.xxx:xxx      cexxx-ackpro-cluster1            Unknown  Cluster has no applications and is not being monitored.
https://10.xxx.xxx.xxx:xxx      cdxxx-ackpro-cluster2            Unknown  Cluster has no applications and is not being monitored.
https://kubernetes.default.svc  in-cluster                       Unknown  Cluster has no applications and is not being monitored.

您可以通过 ACK One 多集群管理主控实例,关联新的集群,ACK One 将自动同步集群到 ArgoCD中。

  1. 创建应用,并同步应用。
//创建应用
argocd app create echo-server --repo https://github.com/AliyunContainerService/gitops-demo.git --path manifests/helm --revision one-demo --dest-namespace default --dest-server https://10.0.47.122:6443
application 'echo-server' created//同步应用,从Git中拉取应用,并实际部署到目标集群中
argocd app sync echo-server

管理 ACK One GitOps 用户权限

ArgoCD 提供强大的用户权限管理功能,基于以下权限策略模版,您可以灵活配置某个用户对某个资源具有某种权限。支持的资源 resource 类型包括:applications,clusters,repositories 等,还可以指定具体的资源名称所属的 project。权限 action 包括:create,update,delete,get 等。

p, , , , /
 

下面我们通过一个示例来演示用户权限设置。

定义一个 ArgoCD 管理员,具有所有资源的所有权限,因此可以创建 ArgoCD Application 部署应用。定义一个开发者用户,可以向 GitRepo 中提交修改,但只能查看 ArgoCD 的资源,例如可以查看 ArgoCD Application 的部署结果。

相应的配置如下:管理员通过命令 “kubectl edit cm argocd-rbac-cm -n argocd”,编辑 ArgoCD configmap argocd-rbac-cm。

data:policy.csv: |g, "26xxx", role:admin     //阿里云子账号,授权为ArgoCD管理员g, "27xxx", role:readonly     //阿里云子账号,授权为ArgoCD只读用户

role:admin和role:readonly 为 ArgoCD 内嵌的权限名称,分别对应管理员权限和只读权限。

具体的定义您可以参考:

https://github.com/argoproj/argo-cd/blob/master/assets/builtin-policy.csv

您也可以构建适合具体业务场景的权限,并授权特定的用户。另外,推荐您阅读 ACK One GitOps 安全模型,可以查看更详细的用户权限示例与说明。

通过 ArgoCD Applicationset 实现多集群 GitOps 部署

Applicationset 是 ArgoCD 针对多集群场景所构建的,通过 Applicationset,可以生产多个 Application 实例,以支持不同的 GitRepo,不同的目标集群。跟随下面的实例,我们将通过定义 Applicationset,从不同的 GitRepo 目录读取部署 Yaml,并向2个集群完成应用部署。

在这里插入图片描述

  1. 由于不同集群含有不同的 image 版本和 service 配置,我们使用 GitRepo 中的2个目录存储2个集群部署Yaml 文件,对应 production 和 staging 环境。
└── manifests└── directory├── production│   ├── deployment.yaml  //image tag 为v1.0│   └── service.yaml└── staging├── deployment.yaml  //image tag 为v2.0└── service.yaml
  1. 使用下面的命令创建 Applicationset
//创建命名空间,在主控实例中创建命名空间,将自动同步到子集群
kubectl create ns one-demo//创建Applicationset
cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:name: echo-servernamespace: argocd
spec:generators:- list:elements:- cluster: production            //集群1url: https://10.xxx.xxx.xxx:6xxx- cluster: staging               //集群2url: https://10.xxx.xxx.xxx:6xxtemplate:metadata:name: '{{cluster}}-gitops-demo'spec:project: defaultsource:repoURL: https://github.com/AliyunContainerService/gitops-demo.gittargetRevision: one-demopath: manifests/directory/{{cluster}}  //对应集群目录名称destination:server: '{{url}}'                      //引用集群urlnamespace: one-demo
EOF
  1. 查看应用部署结果,可以看到2个 Application 已经被创建出来,从不同的 GitRepo 目录获取部署 Yaml,部署到不同目标集群。

在这里插入图片描述

点击“Sync”,可以通过在 ACK One 主控实例中运行 kubectl 获取实际的 Kubernetes 资源运行状态。

kubectl amc get deployment -m all -n one-demo   //amc -m all将获取所有关联集群的资源状态 
Run on ManagedCluster cdcxxx (ackpro-cluster2)
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
echo-server   1/1     1            1           18m
Run on ManagedCluster cedxxx (ackpro-cluster1)
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
echo-server   1/1     1            1           18mkubectl amc get svc -m all -n one-demo    //amc -m all将获取所有关联集群的资源状态 
Run on ManagedCluster cdcxxx (ackpro-cluster2)
NAME          TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)    AGE
echo-server   ClusterIP      192.xxx.xxx.xxx            80/TCP     18m
Run on ManagedCluster cedxxx (ackpro-cluster1)
NAME          TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)    AGE
echo-server   ClusterIP      192.xxx.xxx.xxx            80/TCP     18m

通过 Image Updater 实现 CI 流水线集成

在这里插入图片描述

ACK One GitOps 解决了应用部署的问题,但开发团队需要的 E2E,从代码提交,镜像构建,到自动部署的全流程全自动方案,全自动方案对开发测试环境尤为重要,可以帮助提高研发效能。ACK One GitOps 集成开源 ArgoCD Image Updater 项目,并扩展支持了 ACR 镜像仓库。当 CI 流水线构建镜像发布到 ACK 镜像仓库后,Image Updater 可以监控到镜像的变更,自动更新部署 Git Repo 中的 Image Tag,之后,ArgoCD Application 监控到 Git Repo 变更,发起 Sync 部署应用。通过 Image Updater,ACK One GitOps 可以 CI 流水线联动,提供 E2E 全流程的 CI+CD 自动化方案。

关于 Image Updater 详细的描述与用法,请参考文档:基于 ACK One 和 ACR 构建应用全自动化 GitOps 交付的实践:

https://developer.aliyun.com/article/1122570

参考文档

分布式云容器平台 ACK One

https://www.aliyun.com/product/aliware/adcp

ACK One 产品控制台

https://cs.console.aliyun.com/one

多集群应用分发 GitOps

https://help.aliyun.com/document_detail/456131.html

ACK One GitOps 安全模型

https://developer.aliyun.com/article/1091623

ArgoCD 官方文档

https://argo-cd.readthedocs.io

ArgoCD Applicationset

https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/

ArgoCD Image Updater

https://argocd-image-updater.readthedocs.io/

相关链接

[1] Argo 已经在 2022 年 12 月正式成为 CNCF 毕业项目

https://www.cncf.io/announcements/2022/12/06/the-cloud-native-computing-foundation-announces-argo-has-graduated/

[2] 开启多集群管理

https://help.aliyun.com/document_detail/384048.htm#task-2168150

[3] 添加关联集群

https://help.aliyun.com/document_detail/415167.htm#section-wyy-8ru-76j

[4] 安装阿里云最新版 CLI

https://help.aliyun.com/document_detail/121988.html

[5] 配置凭证

https://help.aliyun.com/document_detail/121193.html

[6] ArgoCD

https://github.com/argoproj/argo-cd/releases

[7] AMC 命令行帮助

https://help.aliyun.com/document_detail/393747.htm#task-2172705

相关内容

热门资讯

迈克尔杰克逊荣耀一生,却没有获... 迈克尔杰克逊荣耀一生,却没有获得一次格莱美晕 战栗专辑一次就获得了8个
我是活人还是鬼魂呢? 我是活人还是鬼魂呢?你能做到五戒十善,就是人,或者是天人,你要是破戒无恶不作,你连鬼魂都没资格做。
陈某某和孙子(5岁)孙女(7岁... 转自:长安街知事6月5日,贵州遵义市应急管理局公布了《遵义市仁怀市高大坪镇“4·29”较大火灾事故调...
隐藏式门把手,贯穿式尾灯,熏黑... 6月5日,我们从小鹏官方了解到,旗下全新中型SUV——小鹏G7将在6月中旬正式亮相并开启预售。该车定...
中国深渊科考,走向世界! 转自:北京日报客户端世界海洋日到来之际,中国深渊科考正在开启全球合作新篇章。“全球深渊探索计划”已于...
送考妈妈暴雨中久久不愿离开 【#送考妈妈暴雨中久久不愿离开#】 6月8日,是2025年高考的第二天。当天上午8点左右,武汉突然天...
中小学生心理健康教育的主要任务... 中小学生心理健康教育的主要任务不包括中小学生心理健康教育的主要任务不包括诊治学生的心理疾病。中小学心...
台湾的“神秘部队”弱爆了 大家这两天都看到消息了:广州市公安局天河区分局发布悬赏通告,公布中国台湾民进党当局“资通电军”涉嫌多...
晴间多云, 注意分散性雷阵雨 转自:廊坊日报 本报讯(记者 李虹瑾)记者从市气象局了解到,高考期间(7日至9日)我市大部分...
有“模”有样 创智未来 转自:廊坊日报 6月7日,小选手们修剪建筑模型庭院内的树木。 当日,“中海博杯”上海市...
中国散裂中子源新设备通过验收,... 转自:北京日报客户端6月8日,中国科学院高能物理研究所发布消息,中国散裂中子源直线加速器首支紧凑型P...
国风翻糖炸翻全球!老外看呆了 转自:CGTN #Z世代的赛博天空#【国风翻糖炸翻全球!...
开展十余项空间科学研究,神二十... 神舟二十号航天员乘组进入中国空间站工作生活已有一个多月。自5月22日圆满完成首次出舱活动后,神二十乘...
事关高考外语考试!河北省教育考... 转自:河北新闻网纵览客户端6月8日讯 据河北省教育考试院微信公众号消息,6月8日15:00―17:0...
大商所扩大线型低密度聚乙烯、聚... 转自:新华财经新华财经北京6月8日电 为更好发挥期货市场功能,服务塑化产业发展,6月6日大商所发布公...
哥伦比亚右翼总统候选人遭枪击,... 转自:参考消息 #哥伦比亚右翼总统候选人伤势严重# 【哥...
中国驻芝加哥总领馆官员视频探视... 转自:新华网新华社纽约6月7日电(记者 徐静)中国驻芝加哥总领馆发言人就中国学者被起诉走私危险菌种事...
“两高”联合印发通知:11个检... 近日,最高法、最高检联合印发《关于完善对海事法院法律监督机制的通知》(下称《通知》)。为完善对海事法...
天更蓝、山更绿、水更清,长春市... 环境空气综合指数3.54,同比下降0.04;16个长春市永春现代生物医药城水质均为四类及以上,无劣五...
我驻日使馆提醒! 6月7日,中国驻日本大使馆发文提醒在日中国公民加强安全防范。全文如下:一、据日本媒体报道,6月6日晚...