什么是 argo CD
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
Argo CD是一个基于Kubernetes的声明式的GitOps工具。
这里我们引入了一个新的概念,
什么是GitOps
GitOps是以Git为基础,使用CI/CD来更新运行在云原生环境的应用,它秉承了DevOps的核心理念–“构建它并交付它(you built it you ship it)”。
- 当开发人员将开发完成的代码推送到git仓库会触发CI制作镜像并推送到镜像仓库
- CI 处理完成后,可以手动或者自动修改原因配置,再将其推送到git仓库
- GitOps 会同时对比目标状态和当前状态,如果两者不一致会触发CD将新的配置部署到集群中
其中,目标状态是git中的状态,现有状态是集群中的应用状态。
不用GitOps呢?
这样当然也是可以的,我们可以使用kubectl、helm等工具直接发布配置,但这会存在一个很严重的安全问题,那就是密钥共享。
为了让CI系统能够自动的部署应用,我们需要将集群的访问密钥共享给它,这会带来潜在的安全问题。
Argo CD
Argo CD 遵循GitOps模式,使用Git存储库存储所需应用程序的配置。
Kubernetes 清单可以通过如下几种方式指定:
- kustomize应用程序
- helm图表
- ksonnet应用程序
- jsonnet文件
- 基于YAML/json配置
- 配置管理插件配置的任何自定义配置管理工具
Argo CD 实现为kubernetes 控制器,它持续监视运行中的运用程序,并将当前的活动状态与期望的目标状态进行比较(如Git repo中指定的那样)。如果已部署的应用程序的活动
Argo CD 处在如下位置
优势 如下:
- 应用定义、配置和环境信息是声明式的,并可以进行版本控制
- 引用部署和生命周期管理是全自动化的,是可审计的,清晰移动。
- Argo CD是一个独立的部署工具,支持对多个环境、多个Kubernetes集群上的应用进行统一部署和管理
实践
前提:一个可用的kubernetes集群
实验环境:
- kubernetes:1.24.6
- argo cd:latest
安装Argo CD
安装很简单,不过在实际使用中需要对数据进行持久化。
我这里直接使用官方文档的安装命令:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
执行成功后会在argocd的namespace 下创建如下资源。
kubectl get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 0/1 Pending 0 49s
pod/argocd-dex-server-5b6f56bb96-tgmv7 0/1 Pending 0 49s
pod/argocd-redis-74d8c6db65-q6zqw 0/1 ContainerCreating 0 49s
pod/argocd-repo-server-6bc9b54dc5-f7jqn 0/1 Pending 0 49s
pod/argocd-server-748b45859b-5xs7r 0/1 Pending 0 49s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-dex-server ClusterIP 10.96.135.0 <none> 5556/TCP,5557/TCP,5558/TCP 2m8s
service/argocd-metrics ClusterIP 10.96.22.47 <none> 8082/TCP 2m1s
service/argocd-redis ClusterIP 10.96.58.160 <none> 6379/TCP 2m1s
service/argocd-repo-server ClusterIP 10.96.122.24 <none> 8081/TCP,8084/TCP 2m
service/argocd-server ClusterIP 10.96.5.234 <none> 80/TCP,443/TCP 118s
service/argocd-server-metrics ClusterIP 10.96.162.214 <none> 8083/TCP 117s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-dex-server 0/1 1 0 107s
deployment.apps/argocd-redis 0/1 1 0 96s
deployment.apps/argocd-repo-server 0/1 1 0 95s
deployment.apps/argocd-server 0/1 0 0 94s
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-dex-server-5b6f56bb96 1 1 0 57s
replicaset.apps/argocd-redis-74d8c6db65 1 1 0 57s
replicaset.apps/argocd-repo-server-6bc9b54dc5 1 1 0 57s
replicaset.apps/argocd-server-748b45859b 1 1 0 57s
NAME READY AGE
statefulset.apps/argocd-application-controller 0/1 100s
访问Argo server的方式有两种:
- 通过web ui
- 使用argocd 客户端工具
我这里直接使用web ui进行管理。
通过kubectl edit -n argocd svc argocd-server将service的type类型改为NodePort。改完后通过以下命令查看端口:
[root@master01 ~]# kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.96.135.0 <none> 5556/TCP,5557/TCP,5558/TCP 3h42m
argocd-metrics ClusterIP 10.96.22.47 <none> 8082/TCP 3h42m
argocd-redis ClusterIP 10.96.58.160 <none> 6379/TCP 3h42m
argocd-repo-server ClusterIP 10.96.122.24 <none> 8081/TCP,8084/TCP 3h42m
argocd-server NodePort 10.96.5.234 <none> 80:31127/TCP,443:31896/TCP 3h42m
argocd-server-metrics ClusterIP 10.96.162.214 <none> 8083/TCP 3h42m
然后通过https://192.168.146.171:31896 访问页面 如下
登录账号为admin,密码通过如下方式获得
输入账号admin密码是初始化产生的
初始命令如下:
kubectl get secret -n argocd argocd-initial-admin-secret -o yaml
转换解析密码 base64 ,为解析后的密码(标红为登录密码)
echo U2l3NFcwRVhZNHA3UzBGbw== | base64 -d
现在我们在Argo里创建应用,步骤如下:
(1)添加仓库地址,Settings → Repositories,点击 Connect Repo using HTTPS
按钮:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1QWLyRb-1676431475234)(https://linusoss.oss-cn-shanghai.aliyuncs.com/img/企业微信截图_16424877195564.png)]
填写信息:
添加成功
(2)创建应用
创建完成
这里我设置了手动SYNC,所以需要点一下下面的sync进行同步。
可以看到状态都变正常了。
下面我们在集群里边查看一下我们创建的应用
[root@master01 ~]# kubectl get pod | grep devops-argocd-test
devops-argocd-test-658944bd6b-bpfzz 1/1 Running 0 2m5s
[root@master01 ~]# kubectl get svc | grep devops-argocd-test
devops-argocd-test NodePort 10.96.234.12 <none> 8080:30797/TCP 28m
下面我们访问应用,如下:
配置变更
下面我们手动修改配置将deploymeny.yaml文件中的镜像为v2版本。如下:
提交到仓库。
下面我们回到ArgoCD中可以看到状态变成了OutOfSync
这个时候,我们再手动sync一下,等待状态变正常。
访问应用
可以看到应用部署更新成功了
那下面我们看看整个应用的关系状态:
还可以看到部署历史
也可以基于这个页面进行回滚操作
验证是否回滚成功
官方文档:https://argoproj.github.io/argo-cd/#features
测试结果:
推荐特点:1、回滚方便
2、支持多集群
3、图形化,方便操作
4、自带回滚机制
推荐指数4星