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

通过LoadBalancer暴露K8ssandra后触发AllNodesFailedException异常

解决K8ssandra在EKS中外部连接Cassandra 9042端口超时问题

核心原因分析

问题本质是Cassandra节点返回给驱动的内部集群地址无法被外部客户端访问:虽然LoadBalancer能转发9042端口的连接请求,但Cassandra默认会将Pod内部IP作为broadcast_rpc_address返回给DataStax驱动,驱动后续尝试连接这个内部IP时,因外部网络无法访问而超时。telnet能通仅验证了LB到节点的连接建立,但Cassandra协议初始化需要节点返回正确的可访问地址。

解决方案步骤

1. 用K8ssandra官方外部访问配置替代手动LoadBalancer

K8ssandra提供原生externalAccess配置,自动处理Cassandra地址广播和Service映射,无需手动创建Service:

apiVersion: cassandra.datastax.com/v1beta1
kind: CassandraDatacenter
metadata:
  name: us-east-1
  namespace: databases
spec:
  clusterName: k8ssandra
  # 保留现有其他配置(如racks、storage等)
  externalAccess:
    enabled: true
    loadBalancer:
      enabled: true
      # 可选:添加AWS LB注解,指定外部LB类型
      serviceAnnotations:
        service.beta.kubernetes.io/aws-load-balancer-type: "external"
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"

应用配置后,Operator会自动创建k8ssandra-us-east-1-external-service LoadBalancer,并将Cassandra节点的broadcast_address和broadcast_rpc_address设置为LB外部地址。

2. 验证Cassandra节点地址配置

进入任意Cassandra Pod执行命令,确认广播地址为LB外部地址:

# 查看节点状态,确认Broadcast Address是LB地址
nodetool status

# 查询系统表中的RPC地址
cqlsh -e "SELECT rpc_address, broadcast_rpc_address FROM system.local;"

3. 调整DataStax驱动连接配置

确保驱动SessionBuilder配置正确:

CqlSession session = CqlSession.builder()
        .addContactPoint(new InetSocketAddress("你的LB域名", 9042))
        .withLocalDatacenter("us-east-1") // 必须和CassandraDatacenter的name一致
        .build();

4. 检查安全组规则

  • 确认EKS节点安全组允许LoadBalancer IP段访问9042端口
  • 确认LoadBalancer安全组允许客户端IP段访问9042端口
  • 确保双向流量均被允许(Cassandra节点需要向驱动返回数据)

5. 清理手动创建的Service

删除之前手动创建的k8ssandra-lb Service,避免端口冲突:

kubectl delete service k8ssandra-lb -n databases

内容的提问来源于stack exchange,提问作者Md Ashraful Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:05:22