1 ArgoCD 部署与使用
1.1 ArgoCD的部署要点
ArgoCD 有两种部署方式:多租户部署和核心化部署
多租户
- 常用于为多个应用程序开发团队提供服务,并由平台团队维护的场景
-
有两类可选择的部署方式
- 非高可用性部署:适用于演示和测试的目的
- 高可用部署:适用于生产用途
- 支持用户通过Web UI或CLI进行访问
-
支持集群级部署和名称空间级两种安装机制
- 配置文件install.yaml:具有集群管理员访问权限的集群级安装;对整个集群均有管理权限
- 配置文件namespace-install.yaml:仅需要名称空间级别权限的安装;也就是说部署在对应的 NS 下只能对该 NS 有操作
核心化部署
- 安装的组件较小且更易于维护,它不包含 API Server 和 UI ,且不提供高可用机制
-
仅适用于独立使用 ArgoCD 且不需要多租户特性的集群管理员
-
用户要通过 Kubernetes 的访问权限来管理 ArgoCD
在生产中使用很显然不会使用核心化部署
2 argocd 的部署步骤
argocd 官方文档:https://argo-cd.readthedocs.io/en/stable/
在Kubernetes集群上部署ArgoCD
- 采用的示例环境
- 集群级别的部署
- 非高可用模式
- 默认的部署配置使用argocd名称空间,资源引用的路径亦使用该名称空间
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
在管理节点上安装 ArgoCD CLI ,实现通过命令客户端对其进行交互
将 ArgoCD API Server 相关的 Service 暴露到集群外部
- LoadBalancer Service、Ingress或者Port Forwarding
使用 ArgoCD CLI 或 Web UI 完成登录
- 默认密码:kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=”{.data.password}” | base64 -d; echo
-
登录:argocd login
-
修改密码:argocd account update-password
添加一个部署 Application 的目标 Kubernetes Cluster
- Application 部署的目标集群与 ArgoCD 自身在同一集群时,该步骤可选
2.1 非高可用部署流程
2.1.1 部署 argocd
1 创建对应的 NS
root@master:~# kubectl create namespace argocd
2 通过官方进行部署
root@master:~# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
3 查看 argocd NS Pod
root@master:~# kubectl get pod -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 10m
argocd-applicationset-controller-66689cbf4b-hxtxm 1/1 Running 0 10m
argocd-dex-server-64cb85bf46-nvkpt 1/1 Running 0 10m
argocd-notifications-controller-5f8c5d6fc5-pm6x5 1/1 Running 0 10m
argocd-redis-d486999b7-6w8ql 1/1 Running 0 10m
argocd-repo-server-8576d68689-vlzd8 1/1 Running 0 10m
argocd-server-cb57f685d-df6kt 1/1 Running 0 10m
4 查看 SVC
root@master:~# kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.102.211.104 <none> 7000/TCP 57s
argocd-dex-server ClusterIP 10.97.34.90 <none> 5556/TCP,5557/TCP,5558/TCP 57s
argocd-metrics ClusterIP 10.101.176.123 <none> 8082/TCP 57s
argocd-notifications-controller-metrics ClusterIP 10.98.186.196 <none> 9001/TCP 57s
argocd-redis ClusterIP 10.101.185.194 <none> 6379/TCP 57s
argocd-repo-server ClusterIP 10.96.36.10 <none> 8081/TCP,8084/TCP 57s
argocd-server ClusterIP 10.105.92.79 <none> 80/TCP,443/TCP 57s
argocd-server-metrics ClusterIP 10.105.81.33 <none> 8083/TCP 57s
# argocd-server 用来实现对外的 web ui 访问,而这里可以看到是一个 clusterIP,所以我们需要将其改为 LB 或者 nodeport 来实现访问
5 修改 argocd-server 的 svc 改为 externalIP
实现对外暴露
root@master:~# kubectl edit svc -n argocd argocd-server
spec:
......省略......
externalIPs:
- 10.0.0.131
# 查看已经修改
root@master:~# kubectl get svc -n argocd
argocd-server ClusterIP 10.105.92.79 10.0.0.131 80/TCP,443/TCP 7m19s
6 查看对应的 API 群组
root@master:~# kubectl api-resources --api-group=argoproj.io
NAME SHORTNAMES APIVERSION NAMESPACED KIND
applications app,apps argoproj.io/v1alpha1 true Application
applicationsets appset,appsets argoproj.io/v1alpha1 true ApplicationSet
appprojects appproj,appprojs argoproj.io/v1alpha1 true AppProject
# 当我们部署好了 Argocd 对应的 CRD 之后就会创建对应的 api-group 群组
2.1.2 部署 argocd CLI
接下来我们需要部署对应的 CLI 客户端交互工具
这里我安装的是 2.3.3 版本
官方 GitHub 地址:https://github.com/argoproj/argo-cd/releases/tag/v2.3.3
1 下载
root@master:~# wget https://github.com/argoproj/argo-cd/releases/download/v2.3.3/argocd-linux-amd64
2 移动至 /usr/local/bin/
并改名为 argocd
root@master:~# mv argocd-linux-amd64 /usr/local/bin/argocd
3 添加执行权限
root@master:~# chmod +x /usr/local/bin/argocd
4 查看当前版本用于检验客户端是否正常使用
root@master:~# argocd version
argocd: v2.3.3+07ac038
BuildDate: 2022-03-30T01:46:59Z
GitCommit: 07ac038a8f97a93b401e824550f0505400a8c84e
GitTreeState: clean
GoVersion: go1.17.6
Compiler: gc
Platform: linux/amd64
FATA[0000] Argo CD server address unspecified
5 通过上面的命令可以看到我们还需要添加 argo cd server 地址才能够实现对 server 端的控制
# 获取默认密码
root@master:~# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
k3FSo9SnvsQrNe5V
# 所以我们需要通过 argocd 客户端工具登陆至 argocd server 上
root@master:~# argocd login 10.0.0.131
WARNING: server certificate had error: x509: cannot validate certificate for 10.0.0.131 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully # 登录成功
Context '10.0.0.131' updated
# 直接通过 IP 登录
6 再次查看 version 可以看到就没有提示 argo cd server address unspecified
root@master:~# argocd login 10.0.0.131
WARNING: server certificate had error: x509: cannot validate certificate for 10.0.0.131 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.0.0.131' updated
root@master:~# argocd version
argocd: v2.3.3+07ac038
BuildDate: 2022-03-30T01:46:59Z
GitCommit: 07ac038a8f97a93b401e824550f0505400a8c84e
GitTreeState: clean
GoVersion: go1.17.6
Compiler: gc
Platform: linux/amd64
argocd-server: v2.3.3+07ac038
BuildDate: 2022-03-30T00:06:18Z
GitCommit: 07ac038a8f97a93b401e824550f0505400a8c84e
GitTreeState: clean
GoVersion: go1.17.6
Compiler: gc
Platform: linux/amd64
Ksonnet Version: v0.13.1
Kustomize Version: v4.4.1 2021-11-11T23:36:27Z
Helm Version: v3.8.0+gd141386
Kubectl Version: v0.23.1
Jsonnet Version: v0.18.0
2.2 浏览器验证
https://10.0.0.131/
1 查看默认密码
root@master:~# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
k3FSo9SnvsQrNe5V
2 登录
默认用户: admin
登录成功
Refresh app(s):表示远程仓库是否有变更,如果有变更那就 pull 到本地来
2.3 修改 argocd 默认密码
我们通过上面的示例登录会发现提供的密码是特别难记的,所以我们可以通过下面命令修改当前 admin 用户密码
root@master:~# argocd account update-password
*** Enter password of currently logged in user (admin): # 输入旧的默认密码
*** Enter new password for user admin: # 输入新密码
*** Confirm new password for user admin: # 重复输入
Password updated
Context '10.0.0.131' updated
# 更新成功
新密码: zgy123456
以上就是整个 argocd 的部署流程那么接下来我们就可以上手使用 argocd
3 示例演示
3.1 通过 UI 简单示例演示
该实例流程如下:
- gitee 仓库用来提供配置清单
- 将 gitee 上的代码应用部署至当前本地集群
如果我们想通过 argo cd 来部署应用至当前集群的话我们有两部能够实现:
- 添加仓库
- 然后引用该仓库部署为 APP
1 部署,最后点击create
2 点击部署之后可以看到当前状态
3 点击该应用可以看到部署了几个 pod 以及几个资源类型
4 通过 K8S 集群查看刚才创建的 helloworld NS 下的 Pod
root@master:~# kubectl get pod -n helloworld
NAME READY STATUS RESTARTS AGE
spring-boot-helloworld-5c798c6dd7-7cqh5 1/1 Running 0 84s
spring-boot-helloworld-5c798c6dd7-fpz7s 1/1 Running 0 84s
spring-boot-helloworld-5c798c6dd7-w2cdf 1/1 Running 0 84s
所以此时我们就能对该服务发起访问测试
3.1.1 启动客户端访问测试
1 运行客户端访问
# 运行客户端
root@master:~# kubectl run client-$RANDOM --image ikubernetes/admin-box:v1.2 --rm -it --restart=Never --command -- /bin/bash
# 运行该客户端之后进入到该客户端访问成功
root@client-7602 /# curl spring-boot-helloworld.helloworld
Hello Spring Boot 2.0!
这里的部署其实就是由我们的 argocd 自动完成的,如果此时我们修改了配置仓库中的内容定义我们的 argo cd 也会自定同步