如何配置Cassandra监听7000端口、连接其他节点使用443端口?
核心问题
是否支持对Cassandra做如下配置:节点在7000端口监听内部节点连接请求,但主动连接其他Cassandra主机时使用443等其他端口?该配置逻辑与Elasticsearch的http.port、http.publish_port配置机制一致。
对应的实际业务场景:
- 已通过bitnami helm chart在OpenShift平台部署了一套Cassandra集群
- 计划在另一个独立OpenShift集群中部署另一套Cassandra环/数据中心
- 需要将两个不同OpenShift集群内的Cassandra环连通,组建跨集群架构
- 当前存在环境限制:必须使用OpenShift route将集群流量暴露至外部,而OpenShift route仅支持443端口,但443为特权端口,无法在docker/Cassandra中直接配置绑定使用
回答
首先直接给结论:Cassandra没有完全等价于Elasticsearch那套监听、发布端口分离的原生配置,但可以通过自带配置项加OpenShift层的端口映射实现你要的跨集群连通效果,完全不需要给容器提权绑定特权端口。
先讲下Cassandra原生的节点通信逻辑:
默认节点间通信用storage_port(默认7000,加密通信默认用7001),配置项里区分本地监听地址、广播给其他节点的地址,但原生没有单独的参数指定「主动连其他节点时用什么端口」——默认节点拿到其他节点广播的地址+端口后,会直接对这个目标地址端口发起连接,同集群内所有节点的通信端口默认保持一致。
针对你这个OpenShift跨集群的场景,按下面的步骤配置就能跑通:
- 同集群内通信保持默认配置
单个OpenShift集群内部的Cassandra节点全部保留默认7000端口做内部通信,不用改容器内监听配置,和你现在用bitnami helm chart部署的逻辑完全兼容,不会影响现有集群内部的通信。 - 调整跨集群通信的本地监听端口
如果你用的是Cassandra 4.0及以上版本,直接在cassandra.yaml里开启节点间TLS加密,把ssl_storage_port改成一个大于1024的非特权端口(比如17000),这个端口在容器内不需要root权限就能正常绑定,专门用来接收跨集群的节点连接。
如果你用的是3.x及更早版本,直接额外配置一个非特权端口(比如17000)做加密节点间通信的监听即可,不需要改原有7000端口的配置。 - OpenShift route层做端口映射
给每个需要跨集群访问的Cassandra节点创建passthrough类型的OpenShift route,对外统一监听443端口,后端直接转发到对应节点容器内的17000加密通信端口。注意不要用reencrypt类型的route,会打断Cassandra节点间的TLS证书校验,直接导致连接失败。Cassandra节点接收连接时不会校验请求来源端口,只要TLS证书校验通过、节点属于同一个集群,就会正常处理请求,所以route层的端口映射不会影响通信逻辑。 - 配置跨集群节点发现
把两个集群的种子节点(seed node)列表里,对端集群的节点地址全部填成对应的OpenShift route域名+443端口,格式为<route-domain>:443。同时把每个节点广播给其他节点的地址改成自身对应的OpenShift route域名,保证其他节点能正确回连。
这套配置的逻辑是:同集群内的节点还是走本地7000端口通信,不需要走route;跨集群访问时,节点主动连对端的route 443端口,流量被route转发到对端节点的17000端口,全程不涉及容器内绑定443特权端口的操作,完全符合OpenShift的安全限制,跨集群流量全程走TLS加密也符合传输安全要求。
如果是3.x版本不想改加密端口配置,也可以在节点宿主机上加iptables出口转发规则,把本地主动访问对端route 443端口的流量做正常放行,本地监听保持不变,只是配置维护成本比4.0+的原生配置稍高。
内容的提问来源于stack exchange,提问作者Fabry

