OpenShift集群内Pod无法访问LoadBalancer公网IP问题求助
问题描述
在OpenShift集群上通过Helm Chart部署K8ssandra后,创建了以下LoadBalancer类型的Service以暴露服务(公网IP自动生成):
kind: Service metadata: name: k8ssandra-service-lb-svc namespace: k8ssandra-test spec: ports: - protocol: TCP port: 9042 selector: cassandra.datastax.com/cluster: k8ssandra cassandra.datastax.com/datacenter: dc1 type: LoadBalancer loadBalancerIP:
但同命名空间内的Pod访问该LoadBalancer的公网IP时出现连接超时错误:
cassandra@k8ssandra-dc1-default-sts-0:/$ curl 52.120.130.219:9042 curl: (28) Failed to connect to 52.120.130.219 port 9042: Connection timed out
同一VPC内的VSI可以正常访问该IP,需求是实现集群内Pod和外部网络都能访问该LoadBalancer IP。
解决方案
1. 开启OpenShift LoadBalancer内部回环功能
OpenShift默认可能禁用集群内Pod访问LoadBalancer公网IP的回环机制,需检查并开启:
- 查看当前IngressController配置:
oc get ingresscontroller default -n openshift-ingress-operator -o yaml - 若
spec.endpointPublishingStrategy.loadBalancer.allowInternal为false或未配置,执行补丁开启:oc patch ingresscontroller default -n openshift-ingress-operator --type=merge -p '{"spec":{"endpointPublishingStrategy":{"loadBalancer":{"allowInternal":true}}}}'
2. 调整Service外部流量策略
修改Service的externalTrafficPolicy为Local,避免SNAT导致的回环问题,确保流量直接转发到本地节点的Pod:
kind: Service metadata: name: k8ssandra-service-lb-svc namespace: k8ssandra-test spec: ports: - protocol: TCP port: 9042 selector: cassandra.datastax.com/cluster: k8ssandra cassandra.datastax.com/datacenter: dc1 type: LoadBalancer externalTrafficPolicy: Local loadBalancerIP:
应用修改:
oc apply -f service.yml
3. 检查安全组/防火墙规则
确认云平台中LoadBalancer对应的安全组,允许来自集群Pod CIDR的流量访问9042端口:
- 获取集群Pod CIDR范围:
oc get networks.config.openshift.io cluster -o jsonpath='{.spec.clusterNetwork[0].cidr}' - 在云控制台为LoadBalancer安全组添加入站规则,放行上述Pod CIDR对9042端口的访问。
4. 内部访问备选方案
若暂时无法调整LoadBalancer配置,集群内Pod可直接通过Service名称访问服务,无需使用公网IP:
curl k8ssandra-service-lb-svc.k8ssandra-test.svc.cluster.local:9042
该方式走集群内部DNS和Service转发,稳定性更高,适合内部Pod间通信。
内容的提问来源于stack exchange,提问作者Priya Rani
相关产品推荐
相关产品推荐

