GKE集群NetworkPolicy配置后外部IP流量限制不生效问题
问题根因分析
- 网络策略的podSelector配置错误
你当前配置的podSelector要求匹配同时带有app: hello和namespace: default两个标签的Pod,但默认情况下Pod不会自动携带namespace: default标签,该配置会导致这条网络策略匹配不到任何Pod,完全不生效,所以hello Pod不受任何规则约束,所有流量都可以正常通行。
- 网络策略的podSelector配置错误
- GKE集群未启用网络策略功能
GKE集群默认不会开启网络策略能力,未开启的情况下即使配置了NetworkPolicy资源也不会生效,集群不会对流量做任何限制。
- GKE集群未启用网络策略功能
- LoadBalancer Service默认SNAT导致源IP不匹配
你使用的LoadBalancer类型Service默认会做源地址转换,外部Windows服务器的流量到达Pod时源IP会被替换为负载均衡组件的IP,而非Windows服务器的真实IP,即使网络策略生效,你配置的ipBlock规则也无法匹配到转换后的源IP。
- LoadBalancer Service默认SNAT导致源IP不匹配
- 存量TCP会话未断开
网络策略不会主动断开已经建立的TCP连接,如果你修改规则前已经建立了Windows到Pod的连接,该连接会被conntrack规则继续放行,只有新建立的连接才会受新规则约束。
- 存量TCP会话未断开
修复步骤
- 修正podSelector配置
删除podSelector中无效的namespace: default匹配项,修正后的配置如下:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: hello-network-policy namespace: default spec: podSelector: matchLabels: app: hello policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 10.2.0.6/32 # 改为Windows虚拟机真实IP egress: - to: - ipBlock: cidr: 10.7.0.3/32 ports: - port: 5432 - to: - ipBlock: cidr: 10.2.0.6/32 - to: - namespaceSelector: matchLabels: name: kube-system ports: - port: 53 protocol: UDP - to: - podSelector: matchLabels: app: activemq - to: - podSelector: matchLabels: app: rabbitmq
- 确认GKE集群启用网络策略
执行命令检查集群网络策略启用状态:gcloud container clusters describe <集群名称> --zone <集群所在区域> | grep -A2 networkPolicy
如果返回enabled: false,需要先开启集群网络策略能力,开启操作会触发节点滚动重启。 - 配置LoadBalancer保留客户端真实源IP
在hello应用的LoadBalancer Service配置中添加externalTrafficPolicy: Local字段,避免SNAT导致源IP被替换,确保Ingress规则的ipBlock可以匹配到Windows服务器的真实IP。 - 验证规则生效
执行kubectl describe networkpolicy hello-network-policy,检查输出中Selected Pods字段的计数是否和hello Pod的实际数量一致,确认规则已经成功绑定到目标Pod。 - 测试时断开存量连接
修改规则后重启hello Pod,清空存量TCP会话后再进行连通性测试,此时修改错误的CIDR后对应流量就会被正常拒绝。
内容的提问来源于stack exchange,提问作者ragz24
相关产品推荐
相关产品推荐

