ACK One GitOps 最佳实践

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
云原生网关 MSE Higress,422元/月
可观测监控 Prometheus 版,每月50GB免费额度
简介: ACK One GitOps 最佳实践

作者:庄宇、流生

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


GitOps 概述


image.png

应用分发 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 持续交付,满足应用的高可用部署,系统组件多集群分发等需求。

image.png

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 <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 控制台。

image.png

2.添加发布源 Git Repo。

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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


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

image.png

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

连接主控实例的 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          59m
NAME                  TYPE           CLUSTER-IP        EXTERNAL-IP    PORT(S)          AGE
service/echo-server   LoadBalancer   192.xxx.xxx.xxx   39.xxx.xxx.xxx   8080:31769/TCP   59m        21d
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echo-server   1/1     1            1           59m
//访问Loadbalance Service的External-IP,验证应用执行情况,显示版本为v1.0
 curl http://39.xxx.xxx.xxx:8080/version
"Hello Echo Server v1.0"


步骤四:升级应用版本

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

image.png

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

image.png

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

image.png

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

image.png

访问 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”。

image.png

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

image.png


通过 ArgoCD CLI 部署应用


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

1. 登陆 ArgoCD Server,CLI 将会打开浏览器完成 SSO 登录。


//登陆argocd server
argocd login argocd.<ackone cluster id>.<region>.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.<ackone cluster id>.<region>.alicontainer.com' updated

2. 增加并查看 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

3. 查看集群


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

4. 创建应用,并同步应用。


//创建应用
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, <user/group>, <resource>, <action>, <project>/<object>

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

定义一个 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个集群完成应用部署。

image.png

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

2. 使用下面的命令创建 Applicationset


//创建命名空间,在主控实例中创建命名空间,将自动同步到子集群
kubectl create ns one-demo
//创建Applicationset
cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: echo-server
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - cluster: production            //集群1
        url: https://10.xxx.xxx.xxx:6xxx
      - cluster: staging               //集群2
        url: https://10.xxx.xxx.xxx:6xx
  template:
    metadata:
      name: '{{cluster}}-gitops-demo'
    spec:
      project: default
      source:
        repoURL: https://github.com/AliyunContainerService/gitops-demo.git
        targetRevision: one-demo
        path: manifests/directory/{{cluster}}  //对应集群目录名称
      destination:
        server: '{{url}}'                      //引用集群url
        namespace: one-demo
EOF

3. 查看应用部署结果,可以看到2个 Application 已经被创建出来,从不同的 GitRepo 目录获取部署 Yaml,部署到不同目标集群。

image.png

点击“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           18m
kubectl 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   <none>         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   <none>         80/TCP     18m


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


image.png

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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
17天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
17天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
24天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
25天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
1月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
2月前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
3月前
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes 安全性最佳实践
【8月更文第29天】随着容器化和微服务架构的普及,Kubernetes 已成为管理容器化应用的标准平台。然而,随着 Kubernetes 的广泛采用,其安全性问题也日益受到关注。本文将深入探讨 Kubernetes 的安全最佳实践,并通过具体的代码示例来展示如何保护 Kubernetes 集群免受攻击。
169 2
|
3月前
|
Kubernetes jenkins 持续交付
Kubernetes CI/CD 集成:持续交付的最佳实践
【8月更文第29天】随着微服务架构和容器化的普及,Kubernetes 成为了运行容器化应用的事实标准。为了确保应用能够快速迭代并稳定发布,持续集成/持续部署(CI/CD)流程变得至关重要。本文将介绍如何将 Kubernetes 集成到 CI/CD 流程中,并提供一些最佳实践。
262 1
|
3月前
|
Kubernetes 监控 容灾
ACK One舰队管理:企业级多集群管理解决方案
ACK One舰队管理是阿里云为您提供的强大的多集群管理方案,功能众多:GitOps应用分发、多集群网关、多集群Service、全局可观测、服务网格、统一权限管理等,方便您轻松应对混合云、多集群、容灾等场景的问题,简化多集群管理。

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多