要限制Pod仅接受特定命名空间访问,需先为源命名空间打标签(如kubectl label namespace staging project=staging),再通过NetworkPolicy的namespaceSelector匹配该标签,并指定podSelector和ingress规则;未打标则策略失效。

在Kubernetes中,要让某个Pod只接受来自特定命名空间的访问请求,不能靠Pod自身配置实现,必须通过NetworkPolicy定义入站(Ingress)规则,并精确匹配源命名空间的标签。默认所有Pod互通,不设策略等于完全开放。
确认目标命名空间已打标签
NetworkPolicy通过namespaceSelector匹配源命名空间,但前提是该命名空间带有可识别的标签。若未打标,策略将无法生效。
执行:kubectl label namespace staging project=staging
【必须提前完成】若跳过此步,后续NetworkPolicy中namespaceSelector.matchLabels将永远匹配不到任何命名空间,导致该策略形同虚设。
编写NetworkPolicy限制入站流量
创建allow-from-staging.yaml文件,内容如下:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-db-from-staging namespace: defaultspec: podSelector: matchLabels: app: postgres policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: project: staging ports: - protocol: TCP port: 5432
注意:namespace: default表示这条策略作用于default命名空间下所有带app: postgres标签的Pod;from.namespaceSelector只放行project=staging这个标签的命名空间发起的连接。
应用策略并验证效果
运行kubectl apply -f allow-from-staging.yaml提交策略。
立即测试:从staging命名空间的Pod中执行telnet postgres.default.svc.cluster.local 5432,应能连通。
再从production命名空间的Pod中执行相同命令,连接将超时或被拒绝——这说明限制已生效。
NetworkPolicy是“白名单”机制,未显式允许的流量一律阻断。不需要额外配置“默认拒绝”,只要策略存在且正确匹配,其他所有命名空间的访问自然失效。

















