2. Argo CD 基础:GitOps 理念介绍、Argo CD 架构与核心组件、安装与配置
2.1 GitOps 理念:以 Git 为单一事实来源
GitOps 是一种以 Git 仓库作为声明式基础设施和应用程序的“单一事实来源”(Single Source of Truth)的运维模式。其核心思想是:Git 仓库中的声明式配置(YAML/JSON)是系统期望状态的唯一权威描述,任何对集群的变更都必须通过修改 Git 仓库中的文件来驱动,而非直接操作集群。
核心原则:
- 声明式描述:整个系统状态(应用、配置、基础设施)必须用声明式规范(如 Kubernetes 清单)完整描述。
- 版本控制与不可变:所有变更都通过 Pull Request(PR)提交到 Git,并经过 Code Review,形成完整的审计轨迹。
- 自动同步:集群中运行一个 Operator(如 Argo CD),持续监控 Git 仓库中的期望状态,并自动将集群实际状态拉齐到期望状态。
- 自愈性:当集群状态因手动操作或故障发生漂移时,Operator 会自动将其回滚到 Git 中定义的期望状态。
对比传统 CI/CD:传统 CI/CD 将配置视为“一次性部署脚本”,而 GitOps 将配置视为“持续运行的状态”。GitOps 天然支持多环境(开发/预发/生产)的配置差异管理,通过分支或目录隔离即可实现。
2.2 Argo CD 架构与核心组件
Argo CD 是 Kubernetes 原生的 GitOps 工具,其架构由三个核心组件构成:API Server、Repo Server 和 Application Controller。它们协同工作,实现从 Git 到集群的持续同步。
2.2.1 核心组件详解
| 组件 | 职责 | 关键特性 |
|---|---|---|
| API Server | 提供 REST/gRPC 接口,处理用户、CI 系统、Webhook 的请求;负责认证(OIDC/LDAP/SAML)、授权(RBAC)和项目(Project)管理。 | 无状态,可水平扩展;支持 CLI(argocd)、UI 和 API 三种交互方式。 |
| Repo Server | 负责与 Git 仓库交互:克隆仓库、缓存内容、生成清单(渲染 Helm Chart、Kustomize overlay、Jsonnet 等)。 | 内部维护 Git 缓存,避免重复克隆;支持 SSH/HTTPS 认证;可配置多个仓库。 |
| Application Controller | 核心同步引擎:持续监控 Application 资源,对比 Git 中的期望状态与集群中的实际状态,执行同步、自愈和 Hook 操作。 | 使用 Kubernetes Informer 监听资源变化;支持多种同步策略(自动/手动/带 Prune)。 |
注意:Argo CD 还包含 Redis 作为缓存层(存储 Application 状态和 Git 缓存元数据),以及 ApplicationSet Controller(可选组件,用于批量生成 Application)。在生产部署中,Redis 的高可用配置至关重要。
2.3 Argo CD 安装与配置
Argo CD 支持多种安装方式:官方 Manifest、Helm Chart 和 Operator。以下以最常用的 Helm Chart 方式为例,展示安装与基础配置步骤。
2.3.1 安装前提
- 一个运行中的 Kubernetes 集群(v1.23+ 推荐)。
- 已安装
kubectl并配置好集群访问凭证。 - 已安装
helm(v3.8+)。
2.3.2 使用 Helm 安装 Argo CD
# 1. 添加 Argo CD Helm 仓库
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
# 2. 创建命名空间
kubectl create namespace argocd
# 3. 安装 Argo CD(使用默认配置)
helm install argocd argo/argo-cd \
--namespace argocd \
--set server.service.type=LoadBalancer \
--set configs.params."server\.insecure"=true
# 4. 等待所有 Pod 就绪
kubectl wait --for=condition=Ready pods --all -n argocd --timeout=300s
生产环境建议:使用
server.service.type=ClusterIP 并通过 Ingress 暴露,同时配置 TLS 证书(server.ingress.enabled=true)。server.insecure=true 仅用于测试环境,生产环境应禁用。
2.3.3 获取初始密码与登录
# 获取 admin 初始密码(自动生成)
kubectl get secret argocd-initial-admin-secret \
-n argocd -o jsonpath="{.data.password}" | base64 -d
# 端口转发(如果未使用 LoadBalancer)
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 使用 CLI 登录
argocd login localhost:8080 --username admin --password <初始密码> --insecure
2.3.4 基础配置:添加 Git 仓库与创建 Application
安装完成后,需要配置 Git 仓库连接并创建第一个 Application。
# 添加 Git 仓库(示例使用公开仓库)
argocd repo add https://github.com/argoproj/argocd-example-apps \
--name example-repo
# 创建 Application(通过 CLI)
argocd app create guestbook \
--repo https://github.com/argoproj/argocd-example-apps \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default \
--sync-policy automated
# 查看 Application 状态
argocd app get guestbook
2.3.5 配置清单(关键参数)
| 配置项 | Helm 参数 | 说明 |
|---|---|---|
| 服务暴露方式 | server.service.type |
ClusterIP(默认)、LoadBalancer、NodePort |
| Ingress 配置 | server.ingress.enabled |
需配合 server.ingress.hosts 和 TLS 证书 |
| TLS 证书 | server.certificate |
支持 Secret 引用或自动签发(cert-manager) |
| Redis 高可用 | redis-ha.enabled |
生产环境建议启用,避免单点故障 |
| RBAC 策略 | configs.rbac |
定义角色、角色绑定和策略(policy.csv) |
| SSO 集成 | configs.dex 或 configs.oidc |
支持 Dex(OIDC 代理)或直接 OIDC 提供商 |
验证安装:安装完成后,访问 Argo CD UI(通过 LoadBalancer 或端口转发),使用 admin 和初始密码登录。在 UI 中可以看到默认的
argocd 命名空间下的 Application 列表,以及已添加的 Git 仓库信息。