6

ArgoCD一:基本介绍和使用

 3 years ago
source link: https://www.bladewan.com/2020/12/27/argo_1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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进行对比发现变化,进行更新。

单节点部署
使用官网快速部署

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

高可用部署参考

https://github.com/argoproj/argo-cd/tree/master/manifests

部署完后产生以下服务

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方式为对外暴露

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'

访问Dashboard

默认帐号为admin,密码为POD-NAME

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

ArgoCD使用方式有两种,方式一:通过UI-dashboard使用,方式二:通过CLI工具使用

使用CLI工具,需要提前下载

https://github.com/argoproj/argo-cd/releases/download/v1.8.1/argocd-linux-amd64
mv argocd-linux-amd64 /usr/local/bin/argocd
chmod a+x /usr/local/bin/argocd
argocd login <ARGOCD_SERVER>


argocd account update-password

以一个简单的例子讲解ArgoCD的基本使用

在git上创建个argo-example项目用于存放我们的部署文件,存放以下yaml文件

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集群中查看部署后的应用

kubectl get pod
NAME READY STATUS RESTARTS AGE
bootcampt-544d66b664-ddhgd 1/1 Running 0 2m18s
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中
再次访问

curl 172.16.1.6:30062
Hello Kubernetes bootcamp! | Running on: bootcampt-7687b6c957-42vjw | v=2

通过CLI方式就是直接使用下面yaml文件部署或直接使用argocd cli create

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文件

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

kubectl get Application -n argocd
NAME SYNC STATUS HEALTH STATUS
bootcamp Synced Healthy

选中对应的app可以进行历史发布查看和回滚

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

可以选择任意一个历史版本进行回滚

常用CLI命令

列出部署的应用

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

查看指定部署的应用详细情况

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

同步部署的应用

argocd app sync appname

设置为自动同步

argocd app set appname --sync-policy automated

多集群应用部署

添加集群
首先需要将你需要添加的集群的config文件追加放到~/.kube/config

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

argocd cluster add cluster-2

argocd命令会自动读取你config文件内的context信息包含证书和token
执行成功后查看集群

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环境只能

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK