Argo CD
Argo CD
服务
什么是 Argo CD
?
Argo CD
是一个为Kubernetes
而生的,遵循声明式GitOps
理念的持续部署工具。Argo CD
可在Git
存储库更改时自动同步和部署应用程序
如何工作
Argo CD
遵循 GitOps
模式,使用 Git
仓库作为定义所需应用程序状态的真实来源,Argo CD
支持多种 Kubernetes
清单:
kustomize
helm charts
ksonnet applications
jsonnet files
Plain directory of YAML/json manifests
Any custom config management tool configured as a config management plugin
Argo CD
可在指定的目标环境中自动部署所需的应用程序状态,应用程序部署可以在 Git
提交时跟踪对分支、标签的更新,或固定到清单的指定版本。
架构
Argo CD
是通过一个 Kubernetes
控制器来实现的,它持续 watch
正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 OutOfSync
状态,Argo CD
会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git
仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。
Argo CD
中的主要组件
API 服务:API 服务是一个 gRPC/REST 服务,它暴露了 Web UI、CLI 和 CI/CD 系统使用的接口,主要有以下几个功能:
- 应用程序管理和状态报告
- 执行应用程序操作(例如同步、回滚、用户定义的操作)
- 存储仓库和集群凭据管理(存储为 K8S Secrets 对象)
- 认证和授权给外部身份提供者
- RBAC
- Git webhook 事件的侦听器/转发器
仓库服务:存储仓库服务是一个内部服务,负责维护保存应用程序清单 Git 仓库的本地缓存。当提供以下输入时,它负责生成并返回 Kubernetes 清单:
- 存储 URL
- revision 版本(commit、tag、branch)
- 应用路径
- 模板配置:参数、ksonnet 环境、helm values.yaml 等
应用控制器:应用控制器是一个 Kubernetes 控制器,它持续 watch 正在运行的应用程序并将当前的实时状态与所期望的目标状态( repo 中指定的)进行比较。它检测应用程序的 OutOfSync
状态,并采取一些措施来同步状态,它负责调用任何用户定义的生命周期事件的钩子(PreSync、Sync、PostSync)。
功能
- 自动部署应用程序到指定的目标环境
- 支持多种配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)
- 能够管理和部署到多个集群
- SSO 集成(OIDC、OAuth2、LDAP、SAML 2.0、GitHub、GitLab、Microsoft、LinkedIn)
- 用于授权的多租户和 RBAC 策略
- 回滚/随时回滚到 Git 存储库中提交的任何应用配置
- 应用资源的健康状况分析
- 自动配置检测和可视化
- 自动或手动将应用程序同步到所需状态
- 提供应用程序活动实时视图的 Web UI
- 用于自动化和 CI 集成的 CLI
- Webhook 集成(GitHub、BitBucket、GitLab)
- 用于自动化的 AccessTokens
- PreSync、Sync、PostSync Hooks,以支持复杂的应用程序部署(例如蓝/绿和金丝雀发布)
- 应用程序事件和 API 调用的审计
- Prometheus 监控指标
- 用于覆盖 Git 中的 ksonnet/helm 参数
核心概念
- Application:应用,一组由资源清单定义的 Kubernetes 资源,这是一个 CRD 资源对象
- Application source type:用来构建应用的工具
- Target state:目标状态,指应用程序所需的期望状态,由 Git 存储库中的文件表示
- Live state:实时状态,指应用程序实时的状态,比如部署了哪些 Pods 等真实状态
- Sync status:同步状态表示实时状态是否与目标状态一致,部署的应用是否与 Git 所描述的一样?
- Sync:同步指将应用程序迁移到其目标状态的过程,比如通过对 Kubernetes 集群应用变更
- Sync operation status:同步操作状态指的是同步是否成功
- Refresh:刷新是指将 Git 中的最新代码与实时状态进行比较,弄清楚有什么不同
- Health:应用程序的健康状况,它是否正常运行?能否为请求提供服务?
- Tool:工具指从文件目录创建清单的工具,例如 Kustomize 或 Ksonnet 等
- Configuration management tool:配置管理工具
- Configuration management plugin:配置管理插件
安装 Argo CD
要求
Kubernetes
集群- 一个
kubectl
可访问的Kubernetes
的集群
Argo CD 安装类型
Argo CD
还提供两种类型的安装清单
-
非高可用清单: 用于演示和测试
- install.yaml: 在默认的 ns 中部署,在一个集群部署仅部署一个 argocd 应用
- namespaces-install.yaml: 在不同的 ns 中部署,在一个集群中部署多个 argocd 应用
-
高可用清单: 建议在生产环境中使用高可用性安装
- ha/install.yaml - 与 install.yaml 相同,但具有受支持组件的多个副本。
- ha/namespace-install.yaml - 与 namespace-install.yaml 相同,但具有受支持组件的多个副本。
安装服务
使用版本 v2.7.10
[root@node argocd]# kubectl create namespace argocd
[root@node argocd]# kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/v2.7.10/manifests/install.yaml
安装创建的资源信息
# CRD
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
# ServiceAccount
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
# RBAC: Role ClusterRole RoleBinding ClusterRoleBinding
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
# ConfigMap
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
# Secret
secret/argocd-notifications-secret created
secret/argocd-secret created
# Service
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
# Deployment
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
# StatefulSet
statefulset.apps/argocd-application-controller created
# NetworkPolicy
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
查看 Argo CD
服务
[root@node argocd]# kubectl -n argocd get pods
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 2m42s
argocd-applicationset-controller-57bbb6bcdf-kgzmk 1/1 Running 0 2m43s
argocd-dex-server-7fd667d566-m94wr 1/1 Running 0 2m43s
argocd-notifications-controller-ccd6b9d56-dlsmx 1/1 Running 0 2m43s
argocd-redis-74f98b85f-j5fp2 1/1 Running 0 2m43s
argocd-repo-server-b55c54f9b-vj6t8 1/1 Running 0 2m43s
argocd-server-7b5cb98999-cw4b7 1/1 Running 0 2m42s
创建 ingress
访问 web
界面
此处依赖
traefik
,或者也可以安装nginx ingress
,argocd ingress
配置官网文档:https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#ingressroute-crd
[root@node argocd]# cat traefik.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: argocd-server
namespace: argocd
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`argocd.evescn.com`)
priority: 10
services:
- name: argocd-server
port: 80
- kind: Rule
match: Host(`argocd.evescn.com`) && Headers(`Content-Type`, `application/grpc`)
priority: 11
services:
- name: argocd-server
port: 80
scheme: h2c
tls:
certResolver: default
访问服务出现
url 307
问题,详细的查看这个文章:https://devpress.csdn.net/k8s/62fff4557e6682346619531a.html
307
问题解决方法
[root@node argocd]# wget https://ghproxy.com/https://raw.githubusercontent.com/argoproj/argo-cd/v2.7.10/manifests/install.yaml
# 这个文中找到 ConfigMapargocd-cmd-params-cm 更改的配置
# 官方文档也有说明(如果没有提供 ssl 证书):https://devpress.csdn.net/k8s/62fff4557e6682346619531a.html
# The API server should be run with TLS disabled. Edit the argocd-server deployment to add the --insecure flag to the argocd-server command, or simply set server.insecure: "true" in the argocd-cmd-params-cm ConfigMap as described here.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cmd-params-cm
data:
server.insecure: "true"
[root@node argocd]# kubeclt -n argocd delete -f install.yaml
[root@node argocd]# kubeclt -n argocd apply -f install.yaml
访问 web
默认情况下 admin 帐号的初始密码是自动生成的,会以明文的形式存储在 Argo CD
安装的命名空间中名为 argocd-initial-admin-secret
的 Secret 对象下的 password
字段下,我们可以用下面的命令来获取:
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
使用用户名 admin 和上面输出的密码即可登录 Dashboard。
安装 cli 命令行工具
下载连接:
- 从 web 界面获取地址
- 从文档中获取的地址
安装 cli
[root@node argocd]# wget https://argocd.evescn.com/download/argocd-linux-amd64 --no-check-certificate
[root@node argocd]# chmod a+x argocd-linux-amd64 && mv argocd-linux-amd64 /usr/local/bin/argocd
[root@node argocd]# argocd version
argocd: v2.7.10+469f257.dirty
BuildDate: 2023-07-31T22:05:17Z
GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
GitTreeState: dirty
GoVersion: go1.19.10
Compiler: gc
Platform: linux/amd64
FATA[0000] Argo CD server address unspecified
通过 ArgoCD CLI 命令行工具进行登录:
[root@node argocd]# argocd login argocd.evescn.com:20080 --insecure
Username: admin
Password:
'admin:login' logged in successfully
Context 'argocd.evescn.com' updated
需要注意的是这里登录的地址为 gRPC 暴露的服务地址。
CLI 登录成功后,可以使用如下所示命令更改密码:
[root@node ~]# 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 'argocd.evescn.com' updated
[root@node ~]# argocd version
argocd: v2.7.10+469f257.dirty
BuildDate: 2023-07-31T22:05:17Z
GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
GitTreeState: dirty
GoVersion: go1.19.10
Compiler: gc
Platform: linux/amd64
argocd-server: v2.7.10+469f257.dirty
BuildDate: 2023-07-31T22:05:17Z
GitCommit: 469f25753b2be7ef0905a11632a6382060bcae99
GitTreeState: dirty
GoVersion: go1.19.10
Compiler: gc
Platform: linux/amd64
Kustomize Version: v5.0.1 2023-03-14T01:32:48Z
Helm Version: v3.11.2+g912ebc1
Kubectl Version: v0.24.2
Jsonnet Version: v0.19.1
配置集群
由于 Argo CD 支持部署应用到多集群,所以如果你要将应用部署到外部集群的时候,需要先将外部集群的认证信息注册到 Argo CD 中,如果是在内部部署(运行 Argo CD 的同一个集群,默认不需要配置),直接使用 https://kubernetes.default.svc 作为应用的 K8S APIServer 地址即可。
首先列出外部集群 kubeconfig 中的所有集群上下文:
[root@node ~]# kubectl config get-contexts -o name --kubeconfig /root/.kube/test-config
context-dev
从列表中选择一个上下文名称并将其提供给 argocd cluster add CONTEXTNAME --kubeconfig config
,比如对于 context-cluster1
上下文,还可以指定 --name test
环境名称,运行:
[root@node ~]# argocd cluster add context-dev --name test --kubeconfig /root/.kube/test-config
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `context-dev` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" updated
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://10.0.0.100:6443' added
[root@node ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://kubernetes.default.svc in-cluster 1.23 Successful
https://192.168.0.101:6443 test Unknown Cluster has no applications and is not being monitored.
首次查看,会显示不成功,但是不影响界面部署,成功在外部集群部署 APP
后,集群状态变更为 Successful
。