Z.S.K.'s Records

argoCD学习(使用argoCD实现多集群应用同步)

运维中经常会存在多套的环境,开发、测试、stagging、prod等,这么多的环境,对于开发同学,如何通过一次部署多环境上线,打通开发与测试间的gap,而对于运维同学来说,则关心如何保障环境之间应用版本一致,而argoCD就是这样一个工具,配合GitOps思路,可以实现对多集群的应用版本管理.

argoCD

Declarative GitOps CD for Kubernetes

官方的说明很简单,为k8s提供GitOps能力

原理

架构图

上面是官方的提供的架构图, 可以很清晰的看到argocd的工作机制.

argoCD通过发布到k8s的crd控制器连续监视正在运行的应用程序,并将当前的活动状态与所需的目标状态(在Git存储库中指定)进行比较

下面就从一个demo来体验一下,先从安装开始

安装

在线安装

1
2
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

helm安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd -n argocd argo/argo-cd --values values.yaml

# cat values.yaml,可以在安装的时候就指定使用ingress
server:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
hosts:
- argocd.local

所有pod起来之后即可访问web页面

默认的用户名为 admin,密码为 server Pod 的名称,可以通过如下所示的命令来获取:

1
2
3
4
$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

# 可以使用以下命令暴露argocd ui, (不建议)
kubectl port-forward service/argocd-server -n argocd 38888:443

ingress

添加ingress用于暴露argo cd UI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
# If you encounter a redirect loop or are getting a 307 response code
# then you need to force the nginx ingress to connect to the backend using HTTPS.
#
# nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
rules:
- host: argocd.local
http:
paths:
- backend:
serviceName: argocd-server
servicePort: https
path: /
tls:
- hosts:
- argocd.example.com
secretName: argocd-secret # do not change, this is provided by Argo CD

多集群支持

目前无法直接在UI上添加其它集群,可使用以下命令添加外部集群,这样就可使用一套argoCD来同步到多个集群环境

1
2
3
4
5
6
7
8
9
# 先进行argocd的登录
argocd login argocd.example.com:4433 --grpc-web
# 输入用户名密码即可,出现successfully
argocd cluster add mysql-cluster --server 'argocd.example.com:4433'
# 出现以下提示则说明添加成功
INFO[0000] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0000] ClusterRole "argocd-manager-role" updated
INFO[0000] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://xxx.xxx.xxx.xxx:6443' added

那么对于多集群发同步来说,最终实现的效果为:

当然,每个集群的下的应用的触发逻辑可以在CI阶段定义, 这样可以跟测试stag更好地集成,从而实现真正的一次Push,多次发布.

使用

通过上面的方式安装完成之后,即可访问argoCD的web页,可以按照不同的环境将app进行分类,同时argocd提供了project的概念, 可以将你认为可以属于同一个project的所有应用划为一类,这样可以避免同一个应用要在多个环境下发布需要多次添加的问题.

添加Project

主要的就是sources跟destinations

sources指定的是git repo的地址,可以添加多个

destinations指定集群,也可以指定多个

这样添加之后在新增app时即可从project中选择了

添加Repository

repository指的是git repo的地址,在发布时argocd会连接到该git上拉取资源, 这里需要提供git的认证方式,常用的为用户名、密码.

要注意的是: repository URL需要以.gti结尾, 要不然连接的时候会提示301

参考 : https://argoproj.github.io/argo-cd/user-guide/private-repositories/

添加APP

app做为GitOps的最小发布单元, 一个app中包含了所有的跟发布相关的资源文件,比如策略,代码,配置,甚至监控事件和版本控制等

上面要指定git地址及要发布的kubernetes集群及git上的目录,这个目录用于argoCD检测是否具有更新.

argoCD支持了目前常用的资源管理工具,比如helm, kustomize, directory, Ksonnet, Jsonnet等工具,我这里使用的是Kustomize,k8s原生就支持,没有任何依赖,非常方便.

最重要的是指定是自动同步还是手动同步, 不同的同步策略使用场景不同

添加成功后如下图所示:

应用发布成功后,效果如下:

从上面可以看到应用的发布历史,出于数据存储限制,默认情况下只会保留最新的10条,如果觉得不合理可以通过修改app进行调整,同时也能看到同步的状态及发布是否成功

这里要注意的是Sync OK只是代表从git上同步资源成功了,但能不能发布成功是通过Healthy来看的

同步策略及发布状态

同步策略

argoCD应用可以选择是自动同步还是手工同步来触发发布上线,这个就要看具体的场合了

自动同步: 指的是git如果发生变化则直接触发发布,不需要人介入, 这个比较适合用于持续发布的测试环境

手工同步: 指的则是人为地去页面上点击同步的方式进行,比较适合生产类稳定环境

同时,还有一些同步策略,比如是否强制对线上资源进行强制删除后再更新、指定需要同步的文件、同步时间窗口等等比较人性化的策略

详情可参考这里

发布状态

在同步完成之后便会触发发布上线,状态分为Processing、unHealty、Healty

Processing表示正在更新资源

unHealty表示发布失败, 发布失败可以通过点击详情进行查看原因

Healty则表示发布成功, 所有的资源都以git上的版本运行.

不足

相信大家都有这样的需求: 同一个应用需要在多个集群中做发布,目前对于单应用多集群的部署官方支持得还不是很好,因为应用名必须唯一,官方有个issue讨论了为何不支持这种场景,主要担心多个集群的查询性能,感兴趣的可以参考support multiple clusters (destinations) for an Application

问题

  1. 执行login 登录命令时提示:
1
argocd login argocd.local:4433

出现以下错误

原因:

参考: https://github.com/argoproj/argo-cd/issues/1415

解决:

1
argocd login argocd.local:4433 --grpc-web

如果添加集群的时候提示以下错误,则需要先使用上面的命令进行登录,登录成功后再进行集群的添加操作.

  1. 创建token时提示以下错误:
1
Unable to generate new token: account 'admin' does not have apiKey capability

原因: argocd的用户也是通过角色来进行划分的,创建token的用户需要具有 apiKey的权限,这个可以从argocd部署的configmap中查看使用的用户是否具有什么权限.

  1. 回滚时提示以下错误:
1
Unable to load data: revision HEAD must be resolved

原因: 如果使用argocd命令行的方式同步应用,会导致revision没有commit值,如上图,而回滚时需要revision,因此造成上面的报错.

CLI常用命令

argoCD也提供了CLI工具,可以直接使用该工具来对argoCD进行操作,常用的命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 修改账号密码,然后根据提示完成
argocd account update-password

# 登录
argocd login argocd.local:4433 --grpc-web --username admin --password xxx --insecure

# 查看应用状态
argocd app get guestbook

#
argocd app set argocd-kustomize-frontend --kustomize-image xxx/argocd-kustomize-frontend:testwithtag

# 同步应用
argocd app sync guestbook

这里只是体验了一下argoCD的使用过程,很多有趣的功能还没有介绍,下次再更.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?