You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何基于Cilium全局服务实现多集群CockroachDB

在Cilium Cluster Mesh环境下用全局服务部署多集群CockroachDB的解决方案

问题背景

我正尝试在由Cilium Cluster Mesh连接的3个K8s集群中部署多集群CockroachDB。对比CockroachLabs文档里修改CoreDNS ConfigMap的方案,我更倾向于使用Cilium全局服务(global-services),但遇到了以下问题:

  • CockroachDB通过Helm安装时,StatefulSet的--join参数依赖discovery Service(clusterIP: None)生成的Pod FQDN来实现节点间通信
  • 我尝试为远程集群创建类似的discovery和public Service,并添加Cilium注解:
    io.cilium/global-service: 'true'
    service.cilium.io/affinity: "remote"
    
  • 但这些服务仍绑定本地集群,CockroachDB只能识别本地节点,无法跨集群发现节点;即使修改--join参数加入远程服务地址也无效。

需要解决的核心问题:如何通过Cilium全局服务实现跨集群的CockroachDB节点FQDN解析与通信?

解决思路与步骤

1. 调整Headless Service为全局服务

CockroachDB的discovery Service是Headless Service(clusterIP: None),这类服务的DNS条目原本仅针对本地StatefulSet Pod。要实现跨集群解析,需将每个集群的该服务配置为Cilium全局服务:

apiVersion: v1
kind: Service
metadata:
  name: cockroachdb-discovery
  annotations:
    io.cilium/global-service: "true"
    # 无需设置affinity: remote,让服务在所有集群可见
spec:
  clusterIP: None
  selector:
    app.kubernetes.io/name: cockroachdb
  ports:
  - port: 26257
    name: grpc
  - port: 8080
    name: http

配置后,远程集群的Pod可以通过pod-name.cockroachdb-discovery.cluster-name.cilium.global格式的全局FQDN访问对应节点,其中cluster-name是你的集群在Cilium Mesh中的名称。

2. 更新--join参数包含所有跨集群节点FQDN

CockroachDB需要明确的节点列表来完成集群初始化,因此需将所有集群的节点全局FQDN加入--join参数。以3个集群(cluster-a、cluster-b、cluster-c)各3个节点为例,修改Helm values:

statefulset:
  extraArgs:
    - --join=cockroachdb-0.cockroachdb-discovery.cluster-a.cilium.global,cockroachdb-1.cockroachdb-discovery.cluster-a.cilium.global,cockroachdb-2.cockroachdb-discovery.cluster-a.cilium.global,cockroachdb-0.cockroachdb-discovery.cluster-b.cilium.global,cockroachdb-1.cockroachdb-discovery.cluster-b.cilium.global,cockroachdb-2.cockroachdb-discovery.cluster-b.cilium.global,cockroachdb-0.cockroachdb-discovery.cluster-c.cilium.global,cockroachdb-1.cockroachdb-discovery.cluster-c.cilium.global,cockroachdb-2.cockroachdb-discovery.cluster-c.cilium.global

3. 验证跨集群连通性

部署前先确认全局服务功能正常:

  • 在任意集群的Pod中执行nslookup cockroachdb-0.cockroachdb-discovery.cluster-b.cilium.global,检查是否能解析到远程Pod的IP
  • 测试端口连通性:telnet cockroachdb-0.cockroachdb-discovery.cluster-b.cilium.global 26257,确保连接正常

4. 排查Cilium Mesh配置(若遇到同步问题)

如果全局服务未正常同步,检查以下内容:

  • 所有集群的Cilium已启用全局服务:cilium config set global-services true
  • 集群间Mesh连接状态正常:cilium cluster mesh status,确认所有集群已成功加入Mesh

5. 简化方案:用全局ClusterIP服务作为发现入口(可选)

若不想手动维护所有节点FQDN,可创建全局ClusterIP服务指向CockroachDB节点,将其地址加入--join参数:

apiVersion: v1
kind: Service
metadata:
  name: cockroachdb-global
  annotations:
    io.cilium/global-service: "true"
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: cockroachdb
  ports:
  - port: 26257
    name: grpc

然后设置--join=cockroachdb-global.cilium.global。注意:部分CockroachDB版本可能无法通过这种方式自动发现所有节点,需测试验证。

内容的提问来源于stack exchange,提问作者Krystian Marek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:55:28