Argo CD 多集群管理的必要性

为什么需要连接跨集群?

在现代云原生架构中,企业通常面临 多集群部署场景

  1. 环境隔离需求:开发(dev)、测试(staging)、生产(prod)集群独立部署

  2. 多云/混合云策略:应用部署在 AWS、GCP、本地数据中心等异构环境

  3. 容灾与地理分布:跨区域集群保障业务高可用性

  4. 边缘计算场景:中心集群管理边缘节点集群

Argo CD 的核心价值

作为 GitOps 实践的核心工具,Argo CD 提供:
统一控制平面:通过单一界面管理所有集群的应用状态
配置即代码:基于 Git 仓库声明式同步多集群配置
自动化审计:自动检测集群实际状态与 Git 定义的偏差
安全合规:避免人工直接操作集群(如 kubectl apply),降低误操作风险

先决条件:

  • 网络连通:确保当前机器可以 ping 通远程机器的 IP,并能访问其 Kubernetes API(例如,使用 curl https://<REMOTE_IP>:6443/version 测试,如果返回 Kubernetes 版本信息,则 OK)。如果有防火墙,打开 6443 端口。

  • SSH 访问:你需要 SSH 到远程机器来获取 kubeconfig(k0s 默认路径:/var/lib/k0s/pki/admin.conf)。

1. 目标集群步骤

Argo CD 需要通过 kubeconfig 访问另一个集群,所以我们先在目标集群上创建一个 ServiceAccount 并赋予权限。

1.1 在目标 k0s 集群创建 ServiceAccount

kubectl create namespace argocd
kubectl create serviceaccount argocd-manager -n argocd

1.2 绑定 cluster-admin 权限(可以改成更细粒度的 RBAC)

kubectl create clusterrolebinding argocd-manager-role \
  --clusterrole=cluster-admin \
  --serviceaccount=argocd:argocd-manager

1.3 生成 Token Secret

由于 Kubernetes v1.24+(包括 k0s 1.24+)ServiceAccount 默认不会自动创建 Secret 了,所以我们需要手动为 ServiceAccount 生成一个 token Secret。

cat <<EOF | k0s kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: argocd-manager-token
  namespace: argocd
  annotations:
    kubernetes.io/service-account.name: "argocd-manager"
type: kubernetes.io/service-account-token
EOF

1.3 在 目标 k0s 集群 上导出 kubeconfig

目标是生成一个专用的 kubeconfig 文件,给 Argo CD 用。

要把这个 SERVER 换成你实际的集群地址。

SECRET_NAME=argocd-manager-token
TOKEN=$(k0s kubectl -n argocd get secret $SECRET_NAME -o jsonpath="{.data.token}" | base64 --decode)
CA_CERT=$(k0s kubectl -n argocd get secret $SECRET_NAME -o jsonpath="{.data['ca\.crt']}" | base64 --decode)
SERVER=$(k0s kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

cat > argocd-target.kubeconfig <<EOF
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: $(echo "$CA_CERT" | base64 | tr -d '\n')
    server: $SERVER
  name: target-k0s
contexts:
- context:
    cluster: target-k0s
    user: argocd-manager
  name: target-k0s
current-context: target-k0s
users:
- name: argocd-manager
  user:
    token: $TOKEN
EOF

这会生成一个 argocd-target.kubeconfig 文件到当前目录下。将其导出到你的机器上。

2. Argo CD 步骤

需要先安装 Argo CD CLI(可以 brew install argocd 或从官网下载)。

2.1 登录 Argo CD

使用 CLI 登录 ArgoCD 服务器

argocd login <ARGOCD_SERVER> --username <USERNAME> --password <PASSWORD>

登录成功示意

2.2 添加集群

argocd cluster add cluster2 --kubeconfig argocd-target.kubeconfig

命令会提示确认,并自动创建 Secret 在 ArgoCD 命名空间中。

注意,该步骤可能会报错:

{"level":"fatal","msg":"failed to create service account \"argocd-manager\" in namespace \"kube-system\": Post \"https://******.com:6443/api/v1/namespaces/kube-system/serviceaccounts\": tls: failed to verify certificate: x509: certificate is valid for kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster, kubernetes.svc.cluster.local, localhost, not test.qianmucloud.cn","time":"2025-08-16T11:04:43+08:00"}

这个报错是说,你的 k0s API Server 用的证书里,根本没有 ****.com 这个域名,所以当 Argo CD 访问 https://******.com:6443 时,TLS 验证直接失败。

解决方案:在 API Server 证书里加 ******.com

  1. 修改 k0s 配置(通常是 /etc/k0s/k0s.yaml),在 spec.api.sans 里添加你的域名:

spec:
  api:
    sans:
      - ******.com
      - 你的公网IP
  1. 重启 k0s:

k0s stop
k0s start
  1. 新证书会包含你的域名,TLS 验证就能过。

🎉 至此,完成添加~