运维中经常会存在多套的环境,开发、测试、stagging、prod等,这么多的环境,对于开发同学,如何通过一次部署多环境上线,打通开发与测试间的gap,而对于运维同学来说,则关心如何保障环境之间应用版本一致,而argoCD就是这样一个工具,配合GitOps思路,可以实现对多集群的应用版本管理.
argoCD
Declarative GitOps CD for Kubernetes
官方的说明很简单,为k8s提供GitOps能力
原理
上面是官方的提供的架构图, 可以很清晰的看到argocd的工作机制.
argoCD通过发布到k8s的crd控制器连续监视正在运行的应用程序,并将当前的活动状态与所需的目标状态(在Git存储库中指定)进行比较
下面就从一个demo来体验一下,先从安装开始
安装
在线安装
1 | kubectl create namespace argocd |
helm安装
1 | helm repo add argo https://argoproj.github.io/argo-helm |
所有pod起来之后即可访问web页面
默认的用户名为 admin,密码为 server Pod 的名称,可以通过如下所示的命令来获取:
1 | $ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2 |
ingress
添加ingress用于暴露argo cd UI
1 | apiVersion: extensions/v1beta1 |
多集群支持
目前无法直接在UI上添加其它集群,可使用以下命令添加外部集群,这样就可使用一套argoCD来同步到多个集群环境
1 | # 先进行argocd的登录 |
那么对于多集群发同步来说,最终实现的效果为:
当然,每个集群的下的应用的触发逻辑可以在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
问题
- 执行login 登录命令时提示:
1 | argocd login argocd.local:4433 |
出现以下错误
原因:
参考: https://github.com/argoproj/argo-cd/issues/1415
解决:
1 | argocd login argocd.local:4433 --grpc-web |
如果添加集群的时候提示以下错误,则需要先使用上面的命令进行登录,登录成功后再进行集群的添加操作.
- 创建token时提示以下错误:
1 | Unable to generate new token: account 'admin' does not have apiKey capability |
原因: argocd的用户也是通过角色来进行划分的,创建token的用户需要具有 apiKey的权限,这个可以从argocd部署的configmap中查看使用的用户是否具有什么权限.
- 回滚时提示以下错误:
1 | Unable to load data: revision HEAD must be resolved |
原因: 如果使用argocd命令行的方式同步应用,会导致revision没有commit值,如上图,而回滚时需要revision,因此造成上面的报错.
CLI常用命令
argoCD也提供了CLI工具,可以直接使用该工具来对argoCD进行操作,常用的命令如下:
1 | # 修改账号密码,然后根据提示完成 |
这里只是体验了一下argoCD的使用过程,很多有趣的功能还没有介绍,下次再更.
参考文章:
- https://argoproj.github.io/argo-cd/
- https://www.gitops.tech/#:~:text=GitOps%20is%20a%20way%20of,Git%20and%20Continuous%20Deployment%20tools
- https://www.jianshu.com/p/eec8e201b7e9
- https://www.qikqiak.com/post/gitlab-ci-argo-cd-gitops/
- https://argoproj.github.io/argo-cd/user-guide/private-repositories/
- https://github.com/argoproj/argo-cd/issues/1673