ArgoCD GitOps:声明式持续部署
什么是 GitOps
GitOps 是一种以 Git 仓库作为单一事实来源的运维模式。所有描述系统期望状态的声明式配置都存储在 Git 中,由自动化控制器持续同步实际运行状态至目标状态。它带来了版本控制、审计追踪、回滚能力以及更好的协作体验。
GitOps 的核心原则:
- 声明式描述:通过 YAML、JSON 等格式定义整个系统状态。
- 版本化与不可变:配置变更通过 Git commit 记录,可追溯、可回滚。
- 自动拉取:控制器自动从 Git 仓库拉取期望状态并应用到目标环境。
- 持续协调:不间断监控实际状态与期望状态的差异,自动修复。
ArgoCD 简介
ArgoCD 是专为 Kubernetes 设计的声明式持续部署工具,完美践行 GitOps 理念。它将应用程序的定义、配置与环境通过 Git 仓库管理,并自动将其同步到 Kubernetes 集群中。
相比手动 kubectl apply,ArgoCD 提供:
- 可视化 Web UI,直观管理多集群多应用。
- 自动同步、漂移检测与自动修正。
- 完善的 RBAC 与 SSO 集成。
- 多租户、应用集(ApplicationSet)支持。
核心概念
在深入使用前,需要理解 ArgoCD 的三大核心资源类型:
Application
应用是 ArgoCD 管理的基本单元,它定义了某个 Kubernetes 资源从哪里拉取(源仓库)以及部署到哪个集群和命名空间。一个典型的 Application 声明如下:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git
targetRevision: HEAD
path: kustomize/overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true
selfHeal: true
AppProject
AppProject 为 Application 提供逻辑分组和权限边界。可以限制允许的源仓库、目标集群、命名空间以及可部署的资源类型。默认存在一个 default 项目,适合入门使用。
Repository & Cluster
- Repository 表示 Git 或 Helm 仓库的连接凭证。
- Cluster 表示要部署到的 Kubernetes 集群信息。ArgoCD 默认管理自身所在集群,也可添加外部集群。
安装 ArgoCD
在 Kubernetes 集群中快速安装:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
等待所有 Pod 就绪:
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=argocd-server -n argocd --timeout=300s
访问 Web UI
默认服务类型为 ClusterIP,可通过端口转发访问:
kubectl port-forward svc/argocd-server -n argocd 8080:443
在浏览器打开 https://localhost:8080,使用初始管理员密码登录,用户名 admin。获取密码:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
创建第一个 Application
准备 Git 仓库
创建一个包含 Kubernetes 清单的 Git 仓库。例如,目录结构:
├── deployment.yaml
├── service.yaml
└── kustomization.yaml
deployment.yaml 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
使用 Kustomize 或纯 YAML 均可。
通过 CLI 创建应用
安装 ArgoCD CLI:
brew install argocd
# 或下载二进制文件
登录:
argocd login localhost:8080 --insecure
创建应用:
argocd app create my-nginx \
--repo https://github.com/your-org/your-repo.git \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
同步(部署)到集群:
argocd app sync my-nginx
查看状态:
argocd app get my-nginx
通过 Web UI 创建
在 UI 中点击 “New App”,填写同样的信息并点击创建,然后点击 “Sync” 即可部署。
同步策略与自动运维
手动同步与自动同步
默认 Application 需要手动点击 “Sync”。可以配置自动同步以完全实现 GitOps 自动闭环。在 Application 的 syncPolicy.automated 中设置:
prune: true自动删除 Git 中移除的资源。selfHeal: true当集群状态偏离 Git 定义时自动修正。
修改 Application 添加自动同步:
argocd app set my-nginx --sync-policy automated --auto-prune --self-heal
或直接编辑 YAML:
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
同步选项
可进一步细粒度控制同步行为,例如:
Validate=true:验证清单合法性。CreateNamespace=true:自动创建不存在的命名空间。ApplyOutOfSyncOnly=true:仅同步不同步的资源。
示例:
syncPolicy:
automated: ...
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
漂移检测与健康状态
ArgoCD 持续检测实际集群状态与 Git 定义的差异,并在 UI 中以 “OutOfSync” 标识。健康状态分为:
- Healthy:资源处于正常运行状态。
- Progressing:正在部署或更新中。
- Degraded:资源状态异常。
- Suspended:暂停(如 CronJob 挂起)。
结合 selfHeal,任何意外漂移都会被自动恢复,确保系统始终向 Git 中的声明收敛。
使用 Kustomize、Helm 和其他工具
ArgoCD 原生支持多种配置管理工具:
Kustomize
只需在 path 中指向包含 kustomization.yaml 的目录即可。ArgoCD 会自动执行 kustomize build。
Helm
创建应用时指定 Helm 仓库和 chart 名称:
argocd app create my-helm-app \
--repo https://charts.example.com/ \
--helm-chart my-chart \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
或直接引用 Git 中的 Helm chart directory。还可以提供自定义 values.yaml 覆写:
spec:
source:
repoURL: ...
path: ./chart
helm:
valueFiles:
- values-prod.yaml
Jsonnet、Ksonnet、自定义插件
通过添加 Sidecar 或 CMP(Config Management Plugin)可扩展支持任意配置生成方式。
多集群管理
ArgoCD 可以管理任意数量的远端 Kubernetes 集群。添加新集群:
argocd cluster add <context-name> --name <cluster-name>
或通过 Web UI 手动提供 kubeconfig。在创建 Application 时指定 dest-server 为集群 API Server 地址即可部署到该集群。
应用集(ApplicationSet)
当需要基于模板生成大量相似 Application(如多环境、多租户)时,ApplicationSet 控制器通过生成器动态创建 Application。常见生成器:
- List:固定列表生成。
- Git:根据 Git 仓库中的目录或文件生成。
- Matrix:组合多个生成器。
- Pull Request:为每个 PR 自动创建预览环境。
示例:为 Git 仓库中 apps/* 目录每个子目录创建一个 Application:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: cluster-addons
spec:
generators:
- git:
repoURL: https://github.com/example/cluster-addons.git
revision: HEAD
directories:
- path: apps/*
template:
metadata:
name: '{{path.basename}}'
spec:
project: default
source:
repoURL: https://github.com/example/cluster-addons.git
targetRevision: HEAD
path: '{{path}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{path.basename}}'
安全与访问控制
单点登录(SSO)
ArgoCD 支持 OIDC、SAML、LDAP 等协议集成。配置 argocd-cm ConfigMap 和 argocd-rbac-cm 即可对接企业身份提供商。
RBAC
基于角色的访问控制可以精确到项目、应用和操作。示例策略:
p, role:developer, applications, sync, my-project/*, allow
g, dev-team, role:developer
通过声明式配置,整个 RBAC 策略也可通过 Git 管理。
最佳实践小结
- Git 作为唯一真相源:任何集群变更必须通过 Git PR,严禁手动
kubectl。 - 环境分离与目录结构:使用
path区分环境(如overlays/dev、overlays/prod)。 - 开启自愈和自动清理:
selfHeal+prune确保环境一致性。 - 设置资源限制与网络策略:通过 AppProject 约束高风险操作。
- 监控与告警:集成 Prometheus metrics,监控同步状态和性能。
- 密钥管理:使用密封秘密(Sealed Secrets)或外部密钥管理(如 Vault),不要将明文密钥存入 Git。
下一步学习
- 探索 Argo Rollouts 实现渐进式交付(蓝绿、金丝雀)。
- 结合 Argo Workflows 构建 CI/CD 流水线。
- 学习 ArgoCD Notification 配置同步状态通知。
- 深入 ApplicationSet 实现大规模多环境管理。
ArgoCD 将 GitOps 的理念落地为简单而强大的运维模式,帮助你实现安全、可重复、可审计的持续部署。现在,动手创建你的第一个 GitOps 应用吧!