如何在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. 集群启动与验证
先启动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)。启动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
相关产品推荐
相关产品推荐

