3. 存储后端基础:Kubernetes Secrets、ConfigMap、etcd 在 Argo CD 中的角色

Argo CD 作为声明式 GitOps 工具,其核心状态(应用定义、同步状态、集群配置、用户凭证)必须持久化存储。Kubernetes 原生提供的 Secrets、ConfigMap 以及底层分布式键值存储 etcd,共同构成了 Argo CD 的存储后端基础。理解这三者的角色与交互,是掌握版本漂移校准的前提。

3.1 存储层次与职责划分

Argo CD 并未使用外部数据库(如 PostgreSQL),而是直接依赖 Kubernetes 的存储原语。这种设计简化了运维,但也意味着存储的可靠性、一致性和版本管理完全由 Kubernetes 控制平面保障。下表总结了三种存储组件在 Argo CD 中的具体职责:

存储组件 Argo CD 中的主要用途 数据敏感性 版本漂移影响范围
etcd 存储所有 Argo CD 自定义资源(Application、AppProject、ApplicationSet)的最终状态;保存集群 Secrets 的引用。 高(包含集群凭证的加密引用) 全局:影响所有应用同步决策
Secrets 存储仓库凭据(SSH 密钥、HTTPS 令牌)、集群 kubeconfig、Webhook 令牌、SSO 客户端密钥。 极高(明文敏感数据,etcd 中加密) 局部:影响特定仓库或集群的连接
ConfigMap 存储 Argo CD 配置(argocd-cm)、RBAC 策略(argocd-rbac-cm)、通知模板、SSO 配置。 低至中(不含原始凭证) 局部:影响 UI 行为、权限、通知
关键理解: Argo CD 的“期望状态”存储在 Git 中,而“当前状态”存储在 etcd 中。版本漂移校准的本质,就是对比 Git 中的期望状态与 etcd 中的当前状态,并执行同步操作。

3.2 核心存储组件详解

3.2.1 etcd:Argo CD 的“状态中枢”

etcd 是 Kubernetes 控制平面的核心,也是 Argo CD 所有自定义资源(CRD)实例的最终存储位置。当用户通过 argocd app create 或 kubectl apply 创建 Application 资源时,该资源会被序列化并写入 etcd。Argo CD 的 application-controller 持续从 etcd 监听这些资源的变化,并据此驱动同步循环。

  • 版本管理: etcd 为每个键维护一个全局递增的 resourceVersion。Argo CD 利用此机制实现乐观锁,防止并发写冲突。
  • 漂移检测基础: controller 将 etcd 中 Application 的 status.sync.status 字段与 Git 中的期望清单对比,产生“OutOfSync”状态。
  • 高可用: etcd 集群(通常 3 或 5 节点)通过 Raft 共识算法保证数据一致性。etcd 故障将直接导致 Argo CD 无法读取或写入状态。

3.2.2 Secrets:敏感凭证的“保险柜”

Argo CD 需要访问 Git 仓库和 Kubernetes 集群。这些访问凭证(SSH 私钥、API 、kubeconfig 证书)存储在 Kubernetes Secrets 中。Argo CD 的 repo-server 和 application-controller 通过挂载或 API 调用来读取这些 Secret。

# 示例:查看 Argo CD 用于连接 Git 仓库的 Secret
kubectl get secret -n argocd argocd-repo-server-tls -o yaml
# 输出中 data 字段包含 base64 编码的证书和密钥
版本漂移风险点: 如果 Secret 被意外修改或删除(例如通过 kubectl edit),repo-server 将无法拉取 Git 仓库,导致所有依赖该仓库的应用同步失败。此时,Argo CD 会报告“Connection refused”或“Authentication failed”错误,而非版本漂移。

3.2.3 ConfigMap:运行时行为的“调节旋钮”

ConfigMap 存储 Argo CD 的非敏感配置。最核心的是 argocd-cm,它控制着仓库连接方式、资源自定义、UI 品牌等。修改 ConfigMap 通常不需要重启 Pod,Argo CD 组件会动态重载。

  • argocd-cm: 定义仓库凭据的引用方式、资源排除规则、应用状态保留策略。
  • argocd-rbac-cm: 定义基于角色的访问控制策略,影响用户能否触发同步。
  • argocd-ssh-known-hosts-cm: 存储已知的 Git 服务器 SSH 主机密钥,用于验证仓库身份。

3.3 存储组件交互流程(SVG 架构图)

下图展示了 Argo CD 核心组件与三种存储后端的交互关系,以及版本漂移检测的数据流路径:

Argo CD 存储后端交互架构图 Argo CD 存储后端交互与版本漂移数据流 Git 仓库 期望状态 (应用清单) Argo CD 核心组件 repo-server | application-controller | api-server 版本对比 & 同步引擎 K8s 存储后端 etcd / Secrets / ConfigMap 拉取清单 读写状态 版本漂移检测流程 1. 读取 Git 期望状态 2. 读取 etcd 当前状态 3. 对比差异 4. 更新 status.sync.status 存储组件对版本漂移的影响 • etcd 数据损坏或版本回退:Argo CD 会基于错误的“当前状态”做出同步决策,可能导致意外的资源回滚。 • Secret 变更:导致 repo-server 无法拉取 Git,漂移检测因“连接失败”而中断,不会产生 OutOfSync 状态。 • ConfigMap 配置错误:可能禁用自动同步或修改资源比较策略,间接影响漂移校准的执行。

3.4 存储版本漂移的典型场景

在 Argo CD 的日常运维中,存储后端本身也可能发生“版本漂移”,这通常不是指应用清单的变更,而是存储数据的意外修改或回退。以下场景需要特别关注:

  1. etcd 快照恢复: 当 Kubernetes 集群从旧快照恢复时,etcd 中的 Argo CD Application 状态可能回退到过去的版本。此时,Argo CD 会认为当前状态与 Git 期望状态不一致,触发大规模同步。
  2. Secrets 被手动覆盖: 运维人员通过 kubectl apply 直接修改了 argocd-repo-server-tls Secret,导致 repo-server 无法连接仓库。Argo CD 会报告仓库连接错误,而非应用版本漂移。
  3. ConfigMap 配置漂移: 多集群环境中,不同集群的 argocd-cm 配置不一致,导致同一 Application 在不同集群上的同步行为不同。
校准策略: 针对存储后端的版本漂移,建议启用 argocd-application-controller 的 --status-processors 和 --operation-processors 参数,并定期对 etcd 进行健康检查。对于 Secrets,应避免手动编辑,始终通过 Argo CD 的 Web UI 或 CLI 进行管理。

3.5 存储后端对比总结

下表从版本漂移校准的角度,对比三种存储后端的关键特性:

特性 etcd Secrets ConfigMap
数据一致性 强一致性(Raft) 最终一致性(API Server 缓存) 最终一致性
版本控制 resourceVersion 乐观锁 无内置版本管理 无内置版本管理
漂移检测影响 直接影响同步决策 影响仓库/集群连接 影响同步策略与权限
恢复难度 高(需 etcd 快照) 中(需原始凭证备份) 低(可从 Git 恢复)
推荐操作 定期备份 etcd 使用 Sealed Secrets 或 External Secrets Operator 将配置纳入 Git 管理