作者:庄宇、流生

ACK One 是阿里云面向混合云、多集群、分布式核算等场景推出的分布式云容器渠道,能够共同办理阿里云上、边缘、布置在客户数据中心以及其他云上的 Kubernetes 集群,并简化集群办理界面。经过 ACK One 多集群办理,能够相关并办理各种形状的 Kubernetes 集群,供给共同的集群操控面,完成多集群共同的运用分发,流量办理,运维办理,安全办理,GitOps 才能。本文介绍怎么运用 ACK One GitOps 才能在多集群发布运用,以及版别办理,主动更新,权限操控,CI 流水线集成等,协助您快速上手 GitOps。

GitOps 概述

ACK One 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 库房中声明的希望状况坚持同步。

ACKOneGitOps

ACK One 多集群办理主控实例保管了开源 ArgoCD 项目,完成运用的 GitOps 继续交给,一起集成 ACK One 多集群才能完成多集群的 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 OneGitOps 操控台布置运用

过程一:一键敞开 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 操控台。

ACK One GitOps 最佳实践

2.增加发布源 Git Repo。

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

b. 输入 Git Repo URL:github.com/AliyunConta…,单击“CONNECT”。

ACK One GitOps 最佳实践

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

ACK One GitOps 最佳实践

3.创立 ArgoCD Application,并发布运用到方针集群。

a.在“Application”页面中,单击“+ NEW APP”,装备如下。Application 讲拉取 GitRepo 中的Helm Chart 并布置到方针集群 default 命名空间。

ACK One GitOps 最佳实践

  1. b. 创立完结后,在 ArgoCD 的 Applications 页面,即可检查 echo-server-app 的运用状况。

ACK One GitOps 最佳实践

c. 单击方针运用下方的 SYNC,将运用同步布置至方针集群。

同步完结后,echo-server-app 运用的 Status 右侧呈现 Healthy 和 Synced,表示运用已同步。单击echo-server,即可检查该运用概况,ArgoCD 将展示运用相关 kubernetes 资源的拓扑结构,及相应的状况。

ACK One GitOps 最佳实践

过程三:检查运用的实践布置状况

连接主控实例的 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”。

ACK One GitOps 最佳实践

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

ACK One GitOps 最佳实践

点击黄色“OutOfSync”图标,能够检查具体的差异:

ACK One GitOps 最佳实践

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

ACK One GitOps 最佳实践

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

ACK One GitOps 最佳实践

检查回滚状况,Pod Image Tag 现已回滚到 “v1.0”,由于和 GitRepo 相比呈现不同,因而运用状况变成 “OutOfSync”,在问题修复后,可点击 Sync 同步。当然 ArgoCD 也支撑主动同步。

ACK One GitOps 最佳实践

经过 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 OneGitOps用户权限

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 内嵌的权限称号,分别对应办理员权限和只读权限。

具体的界说您能够参阅:

github.com/argoproj/ar…

您也能够构建合适具体事务场景的权限,并授权特定的用户。另外,引荐您阅览 ACK One GitOps 安全模型,能够检查更具体的用户权限示例与说明。

经过 ArgoCD Applicationset 完成多集群GitOps 布置

Applicationset 是 ArgoCD 针对多集群场景所构建的,经过 Applicationset,能够出产多个 Application 实例,以支撑不同的 GitRepo,不同的方针集群。跟从下面的实例,咱们将经过界说 Applicationset,从不同的 GitRepo 目录读取布置 Yaml,并向2个集群完结运用布置。

ACK One GitOps 最佳实践

  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,布置到不同方针集群。

ACK One GitOps 最佳实践

点击“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 流水线集成

ACK One GitOps 最佳实践

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 交给的实践:

developer.aliyun.com/article/112…

参阅文档

分布式云容器渠道 ACK One

www.aliyun.com/product/ali…

ACK One 产品操控台

cs.console.aliyun.com/one

多集群运用分发 GitOps

help.aliyun.com/document_de…

ACK One GitOps 安全模型

developer.aliyun.com/article/109…

ArgoCD 官方文档

argo-cd.readthedocs.io

ArgoCD Applicationset

argo-cd.readthedocs.io/en/stable/o…

ArgoCD Image Updater

argocd-image-updater.readthedocs.io/

相关链接

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

www.cncf.io/announcemen…

[2]敞开多集群办理

help.aliyun.com/document_de…

[3] 增加相关集群

help.aliyun.com/document_de…

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

help.aliyun.com/document_de…

[5] 装备凭证

help.aliyun.com/document_de…

[6] ArgoCD

github.com/argoproj/ar…

[7] AMC 指令行协助

help.aliyun.com/document_de…