3. 多集群架构基础:Hub Cluster 与 Managed Cluster 模型、Argo CD 多集群注册方式
在开始检测 Deployment 版本漂移之前,必须先理解 Argo CD 的多集群管理模型。Argo CD 采用 Hub-Spoke(中心-辐射) 架构,其中 Hub Cluster 作为控制平面,负责管理一个或多个 Managed Cluster。这种架构将控制逻辑与工作负载分离,是版本漂移检测的基础设施前提。
3.1 Hub Cluster 与 Managed Cluster 模型
| 角色 | 职责 | 关键特征 |
|---|---|---|
| Hub Cluster | 运行 Argo CD 控制平面组件(API Server、Repo Server、Application Controller、Redis) | 存储 Application/AppProject CRD、管理 Git 仓库连接、维护集群注册信息、执行同步策略 |
| Managed Cluster | 运行实际工作负载(Deployment、Service、ConfigMap 等) | 不运行 Argo CD 控制平面;仅暴露 Kubernetes API Server 供 Hub 访问;通过 kubeconfig 或 Service Account 注册 |
3.2 Argo CD 多集群注册方式
Argo CD 支持两种方式将 Managed Cluster 注册到 Hub Cluster:kubeconfig 注入 和 Service Account 自动创建。两种方式最终都会在 Hub Cluster 的 argocd 命名空间下生成一个 Secret,其中包含访问 Managed Cluster 所需的凭证。
3.2.1 方式一:kubeconfig 注入
管理员手动提供 Managed Cluster 的 kubeconfig 文件,Argo CD 直接使用该文件中的 server 地址和 certificate-authority-data 建立连接。适用于已有 kubeconfig 的场景,例如从云厂商直接下载的集群凭证。
# 使用 argocd CLI 注册集群(kubeconfig 方式)
argocd cluster add <context-name> \
--name my-production-cluster \
--kubeconfig /path/to/kubeconfig \
--namespace argocd
3.2.2 方式二:Service Account 自动创建
Argo CD 通过 argocd cluster add 命令(不带 --kubeconfig 参数)自动在目标集群中创建 Service Account、ClusterRole 和 ClusterRoleBinding,然后将 Service Account 的 和 CA 证书存储到 Hub Cluster 的 Secret 中。这是最推荐的方式,因为 Argo CD 会自动管理 RBAC 权限。
# 使用 argocd CLI 注册集群(Service Account 方式)
# 前提:当前 kubeconfig 的 context 已切换到目标集群
argocd cluster add <context-name> \
--name my-staging-cluster \
--namespace argocd
# 验证注册结果
argocd cluster list
| 对比维度 | kubeconfig 注入 | Service Account 自动创建 |
|---|---|---|
| 凭证来源 | 管理员提供的 kubeconfig 文件 | Argo CD 自动生成的 Service Account |
| RBAC 管理 | 手动维护,需自行创建 ClusterRole/Binding | 自动创建,默认绑定 cluster-admin 角色 |
| 证书处理 | 使用 kubeconfig 中的 CA 数据 | 自动获取集群 CA 证书 |
| 轮换 | 需手动更新 kubeconfig | 支持 自动轮换(Kubernetes 1.24+) |
| 安全风险 | kubeconfig 可能包含长期有效的管理员凭证 | 可绑定最小权限,且可设置过期时间 |
| 推荐等级 | ⭐ 临时/测试环境 | ⭐⭐⭐ 生产环境首选 |
3.3 注册后的 Secret 结构
无论使用哪种方式注册,Argo CD 都会在 argocd 命名空间下创建一个名为 cluster-<cluster-name>-<hash> 的 Secret。理解这个 Secret 的结构对于后续调试版本漂移检测至关重要。
# 查看已注册集群的 Secret
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=cluster
# 查看某个集群 Secret 的详细内容
kubectl get secret cluster-my-cluster-xxxxx -n argocd -o yaml
# Secret 关键字段说明(解码后):
# server: https://api.managed-cluster.example.com:6443
# config: |
# {
# "bearerToken": "eyJhbGciOiJSUzI1NiIs...", # Service Account
# "tlsClientConfig": {
# "caData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." # CA 证书
# }
# }
# name: my-cluster
# namespaces: ["default", "production"]
client-certificate-data 和 client-key-data,这些敏感信息也会被存储在 Secret 中。建议在生产环境中优先使用 Service Account 方式,并启用 自动轮换(Kubernetes v1.24+ 默认开启)。定期审计 argocd cluster list 的输出,移除不再使用的集群注册。
3.4 多集群注册的版本漂移检测意义
理解 Hub-Managed 模型和注册方式后,可以明确版本漂移检测的数据流:
- Hub Cluster 通过注册的 Secret 定期轮询每个 Managed Cluster 的 Kubernetes API。
- Argo CD 的 Application Controller 将每个集群中 Deployment 的实际状态与 Git 仓库中的期望状态进行对比。
- 当发现某个 Managed Cluster 中的 Deployment 镜像标签、副本数或配置与期望状态不一致时,即产生 OutOfSync 状态。
- 版本漂移检测正是利用这一机制,通过比较 同一 Application 在不同 Managed Cluster 上的实际运行版本,发现跨集群的不一致。