ArgoCD一:基本介绍和使用

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 sync appname

设置为自动同步

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