ArgoCD是什么? ArgoCD是一个专为Kubernetes而生,遵循GitOps理念的持续部署工具。这里指的Gitops简单来说就是1、以Git为核心。2、声明式定义各类对象。3、配置一致性管理。具体参考(https://www.hwchiu.com/gitops-book-ch2.html )
软件版本
软件
版本
ArgoCD
1.8.1
Kubernetes
1.18
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,密码通过secret获取
1 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
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 34 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 19 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 19 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