GCP同VPC下K8s集群无法连接Redis VM问题排查求助
解决Kubernetes Pod无法连通同子网Redis VM的问题
看起来你遇到的是典型的跨网段Pod到VM的连通性问题——虽然K8s节点和Redis VM在同一个子网,但Pod用的是独立的集群内部网段,得从几个关键配置入手排查和修改:
1. 检查并配置VPC路由规则
你的Pod网段是10.12.0.0/14,Redis VM在10.128.0.0/20子网,VPC需要明确知道如何转发两个网段之间的流量:
- 登录GCP控制台或用
gcloud命令查看VPC路由表,确认是否存在目标为10.12.0.0/14的路由,下一跳指向K8s集群的节点实例组或节点IP。 - 如果没有这条路由,手动添加:
这条路由会告诉VPC:所有发往Pod网段的流量都转发到K8s节点,再由节点通过CNI插件转发给对应Pod。gcloud compute routes create k8s-pod-route \ --network=your-vpc-name \ --destination-range=10.12.0.0/14 \ --next-hop-instance-group=your-k8s-node-ig \ --next-hop-instance-group-zone=your-zone
2. 调整VPC防火墙规则
子网规则只覆盖VM的IP范围,Pod网段不在其中,所以需要单独创建双向流量允许规则:
- 创建允许
10.12.0.0/14(Pod网段)和10.128.0.0/20(子网)之间所有ICMP、TCP、UDP流量的规则:
注意gcloud compute firewall-rules create allow-pod-to-vm \ --network=your-vpc-name \ --allow=icmp,tcp,udp \ --source-ranges=10.12.0.0/14,10.128.0.0/20 \ --target-tags=k8s-node,redis-vmtarget-tags要对应你的K8s节点和Redis VM的实际标签,确保规则作用到正确实例上。
3. 检查Kubernetes节点的iptables规则
K8s的kube-proxy和CNI插件会在节点上添加iptables规则,可能误阻止了Pod到外部VM的流量:
- 登录任意K8s节点,执行
iptables-save | grep 10.128.0.0,查看是否存在拒绝该子网流量的规则。 - 如果发现DROP/REJECT规则,检查CNI配置(比如Calico的NetworkPolicy或自定义iptables规则),确保允许Pod访问
10.128.0.0/20网段。
4. 排查Kubernetes NetworkPolicy
如果集群启用了NetworkPolicy,可能默认拒绝了Pod的出站流量:
- 执行
kubectl get networkpolicy --all-namespaces,查看是否存在全局拒绝策略。 - 如果有流量限制,添加一条允许Pod访问目标子网的规则,示例:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-pod-to-redis-subnet namespace: your-namespace spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 10.128.0.0/20 ports: - protocol: TCP port: 6379 # 按需调整为你的Redis实际端口 - protocol: ICMP
5. 确认GKE集群网络模式(若使用GKE)
如果是GKE的非VPC-native模式(Pod用独立网段),确保ip-alias未被错误启用。执行gcloud container clusters describe your-cluster-name查看networkConfig字段,确认ipAlias为false(路由模式)。
按上述步骤逐一排查调整,应该就能解决Pod和Redis VM之间的连通问题了。
内容的提问来源于stack exchange,提问作者kozyr
相关产品推荐
相关产品推荐

