如何拒绝Kubernetes其他命名空间流量?配置异常求助
问题分析与修复方案
初始配置的错误
你第一次创建的NetworkPolicy完全没有起到限制跨namespace流量的作用:
ingress: - {}
这个配置的含义是允许所有来源的入流量,不管请求来自哪个namespace,所以跨namespace能访问是预期结果,这个规则等于没加限制。
修改后配置的问题
你添加namespaceSelector后同namespace访问失败,主要有两个原因:
- 标签匹配可能失效:
Kubernetes命名空间默认没有name标签,如果你手动执行kubectl label ns policy-demo1 name=policy-demo1时出现拼写错误,或者标签没正确添加,会导致规则无法匹配同namespace的Pod。更稳妥的方式是使用Kubernetes内置标签kubernetes.io/metadata.name,无需手动添加标签。 - ICMP流量未被允许:
Kubernetes原生NetworkPolicy仅管控TCP/UDP流量,ping依赖的ICMP不在其管控范围内。Calico虽然支持ICMP规则,但你的配置里没有明确允许ICMP,所以ping会失败;如果标签匹配错误,连TCP的wget也会被拦截。
正确的配置方案
1. (可选)给命名空间添加自定义标签(或直接用内置标签)
如果想用自定义标签,执行:
kubectl label ns policy-demo1 ns-name=policy-demo1 kubectl label ns policy-demo2 ns-name=policy-demo2
2. 应用正确的NetworkPolicy(以policy-demo1为例)
这个规则会仅允许同namespace内的Pod访问当前namespace的所有Pod,同时支持TCP/UDP和ICMP(ping):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-same-namespace-only namespace: policy-demo1 spec: podSelector: {} # 匹配当前namespace下所有Pod policyTypes: - Ingress ingress: # 允许同namespace的TCP/UDP流量 - from: - namespaceSelector: matchLabels: # 用内置标签的话,替换成 kubernetes.io/metadata.name: policy-demo1 ns-name: policy-demo1 podSelector: {} # 匹配该namespace下的所有Pod # 允许同namespace的ICMP流量(用于ping) - ports: - protocol: ICMP from: - namespaceSelector: matchLabels: ns-name: policy-demo1 podSelector: {}
将上述配置中的ns-name替换为kubernetes.io/metadata.name可以省去手动打标签的步骤。
3. 对policy-demo2执行相同操作
复制上述配置,修改metadata.namespace为policy-demo2,并调整标签匹配规则(如果用自定义标签,改为ns-name: policy-demo2;用内置标签则改为kubernetes.io/metadata.name: policy-demo2)。
测试验证
- 同namespace测试:在policy-demo1的busybox中执行
wget -q --timeout=5 nginx:80 -O -和ping <nginx-pod-ip>,应该正常连通。 - 跨namespace测试:在policy-demo2的busybox中访问policy-demo1的nginx,应该超时或连接失败。
内容的提问来源于stack exchange,提问作者marOne
相关产品推荐
相关产品推荐

