配置Network Policy阻止跨命名空间流量未生效,请求排查
Network Policy配置错误排查:无法阻止跨命名空间流量
问题场景
尝试通过Network Policy阻止prod命名空间接收来自其他命名空间的流量,但qa命名空间的curl-pod仍能成功访问prod内的web pod。
当前环境信息:
k get namespaces prod Active 39m qa Active 39m k get networkpolicies.networking.k8s.io -n prod NAME POD-SELECTOR AGE block-other-namespace <none> 25m k get -o wide pods --all-namespaces prod curl-pod 1/1 Running 0 47m 10.244.2.2 minikube-m03 prod web 1/1 Running 0 47m 10.244.1.3 minikube-m02 qa curl-pod 1/1 Running 0 47m 10.244.1.2 minikube-m02
当前使用的Network Policy配置:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: namespace: prod name: block-other-namespace spec: podSelector: {} ingress: - from: - podSelector: {}
测试结果(qa命名空间仍可访问prod):
kubectl -n qa exec curl-pod -- curl -I http://10.244.1.3 HTTP/1.1 200 OK Server: nginx/1.23.2 Date: Sun, 13 Nov 2022 08:34:35 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Wed, 19 Oct 2022 07:56:21 GMT Connection: keep-alive ETag: "634fada5-267" Accept-Ranges: bytes
配置错误分析
当前Network Policy的问题在于:
ingress.from.podSelector: {}仅表示允许当前命名空间内所有pod的入站流量,但并未对其他命名空间的流量做限制。- Kubernetes Network Policy采用白名单机制,默认策略是允许所有流量。仅添加内部pod的允许规则,不会自动拒绝外部命名空间的流量——必须明确限定来源范围,才能实现"阻止其他命名空间"的效果。
正确配置方案
方案1:仅允许当前命名空间的pod访问
通过namespaceSelector明确限定流量来源为prod命名空间:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: namespace: prod name: block-other-namespace spec: podSelector: {} ingress: - from: - podSelector: {} namespaceSelector: matchLabels: kubernetes.io/metadata.name: prod
方案2:直接拒绝所有外部命名空间流量
若无需区分内部pod,可直接限定仅接收来自prod命名空间的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: namespace: prod name: block-other-namespace spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: prod
注意:需确保集群已部署支持Network Policy的网络插件(如Calico、Cilium),默认kube-proxy不提供Network Policy enforcement能力。
验证配置
应用修正后的配置:
kubectl apply -f corrected-networkpolicy.yaml -n prod
再次从qa命名空间测试访问,应返回连接超时或拒绝错误,说明规则生效。
内容的提问来源于stack exchange,提问作者j4nus
相关产品推荐
相关产品推荐

