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

  1. 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
  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, <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
  1. 使用下面的命令创建 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
  1. 查看应用部署结果,可以看到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

posted @ 2023-03-22 17:20  阿里云云原生  阅读(74)  评论(0编辑  收藏  举报