ArgoCD 介绍与配置
ArgoCD 是一款为 Kubernetes 设计的声明式 GitOps 持续交付工具 ,由 Intuit 开源并成为 CNCF 毕业项目。它遵循 GitOps 核心理念:以 Git 仓库作为应用配置的唯一可信源,自动同步 Kubernetes 集群中的应用状态与 Git 中的期望状态,实现应用的自动化部署、更新和回滚。
一、ArgoCD 核心特性
-
声明式 GitOps 工作流:基于 Git 仓库的配置定义应用最终状态,无需手动编写部署脚本。
-
多源支持:兼容 Git(GitHub/GitLab/Gitee)、Helm 仓库、Kustomize、Jsonnet 等配置格式。
-
多集群管理:支持将应用部署到多个 Kubernetes 集群(本地/远程)。
-
自动化同步 :支持自动同步(Git 变更触发部署)、手动同步,以及自修复(集群状态与 Git 不一致时自动修正)。
-
可视化 UI:提供直观的 Web 界面,可查看应用状态、同步历史、资源拓扑。
-
完善的工具链:支持 CLI、REST API,便于集成到 CI/CD 流水线。
-
高级特性:应用集(ApplicationSet)批量管理应用、同步钩子(Sync Hooks)、同步波(Sync Waves)、细粒度 RBAC 权限控制等。
二、部署 ArgoCD
前提条件
-
可用的 Kubernetes 集群(推荐 1.21+ 版本)。
-
kubectl已配置并能访问集群。 -
可选:Helm 3(生产环境推荐)。
部署方式一:kubectl 快速部署
这是官方推荐的快速部署方式,直接应用预定义的 YAML 文件。
1. 创建命名空间
cpp
kubectl create namespace argocd
2. 部署 ArgoCD 组件
cpp
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
国内环境注意:若拉取镜像失败,可先下载 YAML 文件并替换镜像源(如阿里云镜像)。
3. 检查组件状态
cpp
kubectl get pods -n argocd
kubectl get svc -n argocd
正常情况下,所有 Pod 应处于 Running 状态。
4. 访问 ArgoCD UI
默认 argocd-server 是 ClusterIP 类型,可通过端口转发临时访问:
cpp
kubectl port-forward svc/argocd-server -n argocd 8080:443
然后访问 https://localhost:8080(注意是 HTTPS,非 HTTP)。
也可修改为 NodePort/LoadBalancer 长期访问:
cpp
# 修改为 NodePort
kubectl patch svc argocd-server -n argocd -p '{"spec":{"type":"NodePort"}}'
# 查看 NodePort 端口
kubectl get svc argocd-server -n argocd
修改为NodePort模式
cpp
# 将 argocd-server 的 Service 类型改为 NodePort
kubectl patch svc argocd-server -n argocd -p '{"spec":{"type":"NodePort"}}'
# 查看分配的 NodePort 端口
kubectl get svc argocd-server -n argocd
5. 获取初始管理员密码
默认用户名是 admin,初始密码存储在 argocd-initial-admin-secret 中:
cpp
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
登录后立即修改密码,避免安全风险。
部署方式二:Helm 部署
Helm 便于管理版本和自定义配置,是生产环境的首选。
1. 添加 ArgoCD Helm 仓库
cpp
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
2. 安装 ArgoCD
cpp
helm install argocd argo/argo-cd -n argocd --create-namespace
3. 自定义配置
通过 --set 参数修改配置(如服务类型、镜像源):
cpp
helm install argocd argo/argo-cd -n argocd --create-namespace \
--set server.service.type=NodePort \
--set image.repository=registry.cn-hangzhou.aliyuncs.com/argoproj/argocd \
--set server.ingress.enabled=true \
--set server.ingress.hosts[0]=argocd.example.com
三、基础配置
1. 登录 ArgoCD
(1)UI 登录
访问 ArgoCD UI,输入用户名 admin 和初始密码即可登录。
(2)CLI 登录
先安装 ArgoCD CLI:
Linux:
cpp
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 sudo install -m 755 argocd-linux-amd64 /usr/local/bin/argocd rm argocd-linux-amd64
登录命令:
cpp
# 端口转发的情况
argocd login localhost:8080 --insecure # --insecure 忽略自签名证书
修改密码:
cpp
argocd account update-password
2. 创建第一个应用
Application 是 ArgoCD 的核心资源,定义了应用的源(Git 仓库) 、目标(K8s 集群) 和同步策略。
方式 1:UI 创建
-
登录 UI 后,点击**+ New App**。
-
填写基本信息:
-
Application Name :
guestbook -
Project :
default -
Sync Policy :可选
Auto Sync(自动同步)。
-
-
填写Source:
-
Repository URL :
https://github.com/argoproj/argocd-example-apps.git(官方示例仓库)。 -
Revision :
HEAD。 -
Path :
guestbook。
-
-
填写Destination:
-
Cluster URL :
https://kubernetes.default.svc(本地集群)。 -
Namespace :
default。
-
-
点击Create ,然后点击Sync同步应用。
方式 2:YAML 文件创建
将 Application 配置纳入 Git 版本控制,是 GitOps 的最佳实践。
创建 guestbook-app.yaml:
cpp
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd # Application 必须在 argocd 命名空间
spec:
project: default
# 源配置:Git 仓库、分支、配置目录
source:
repoURL: http://192.168.166.132/git/argocd.git
targetRevision: main
path: ./
# 目标配置:集群地址、命名空间
destination:
server: https://kubernetes.default.svc
namespace: default
# 同步策略
syncPolicy:
automated:
prune: true # 自动删除 Git 中不存在的资源
selfHeal: true # 自动修复集群与 Git 的不一致
syncOptions:
- CreateNamespace=true # 自动创建目标命名空间
应用配置:
cpp
kubectl apply -f guestbook-app.yaml
查看应用状态:
cpp
kubectl get applications -n argocd
argocd app get guestbook
方式 3:CLI 创建
cpp
argocd app create guestbook \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default \
--sync-policy automated \
--auto-prune \
--self-heal
3. 核心配置项说明
| 配置项 | 说明 |
|---|---|
spec.source |
应用源配置:repoURL(Git/Helm 地址)、targetRevision(分支/标签)、path(配置目录) |
spec.destination |
目标配置:server(K8s 集群地址)、namespace(目标命名空间) |
spec.syncPolicy |
同步策略:automated(自动同步)、syncOptions(同步选项) |
spec.project |
应用所属项目(用于资源隔离和权限控制) |
特殊源配置示例
-
Helm 应用:
cppsource: repoURL: https://charts.bitnami.com/bitnami chart: nginx targetRevision: 13.2.17 helm: values: | service: type: NodePort -
Kustomize 应用:
cppsource: repoURL: https://github.com/my-repo.git path: my-app/overlays/prod kustomize: namePrefix: prod-
四、进阶配置
1. 多集群管理
ArgoCD 支持将应用部署到多个外部 Kubernetes 集群:
1.1 添加外部集群:
cpp
argocd cluster add <kubeconfig-context-name>
1.2 查看已添加的集群:
cpp
argocd cluster list
1.3 部署应用到外部集群:
创建 Application 时,spec.destination.server 填写外部集群的 API 地址(从 argocd cluster list 获取)。
2. 私有 Git 仓库配置
若 Git 仓库是私有的,需配置访问凭证:
UI 方式
-
点击Settings -> Repositories -> Connect Repo。
-
选择仓库类型,填写 URL 和认证信息(HTTPS 用用户名/令牌,SSH 用私钥)。
CLI 方式
cpp
# HTTPS 认证
argocd repo add https://github.com/my-private-repo.git --username my-username --password my-token
# SSH 认证
argocd repo add git@github.com:my-private-repo.git --ssh-private-key-path ~/.ssh/id_rsa
3. 应用集(ApplicationSet)
用于批量创建和管理多个 Application,适用于多环境(dev/staging/prod)、多租户场景。
示例:为 dev/staging/prod 环境创建应用
cpp
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-set
namespace: argocd
spec:
generators:
# 列表生成器:定义环境列表
- list:
elements:
- env: dev
namespace: dev
cluster: https://kubernetes.default.svc
- env: staging
namespace: staging
cluster: https://kubernetes.default.svc
- env: prod
namespace: prod
cluster: https://kubernetes.default.svc
template:
metadata:
name: '{{env}}-my-app'
spec:
project: default
source:
repoURL: https://github.com/my-repo/my-app.git
targetRevision: main
path: overlays/{{env}}
destination:
server: '{{cluster}}'
namespace: '{{namespace}}'
syncPolicy:
automated:
prune: true
selfHeal: true
应用后,ArgoCD 会自动生成 dev-my-app、staging-my-app、prod-my-app 三个 Application。
4. RBAC 权限控制
通过 argocd-rbac-cm ConfigMap 配置细粒度权限:
cpp
kubectl edit configmap argocd-rbac-cm -n argocd
示例配置:
cpp
data:
policy.csv: |
# 给 role:dev 授予 default 命名空间应用的查看和同步权限
p, role:dev, applications, get, default/*, allow
p, role:dev, applications, sync, default/*, allow
# 将用户 dev@example.com 绑定到 role:dev
g, user:dev@example.com, role:dev
policy.default: role:readonly # 默认角色为只读
5. 同步钩子与同步波
-
同步钩子:在同步过程中执行前置/后置操作(如数据库迁移)。
cppapiVersion: batch/v1 kind: Job metadata: name: db-migrate annotations: argocd.argoproj.io/hook: pre-sync # 前置钩子 argocd.argoproj.io/hook-delete-policy: HookSucceeded # 成功后删除 spec: template: spec: containers: - name: db-migrate image: my-db-migrate:latest restartPolicy: Never backoffLimit: 1 -
同步波:控制资源同步顺序(数字越小越先同步)。
cppapiVersion: v1 kind: ConfigMap metadata: name: my-config annotations: argocd.argoproj.io/sync-wave: "1" # 先同步 data: config: value apiVersion: apps/v1 kind: Deployment metadata: name: my-app annotations: argocd.argoproj.io/sync-wave: "2" # 后同步
五、常用操作
cpp
# 同步应用
argocd app sync guestbook
# 查看应用详情
argocd app get guestbook
# 回滚应用
argocd app rollback guestbook
# 删除应用(含集群资源)
argocd app delete guestbook --cascade
# 暂停/恢复同步
argocd app pause guestbook
argocd app resume guestbook
# 查看应用日志
argocd app logs guestbook
六、生产环境最佳实践
-
GitOps 自管理:将 ArgoCD 自身的配置(Application、ApplicationSet)纳入 Git 版本控制。
-
安全配置:修改默认密码、启用 HTTPS、配置 RBAC 最小权限。
-
高可用部署:为 ArgoCD 组件配置多副本,避免单点故障。
-
监控告警:集成 Prometheus + Grafana 监控 ArgoCD 组件和应用状态。
-
定期备份:备份 ArgoCD 的 Secret 和 ConfigMap 数据。