3. 集群注册与多集群管理:使用 Argo CD 管理多个 Kubernetes 集群
在生产环境中,单一 Kubernetes 集群往往无法满足隔离性、地域分布或资源扩展的需求。Argo CD 作为声明式 GitOps 工具,原生支持多集群管理,允许用户通过一个中心 Argo CD 实例,将应用同步至多个远端集群。本章节将深入讲解集群注册的核心机制、Secret 的创建与维护,以及多集群场景下的最佳实践。
3.1 多集群架构与核心概念
Argo CD 采用 Hub-and-Spoke(中心辐射)模型。中心集群运行 Argo CD 控制平面,负责监听 Git 仓库、维护应用状态;远端集群仅需运行标准 kubelet 组件,无需安装 Argo CD 实例。控制平面通过 集群 Secret 中存储的 kubeconfig 或 bearer 与远端集群的 API Server 通信。
- 控制平面集群(Hub): 部署 Argo CD 组件(application-controller, api-server, repo-server)的集群。
- 目标集群(Spoke): 被 Argo CD 管理的远端集群,运行实际工作负载。
- 集群 Secret: 位于控制平面集群
argocd命名空间下的 Kubernetes Secret,包含连接远端集群所需的认证信息。
3.2 集群注册方式与 Secret 结构
Argo CD 提供两种主要的集群注册方式:CLI 命令注册 和 手动创建 Secret。无论哪种方式,最终都会在 argocd 命名空间下生成一个类型为 Opaque 的 Secret,并带有特定标签 argocd.argoproj.io/secret-type: cluster。
3.2.1 集群 Secret 核心字段
| 字段 | 类型 | 说明 | 是否必填 |
|---|---|---|---|
name |
string | 集群在 Argo CD 中的显示名称 | 是 |
server |
string | 远端集群 API Server 的 URL 地址 | 是 |
config |
JSON (string) | 包含认证凭据(bearer 、TLS 证书或 kubeconfig 内容) | 是 |
labels |
map | 可选标签,用于按环境或区域筛选集群 | 否 |
annotations |
map | 可选注解,如描述信息或自定义元数据 | 否 |
3.2.2 方法一:使用 argocd CLI 注册
这是最便捷的方式,适用于拥有远端集群 kubeconfig 的场景。
# 将当前 kubeconfig 的 context 注册到 Argo CD
argocd cluster add <context-name> \
--name <cluster-display-name> \
--label env=production \
--label region=us-east-1
# 验证集群列表
argocd cluster list
--label 参数为集群打上环境标签,便于后续应用按标签选择目标集群。
3.2.3 方法二:手动创建集群 Secret
当无法直接使用 CLI(如 CI/CD 流水线、基础设施即代码场景)时,可以手动创建 Secret YAML 文件并 apply 到控制平面集群。
apiVersion: v1
kind: Secret
metadata:
name: cluster-production-01
namespace: argocd
labels:
argocd.argoproj.io/secret-type: cluster
env: production
region: us-east-1
type: Opaque
stringData:
name: production-01
server: https://api.prod-cluster.example.com:6443
config: |
{
"bearerToken": "<your-service-account->",
"tlsClientConfig": {
"insecure": false,
"caData": "<base64-encoded-ca-cert>"
}
}
# 可选:直接嵌入 kubeconfig
# kubeconfig: |
# apiVersion: v1
# kind: Config
# ...
bearerToken 结合 ServiceAccount,而非长期有效的 kubeconfig 文件。
3.3 集群生命周期维护与漂移复测
多集群管理的核心挑战在于保持集群注册信息的准确性和一致性。当集群证书轮换、API Server 地址变更或集群被销毁时,Argo CD 需要及时感知并更新集群 Secret。
3.3.1 集群健康状态监控
Argo CD 会定期(默认每 30 秒)向已注册集群的 API Server 发送健康检查请求。如果连续多次失败,该集群会被标记为 Unhealthy 或 Unknown 状态。
# 查看集群健康状态
argocd cluster list
# 输出示例:
# SERVER NAME STATUS MESSAGE
# https://api.prod-cluster.com production-01 Successful
# https://api.staging-cluster.com staging-01 Unhealthy Failed to establish connection
3.3.2 集群 Secret 更新流程
当集群凭据发生变化时,需要更新对应的 Secret。更新后,Argo CD 会自动重新加载配置,无需重启服务。
- 获取当前 Secret:
kubectl get secret cluster-production-01 -n argocd -o yaml - 更新 config 字段: 修改
bearerToken或caData为新值。 - 应用更新:
kubectl apply -f updated-secret.yaml - 验证连接: 使用
argocd cluster list确认状态恢复为Successful。
3.3.3 漂移复测:集群注册一致性校验
在 GitOps 实践中,集群注册信息本身也应作为代码管理。通过定期复测(Reconciliation),确保控制平面中的集群 Secret 与 Git 仓库中的声明式定义保持一致。
- 声明式集群定义: 将集群 Secret 的 YAML 模板存储在 Git 仓库的
clusters/目录下。 - 自动同步: 使用 Argo CD Application 管理集群 Secret 自身(自管理模式),或通过 CI/CD 流水线定期 apply。
- 漂移检测: 对比 Git 中的期望 Secret 与集群中的实际 Secret,若发现 过期、地址变更等差异,自动触发更新。
3.4 多集群管理最佳实践
| 实践项 | 说明 | 推荐等级 |
|---|---|---|
| 使用 ServiceAccount 而非用户 | 为每个远端集群创建专用 ServiceAccount,并绑定最小权限的 RBAC 角色。避免使用 admin 级别的 kubeconfig。 | 强制 |
| 标签化集群分类 | 使用 env、region、team 等标签对集群进行分类,便于 Application 按标签选择目标。 |
推荐 |
| 集群 Secret 加密存储 | 在 Git 仓库中仅存储加密后的 Secret(如 SealedSecret),或使用 External Secrets Operator 从 Vault 拉取。 | 强制 |
| 定期健康检查与告警 | 配置 Prometheus 监控 Argo CD 集群状态指标,对 Unhealthy 集群发送告警。 |
推荐 |
| 集群生命周期自动化 | 通过 CI/CD 流水线自动注册新集群、更新过期证书、注销已销毁集群。 | 可选 |
3.5 常见问题与排错
- 集群状态一直显示 Unknown: 检查控制平面到远端集群的网络连通性,确认 API Server 地址是否可达,防火墙是否放行 6443 端口。
- 认证失败(Unauthorized): 确认 ServiceAccount 的 是否过期,RBAC 权限是否足够(至少需要
get, list, watch资源权限)。 - 证书错误(x509): 更新 Secret 中的
caData字段,或设置insecure: true(仅测试环境)。 - 集群 Secret 被误删除: 如果使用 GitOps 管理集群 Secret,重新 apply 即可恢复;否则需重新注册集群。
# 查看集群详情
argocd cluster get <cluster-server-url>
# 查看 Argo CD 日志
kubectl logs -n argocd deployment/argocd-application-controller | grep -i cluster
# 手动触发集群重新连接
argocd cluster update <cluster-server-url>