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 到集群的持续同步。

Argo CD 核心架构与组件交互 Argo CD 核心架构与组件交互 Git 仓库 (期望状态) 用户 / CI 系统 (触发同步/查看状态) API Server REST/gRPC 接口 Repo Server 克隆/缓存/渲染 Application Controller 状态对比/同步 Kubernetes 集群 拉取/监听 CLI/UI/API 获取清单 下发任务 渲染后清单 同步/自愈 组件职责说明 API Server:对外暴露接口,处理认证授权与 Webhook Repo Server:连接 Git,缓存仓库,渲染 Helm/Kustomize 模板 Application Controller:持续对比期望状态与实际状态,执行同步与自愈

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
Argo CD 安装与配置流程 Argo CD 安装与配置流程 1. 准备集群 K8s v1.23+ 2. Helm 安装 argo/argo-cd 3. 获取密码 admin 登录 4. 添加仓库 argocd repo add 5. 创建 App argocd app create 6. 同步验证 argocd app sync 提示:生产环境建议使用 Ingress + TLS,并配置 Redis 高可用

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 仓库信息。