乐趣区

关于阿里云:ACK-One-GitOps-最佳实践

作者:庄宇、流生

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 <clusterid> --ArgoCDEnabled true

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

ArgoCD Server 域名格局:

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

[
](https://argocd.%3Cackone)

您能够运行一下命令查看 GitOps 开启后果:

[
](https://argocd.%3Cackone)


#查看 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"

[
](https://argocd.%3Cackone)

步骤二:登录 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          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”。

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.<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 个集群实现利用部署。

  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,部署到不同指标集群。

点击“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 解决了利用部署的问题,但开发团队须要的 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/appl…

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

退出移动版