如何允许/拒绝同集群内其他Namespace的HTTP请求?附场景示例
如何管控Kubernetes跨Namespace的Pod访问
嘿,这个问题其实是Kubernetes网络策略(NetworkPolicy)的典型应用场景——默认情况下K8s的网络是全开放的,Namespace只是做资源隔离,不会限制网络流量,所以你遇到跨Namespace能访问是正常的。下面我给你一步步实现你的两个需求:
1. 让ns1的Pod接受任意Namespace的请求
其实默认状态下ns1的Pod就允许所有来源的请求,但如果你的集群之前有过全局限制策略,或者你想明确声明这个规则,可以创建一个NetworkPolicy来兜底:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-ingress-ns1-app namespace: ns1 spec: # 匹配ns1里你的应用Pod(替换成实际的Pod标签) podSelector: matchLabels: app: my-deployment-app policyTypes: - Ingress ingress: # 空的from数组表示允许所有来源,包括其他Namespace、集群外流量 - from: []
把这个yaml保存后用kubectl apply -f <文件名>创建,这样ns1里的目标Pod就会接受任何来源的请求了。
2. 让ns2的Pod拒绝所有来自其他Namespace的请求
这个需要创建一个只允许同Namespace内流量的NetworkPolicy,自动拒绝外部Namespace的访问:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-cross-namespace-ns2-app namespace: ns2 spec: # 匹配ns2里你的应用Pod(替换成实际的Pod标签) podSelector: matchLabels: app: my-deployment-app policyTypes: - Ingress ingress: # 只允许来自当前Namespace内的所有Pod访问 - from: - podSelector: {}
同样用kubectl apply -f <文件名>创建,之后ns2的Pod就只能接受来自ns2内部的请求,其他Namespace的Pod再尝试访问就会被拒绝。
关键注意事项
- 你的集群必须使用支持NetworkPolicy的网络插件,比如Calico、Cilium、Weave Net等。如果用的是默认的Flannel(无额外配置)或者kube-proxy单独部署,NetworkPolicy是不会生效的。
- 一定要确保
podSelector里的标签和你Deployment定义的Pod标签完全匹配,否则策略不会作用到目标Pod上。 - 如果之后需要微调规则(比如允许某个特定Namespace访问ns2的Pod),可以在
from里添加namespaceSelector来指定允许的Namespace,比如:from: - podSelector: {} - namespaceSelector: matchLabels: kubernetes.io/metadata.name: allowed-namespace
你可以在部署完策略后,分别在ns2的Pod里curl ns1的Service,以及在其他Namespace(比如新建一个ns3)的Pod里curl ns2的Service,验证是否符合预期。
内容的提问来源于stack exchange,提问作者znat
相关产品推荐
相关产品推荐

