ArgoCD是什么?
ArgoCD是一个专为Kubernetes而生,遵循GitOps理念的持续部署工具。这里指的Gitops简单来说就是1、以Git为核心。2、声明式定义各类对象。3、配置一致性管理。具体参考(https://www.hwchiu.com/gitops-book-ch2.html)
ArgoCD是是Intuit公司开源出来的属于整个Argo项目中的其中一个子项目,整个Argo项目中还包括Argo-event、argo-workflow、Argo-Rollout
https://github.com/argoproj
2020年Argo正式加入CNCF孵化项目中。
ArgoCD功能有哪些?
- 将应用程序自动部署到指定环境中
- 可通过CRD方式定义执行对象
- 多租户管理和RBAC权限集成管控
- 多集应用管理和部署
- 可视化UI
- 支持多种Kubernetes配置对象(Kustomize,Helm,Ksonnet,Jsonnet,plain-YAML)
- 支持SSO集成(OIDC,OAuth2,LDAP,SAML 2.0,GitHub,GitLab,Microsoft,LinkedIn)
- Webhook集成可实现通知
- 自带metric指标暴露
为什么需要ArgoCD
现有的CICD工具对在CD到Kubernetes中时通过提供kubeconfig文件方式对接到Kubernetes集群,这样非常容易造成kubeconfig文件泄漏,并且造成安全引患。
通过ArgoCD可以实现应用快速发布到Kubernetes中,并且能够根据版本标识快速跟踪和多集群部署功能,实现多个集群之间同一应用部署问题。
多种方式实现持续部署配置,如通过UI方式,同时也可以通过CRD方式使用Kubernetes自定义对象实现持续部署。
ArgoCD部署安装和基本使用
软件架构

Argo API Server
提供介面給外界操控 ArgoCD 服務,本身提供了 CLI, GUI 以及 gRPC/REST 等介面,最簡單的 Demo 可以使用 GUI 來操作。
Repository Service.
与远端Git Repo进行同步,缓存在本地
ArgoCD-redis
用作本地缓存
ArgoCd-dex-server
实现token认证服务和SSO
Application Controller
与Kubernetes进行通信对部署的workload进行状态检测与Git Repository进行对比发现变化,进行更新。
部署
单节点部署
使用官网快速部署
1 2
| kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
|
高可用部署参考
1
| https://github.com/argoproj/argo-cd/tree/master/manifests
|
部署完后产生以下服务
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 28 29 30 31
| NAME READY STATUS RESTARTS AGE pod/argocd-application-controller-0 1/1 Running 0 5d6h pod/argocd-dex-server-74588646d-sz9g8 1/1 Running 0 2d2h pod/argocd-redis-5ccdd9d4fd-csthm 1/1 Running 1 5d6h pod/argocd-repo-server-5bbb8bdf78-mxkv7 1/1 Running 0 18h pod/argocd-server-789fb45964-82mzx 1/1 Running 0 18h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/argocd-dex-server ClusterIP 10.43.180.172 <none> 5556/TCP,5557/TCP,5558/TCP 5d6h service/argocd-metrics ClusterIP 10.43.184.97 <none> 8082/TCP 5d6h service/argocd-redis ClusterIP 10.43.4.233 <none> 6379/TCP 5d6h service/argocd-repo-server ClusterIP 10.43.9.45 <none> 8081/TCP,8084/TCP 5d6h service/argocd-server NodePort 10.43.48.239 <none> 80:31320/TCP,443:31203/TCP 5d6h service/argocd-server-metrics ClusterIP 10.43.149.186 <none> 8083/TCP 5d6h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/argocd-dex-server 1/1 1 1 5d6h deployment.apps/argocd-redis 1/1 1 1 5d6h deployment.apps/argocd-repo-server 1/1 1 1 5d6h deployment.apps/argocd-server 1/1 1 1 5d6h NAME DESIRED CURRENT READY AGE replicaset.apps/argocd-dex-server-74588646d 1 1 1 5d6h replicaset.apps/argocd-redis-5ccdd9d4fd 1 1 1 5d6h replicaset.apps/argocd-repo-server-5bbb8bdf78 1 1 1 5d6h replicaset.apps/argocd-server-789fb45964 1 1 1 5d6h NAME READY AGE statefulset.apps/argocd-application-controller 1/1 5d6h
|
使用NodePort方式为对外暴露
1
| kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
|
访问Dashboard

默认帐号为admin,密码为POD-NAME
1
| kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
|
ArgoCD使用方式有两种,方式一:通过UI-dashboard使用,方式二:通过CLI工具使用
使用CLI工具,需要提前下载
1
| https://github.com/argoproj/argo-cd/releases/download/v1.8.1/argocd-linux-amd64
|
1 2 3
| mv argocd-linux-amd64 /usr/local/bin/argocd chmod a+x /usr/local/bin/argocd
|
登录环境
1
| argocd login <ARGOCD_SERVER>
|
更新密码
1
| argocd account update-password
|
以一个简单的例子讲解ArgoCD的基本使用
在git上创建个argo-example项目用于存放我们的部署文件,存放以下yaml文件
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 28 29 30 31 32 33
| apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: bootcampt spec: selector: matchLabels: app: bootcampt replicas: 1 # tells deployment to run 2 pods matching the template template: metadata: labels: app: bootcampt spec: containers: - name: bootcampt image: docker.io/jocatalin/kubernetes-bootcamp:v1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: bootcampt spec: selector: app: bootcampt ports: - protocol: TCP port: 8080 targetPort: 8080 nodePort: 30062 type: NodePort
|



点击创建

同步部署

如果对应的git是私有库,pull需要帐号密码则需要在argo设置中配置repo connect

填写对应的帐号密码,如果是自签名证书需要将CA附上

查看部署后的应用

在Kubernetes集群中查看部署后的应用
1 2 3
| kubectl get pod NAME READY STATUS RESTARTS AGE bootcampt-544d66b664-ddhgd 1/1 Running 0 2m18s
|
访问
1 2
| curl 172.16.1.6:30062 Hello Kubernetes bootcamp! | Running on: bootcampt-544d66b664-ddhgd | v=1
|
更新yaml文件将docker.io/jocatalin/kubernetes-bootcamp:v1
改成docker.io/jocatalin/kubernetes-bootcamp:v2
然后git push到git中
等待2分钟左右,ArgoCD会自动将新的yaml文件部署到Kubernetes中
再次访问
1 2
| curl 172.16.1.6:30062 Hello Kubernetes bootcamp! | Running on: bootcampt-7687b6c957-42vjw | v=2
|
通过CLI方式就是直接使用下面yaml文件部署或直接使用argocd cli create
1
| argocd app create --project default --name bootcamp --repo http://172.16.1.184/root/argo-example.git --path . --dest-server https://kubernetes.default.svc --dest-namespace default --revision master --sync-policy automated
|
yaml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: bootcamp spec: destination: name: '' namespace: default server: 'https://kubernetes.default.svc' source: path: . repoURL: 'http://172.16.1.184/root/argo-example.git' targetRevision: HEAD project: default syncPolicy: automated: prune: false selfHeal: false
|
因为ArgoCD有在部署集群中创建CRD对象所以我们同时也可以使用kubectl查看到创建好的Application
1 2 3
| kubectl get Application -n argocd NAME SYNC STATUS HEALTH STATUS bootcamp Synced Healthy
|
选中对应的app可以进行历史发布查看和回滚

对应的ID与实际git库里面提交的commit是匹配的


可以选择任意一个历史版本进行回滚
常用CLI命令
列出部署的应用
1 2 3
| argocd app list NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET bootcamp https://kubernetes.default.svc default default Synced Healthy Auto <none> http://172.16.1.184/root/argo-example.git . HEAD
|
查看指定部署的应用详细情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Name: bootcamp Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://172.16.1.7:31203/applications/bootcamp Repo: http://172.16.1.184/root/argo-example.git Target: HEAD Path: . SyncWindow: Sync Allowed Sync Policy: Automated Sync Status: Synced to HEAD (b1696a3) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default bootcampt Synced Healthy service/bootcampt unchanged apps Deployment default bootcampt Synced Healthy deployment.apps/bootcampt configured
|
同步部署的应用
设置为自动同步
1
| argocd app set appname --sync-policy automated
|
多集群应用部署
添加集群
首先需要将你需要添加的集群的config文件追加放到~/.kube/config
然后执行
1 2 3 4 5
| kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * cluster-1 cluster-1 cluster-1 cluster-1-rke-node2 cluster-1-rke-node2 cluster-1 cluster-2 cluster-2 cluster-2
|
看当前在哪个context,如我要添加cluster-2
则执行
1
| argocd cluster add cluster-2
|
argocd命令会自动读取你config文件内的context信息包含证书和token
执行成功后查看集群
1 2 3 4
| argocd cluster list SERVER NAME VERSION STATUS MESSAGE https://192.168.0.29:6443 cluster-2 1.17 Successful https://kubernetes.default.svc in-cluster 1.17 Successful
|
如果是Rancher建的集群,你希望通过连接rancher在转发到api-server需要通过另外方式
参考:https://gist.github.com/janeczku/b16154194f7f03f772645303af8e9f80
遗憾的是目前argocd多集群部署不能在一个Application内选择多个部署集群,只能通过建立多个相同Application对应不同部署目的集群方式
如上Application要部署到uat和sit环境只能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: sit-bootcamp spec: destination: name: '' namespace: default server: 'https://kubernetes.default.svc' source: path: . repoURL: 'http://172.16.1.184/root/argo-example.git' targetRevision: HEAD project: default syncPolicy: automated: prune: false selfHeal: false
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: uat-bootcamp spec: destination: name: '' namespace: default server: 'https://192.168.0.29:6443' source: path: . repoURL: 'http://172.16.1.184/root/argo-example.git' targetRevision: HEAD project: default syncPolicy: automated: prune: false selfHeal: false
|
社区内也进行了相关讨论,ISSUE如下
https://github.com/argoproj/argo-cd/issues/1673
参考链接:
https://www.jianshu.com/p/eec8e201b7e9