通过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
相关产品推荐
相关产品推荐

