GKE Autopilot集群跨Namespace访问K8s服务时连接被拒绝
以下是针对你遇到的问题的具体排查步骤:
检查Pod B的网络策略(NetworkPolicy)
GKE Autopilot集群中如果配置了NetworkPolicy,可能会限制跨Namespace的流量访问。执行以下命令查看Namespace B中的网络策略:kubectl get networkpolicy -n <namespace-b> kubectl describe networkpolicy <policy-name> -n <namespace-b>确认是否存在Ingress规则阻止了来自Namespace A的流量,或者规则仅允许特定来源(如特定Namespace标签、Pod标签)的访问。如果有此类限制,需要调整NetworkPolicy以允许Namespace A的Pod访问。
验证Pod B的服务监听配置
port-forward能正常访问说明Pod内的服务本身可用,但可能服务仅监听127.0.0.1而非0.0.0.0,导致集群内其他Pod无法访问。进入Pod B执行命令检查监听地址:kubectl exec -n <namespace-b> <pod-b-name> -- ss -tulpn查看目标端口的监听地址,如果显示
127.0.0.1:<port>,需要修改服务配置使其监听0.0.0.0,这样集群内其他Pod才能通过Pod IP访问。检查VPC防火墙规则
GKE Autopilot使用VPC-native网络,确认VPC中是否有防火墙规则阻止了Pod CIDR之间的流量。检查是否存在允许集群Pod CIDR段之间TCP流量到目标端口的规则:- 查看集群的Pod CIDR:
gcloud container clusters describe <cluster-name> --zone <zone> | grep podCidr - 检查VPC防火墙规则,确认是否有允许
pod-cidr到pod-cidr的TCP流量(目标端口为Pod B的服务端口)的规则。如果没有,需要添加相应的防火墙规则。
- 查看集群的Pod CIDR:
确认Pod B的容器端口与Service配置匹配
虽然你已经能解析到Service IP并获取到Endpoint,但仍需确认:- Service B的
targetPort是否与Pod B的containerPort一致 - Service的selector是否正确匹配Pod B的标签
执行命令验证:
kubectl describe service <service-b> -n <namespace-b> kubectl get pods -n <namespace-b> --show-labels- Service B的
检查Pod的安全上下文与内部网络规则
部分容器可能通过iptables或其他工具限制了入站流量,进入Pod B查看iptables规则:kubectl exec -n <namespace-b> <pod-b-name> -- iptables -L -n确认是否有规则阻止了来自Namespace A Pod IP段的流量。
内容的提问来源于stack exchange,提问作者testing09

