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

如何在Kubernetes中创建多数据中心Cassandra集群

在Kubernetes中搭建多数据中心Cassandra集群的步骤

核心思路

在K8s环境中,多DC Cassandra集群需要为每个数据中心创建独立的StatefulSet + Headless Service——每个DC的节点属于不同逻辑分组,需要独立的DNS发现和网络标识,同时共享同一个Cassandra集群。

1. 为每个数据中心创建Headless Service

每个DC的节点需要专属的Headless Service提供稳定DNS解析,确保同DC节点互相发现,跨DC节点也能通过Service域名访问。

DC1的Service示例(dc1-cassandra-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: dc1-cassandra
  labels:
    app: cassandra
    dc: dc1
spec:
  clusterIP: None
  ports:
    - port: 7000
      name: intra-node
    - port: 7001
      name: tls-intra-node
    - port: 9042
      name: cql
  selector:
    app: cassandra
    dc: dc1

DC2的Service示例(dc2-cassandra-service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: dc2-cassandra
  labels:
    app: cassandra
    dc: dc2
spec:
  clusterIP: None
  ports:
    - port: 7000
      name: intra-node
    - port: 7001
      name: tls-intra-node
    - port: 9042
      name: cql
  selector:
    app: cassandra
    dc: dc2

2. 为每个数据中心创建StatefulSet

每个DC的StatefulSet需配置专属的CASSANDRA_DC、CASSANDRA_RACK环境变量,同时正确设置种子节点(Seed)实现跨DC集群加入。

DC1的StatefulSet示例(dc1-cassandra-statefulset.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dc1-cassandra
  labels:
    app: cassandra
    dc: dc1
spec:
  serviceName: dc1-cassandra
  replicas: 3
  selector:
    matchLabels:
      app: cassandra
      dc: dc1
  template:
    metadata:
      labels:
        app: cassandra
        dc: dc1
    spec:
      terminationGracePeriodSeconds: 1800
      containers:
        - name: cassandra
          image: cassandra:4.0
          ports:
            - containerPort: 7000
              name: intra-node
            - containerPort: 7001
              name: tls-intra-node
            - containerPort: 7002
              name: jmx
            - containerPort: 9042
              name: cql
          env:
            - name: CASSANDRA_SEEDS
              value: "dc1-cassandra-0.dc1-cassandra.default.svc.cluster.local"
            - name: CASSANDRA_DC
              value: "dc1"
            - name: CASSANDRA_RACK
              value: "rack1"
            - name: MAX_HEAP_SIZE
              value: "512M"
            - name: HEAP_NEWSIZE
              value: "100M"
          volumeMounts:
            - name: cassandra-data
              mountPath: /var/lib/cassandra
  volumeClaimTemplates:
    - metadata:
        name: cassandra-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi

DC2的StatefulSet示例(dc2-cassandra-statefulset.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dc2-cassandra
  labels:
    app: cassandra
    dc: dc2
spec:
  serviceName: dc2-cassandra
  replicas: 3
  selector:
    matchLabels:
      app: cassandra
      dc: dc2
  template:
    metadata:
      labels:
        app: cassandra
        dc: dc2
    spec:
      terminationGracePeriodSeconds: 1800
      containers:
        - name: cassandra
          image: cassandra:4.0
          ports:
            - containerPort: 7000
              name: intra-node
            - containerPort: 7001
              name: tls-intra-node
            - containerPort: 7002
              name: jmx
            - containerPort: 9042
              name: cql
          env:
            - name: CASSANDRA_SEEDS
              value: "dc1-cassandra-0.dc1-cassandra.default.svc.cluster.local,dc2-cassandra-0.dc2-cassandra.default.svc.cluster.local"
            - name: CASSANDRA_DC
              value: "dc2"
            - name: CASSANDRA_RACK
              value: "rack1"
            - name: MAX_HEAP_SIZE
              value: "512M"
            - name: HEAP_NEWSIZE
              value: "100M"
          volumeMounts:
            - name: cassandra-data
              mountPath: /var/lib/cassandra
  volumeClaimTemplates:
    - metadata:
        name: cassandra-data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi

3. 集群启动与验证

  1. 先启动DC1集群
    执行命令创建DC1的Service和StatefulSet:

    kubectl apply -f dc1-cassandra-service.yaml
    kubectl apply -f dc1-cassandra-statefulset.yaml
    

    等待3个节点全部就绪后,进入DC1第一个节点验证集群状态:

    kubectl exec -it dc1-cassandra-0 -- nodetool status
    

    输出应显示3个属于dc1的节点,状态为UN(Up/Normal)。

  2. 启动DC2集群
    执行命令创建DC2的Service和StatefulSet:

    kubectl apply -f dc2-cassandra-service.yaml
    kubectl apply -f dc2-cassandra-statefulset.yaml
    

    等待节点就绪后,再次执行nodetool status,应看到6个节点——3个属于dc1,3个属于dc2。

常见报错排查

  • 节点无法加入集群:检查CASSANDRA_SEEDS是否填写正确的DNS域名(格式为{statefulset-name}-0.{service-name}.{namespace}.svc.cluster.local);确认K8s集群内DNS解析正常,网络策略未阻止Cassandra端口(7000、7001、9042)的跨DC通信。
  • StatefulSet启动失败:检查环境变量是否正确,比如CASSANDRA_DC不能与其他DC重名;确认存储卷申请成功,Pod有足够CPU、内存资源。
  • 节点归属错误DC:核对每个StatefulSet的CASSANDRA_DC环境变量,确保与DC标识一致。

内容的提问来源于stack exchange,提问作者Tushya Gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:02:01