如何用Kubernetes Network Policies实现命名空间间一对一Pod流量管控?
实现跨命名空间流量限制的Kubernetes Network Policy方案
前置准备:给Pod打标签
先给两个命名空间的Pod打上对应标签,区分允许跨命名空间访问的目标Pod和其他受限Pod:
- 在
namespace1中:- 给允许被namespace2访问的目标Pod打标签:
kubectl label pods <目标Pod名称> pod-type=allowed-cross-ns-target -n namespace1 - 给
namespace1中其余所有Pod打标签:kubectl label pods -l '!pod-type=allowed-cross-ns-target' pod-type=restricted-cross-ns -n namespace1
- 给允许被namespace2访问的目标Pod打标签:
- 在
namespace2中:- 给允许被namespace1访问的目标Pod打标签:
kubectl label pods <目标Pod名称> pod-type=allowed-cross-ns-target -n namespace2 - 给
namespace2中其余所有Pod打标签:kubectl label pods -l '!pod-type=allowed-cross-ns-target' pod-type=restricted-cross-ns -n namespace2
- 给允许被namespace1访问的目标Pod打标签:
步骤1:限制namespace1到namespace2的流量仅能访问目标Pod
在namespace2中创建Network Policy,拒绝来自namespace1的所有流量访问受限Pod(非目标Pod):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: restrict-ns1-traffic-to-ns2-restricted-pods namespace: namespace2 spec: podSelector: matchLabels: pod-type: restricted-cross-ns policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace1 action: Deny
步骤2:限制namespace2到namespace1的流量仅能访问目标Pod
在namespace1中创建Network Policy,拒绝来自namespace2的所有流量访问受限Pod(非目标Pod):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: restrict-ns2-traffic-to-ns1-restricted-pods namespace: namespace1 spec: podSelector: matchLabels: pod-type: restricted-cross-ns policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace2 action: Deny
低版本Kubernetes兼容方案(低于1.29)
如果你的Kubernetes版本不支持action: Deny语法,需要改用默认拒绝+允许目标Pod的组合策略:
在namespace2中配置
- 默认拒绝所有Pod接收来自namespace1的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-ns1-traffic namespace: namespace2 spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace1 action: Deny
- 允许目标Pod接收来自namespace1的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ns1-traffic-to-target-pod namespace: namespace2 spec: podSelector: matchLabels: pod-type: allowed-cross-ns-target policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace1
在namespace1中配置
- 默认拒绝所有Pod接收来自namespace2的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-ns2-traffic namespace: namespace1 spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace2 action: Deny
- 允许目标Pod接收来自namespace2的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ns2-traffic-to-target-pod namespace: namespace1 spec: podSelector: matchLabels: pod-type: allowed-cross-ns-target policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace2
方案说明
- 上述策略仅针对来自对方命名空间的流量做限制,其他命名空间的进出流量不受影响(无匹配规则时,保持Kubernetes默认的全允许状态)。
- 目标Pod未被受限标签匹配,因此可以正常接收来自对方命名空间的流量。
内容的提问来源于stack exchange,提问作者Win32Sector
相关产品推荐
相关产品推荐

