2. Argo CD 基础:架构、核心组件及工作原理
Argo CD 是一个为 Kubernetes 设计的声明式 GitOps 持续交付工具。它遵循“Git 仓库作为单一事实来源”的原则,通过监控 Git 仓库中定义的期望状态,自动将集群的实际状态同步至期望状态。理解其架构与核心组件是进行集群节点扩容与安全配置的前提。
2.1 整体架构概览
Argo CD 采用微服务架构,主要由三个核心组件构成:API Server、Repo Server 和 Application Controller。它们协同工作,实现了从 Git 到 Kubernetes 集群的自动化部署流水线。
2.2 核心组件详解
每个组件在 Argo CD 中承担着不同的职责,它们之间的协作构成了 GitOps 工作流的基础。
| 组件名称 | 核心职责 | 关键特性 |
|---|---|---|
| API Server | 作为 Argo CD 的入口,暴露 gRPC/REST API,处理用户认证、授权、Application 的 CRUD 操作以及部署策略的触发。 | 支持 SSO (OIDC, LDAP)、RBAC、Web UI 和 CLI (argocd)。 |
| Repo Server | 负责与 Git 仓库交互,拉取应用清单(Helm Chart、Kustomize、YAML 等),并将其生成为 Kubernetes 可识别的 Manifest。 | 内部维护 Git 缓存,支持多种配置管理工具,执行 Manifest 渲染。 |
| Application Controller | 持续监控集群中已部署的应用状态,并与 Repo Server 生成的期望状态进行对比,执行自动或手动的同步操作。 | 负责状态差异计算、同步策略(Sync Policy)、健康状态评估及资源清理。 |
2.3 核心组件交互流程
一个典型的 Argo CD 工作流程包含以下步骤,展示了组件间的协作关系:
- 用户提交变更:开发人员将 Kubernetes 清单(如 Deployment、Service)的变更推送到 Git 仓库。
- API Server 接收请求:用户通过
argocd app sync命令或 Web UI 触发同步请求,API Server 验证用户权限并创建同步任务。 - Repo Server 拉取并渲染:API Server 将任务委托给 Repo Server。Repo Server 从 Git 仓库拉取最新代码,根据应用配置(如 Helm values.yaml)渲染出最终的 Kubernetes Manifest。
- Application Controller 执行同步:Application Controller 获取 Repo Server 生成的 Manifest,与目标集群中的当前状态进行对比。如果存在差异,则调用 Kubernetes API 创建、更新或删除资源,使集群状态与 Git 仓库一致。
- 状态反馈:Application Controller 将同步结果和健康状态反馈给 API Server,用户可通过 UI 或 CLI 查看。
关键点:Repo Server 是 Argo CD 的“大脑”,负责理解复杂的配置管理逻辑;Application Controller 是“执行者”,负责确保集群状态与“大脑”输出的期望状态一致。两者分离的设计提升了系统的可扩展性和安全性。
2.4 工作原理:声明式 GitOps 循环
Argo CD 的核心工作原理基于一个持续的“观察-差异-同步”循环,这与 Kubernetes 控制器的设计哲学一脉相承。
实践建议:在集群节点扩容场景中,Argo CD 的 Application Controller 会持续监控由 Cluster Autoscaler 或 HPA 引起的资源变化。当 Git 仓库中定义的期望状态(如 Deployment 的副本数)发生变更时,Argo CD 会自动将新节点纳入管理范围,并确保新 Pod 被正确调度和配置。
2.5 组件间通信安全
在生产环境中,组件间的通信安全至关重要。Argo CD 默认使用 TLS 加密组件间的 gRPC 和 HTTP 通信。API Server 作为唯一对外暴露的组件,承担着认证和授权的职责,而 Repo Server 和 Application Controller 仅在集群内部通信,不直接暴露给外部网络。
安全注意:Repo Server 需要访问 Git 仓库的凭证(如 SSH 密钥、)。这些凭证应通过 Kubernetes Secrets 或外部密钥管理服务(如 Vault)注入,避免明文存储。在节点扩容场景中,确保 Repo Server 有足够的网络策略访问新的 Git 仓库或 Chart 仓库。