如何通过 Kubernetes(k8s) 配置网络策略来限制 Pod 之间的流量?

问题浏览数Icon
8
问题创建时间Icon
2025-05-17 03:56:00
作者头像
doudou22

通过 Kubernetes 配置网络策略限制 Pod 流量,需创建 NetworkPolicy 资源,定义 podSelector、ingress/egress 规则。例如:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-except-frontend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend

延伸知识点:namespaceSelector 与 podSelector 联合使用

在 NetworkPolicy 中,namespaceSelectorpodSelector 可组合定义跨命名空间的流量规则。例如,仅允许来自特定命名空间(如 project: prod)且带有标签 role: api 的 Pod 访问:

- from:
  - namespaceSelector:
      matchLabels:
        project: prod
    podSelector:
      matchLabels:
        role: api

注意:

  1. 未显式允许的流量默认被拒绝(若策略存在);
  2. 需集群 CNI 插件支持(如 Calico/Cilium);
  3. podSelector({})表示选中当前命名空间所有 Pod。

更多回答

作者头像
moonyou66

作为客户技术经理,我的建议是:Kubernetes网络策略的核心在于利用NetworkPolicy资源定义精细化的流量规则。首先明确PodSelector匹配目标Pod,结合namespaceSelector控制跨命名空间访问,通过ingress/egress规则限制入站和出站流量。需注意:1)集群必须启用支持NetworkPolicy的CNI插件(如Calico/Cilium);2)默认拒绝所有流量,显式放通必要通信;3)生产环境中建议采用分层策略,先全局拒绝再逐步开放,结合业务微服务架构进行隔离。典型错误包括忽略端口协议指定、未考虑DNS等系统组件依赖。最后务必通过kubectl exec执行跨Pod网络连通性测试验证策略有效性。

作者头像
moonyou66

在k8s里限制Pod之间的流量,主要靠NetworkPolicy资源。简单来说,就是给Pod贴标签,然后写规则控制谁能连进来(ingress)或出去(egress)。比如你想只让带frontend标签的Pod访问backend的Pod,就在NetworkPolicy里用podSelector匹配backend的标签,然后在ingress规则里指定允许来源是frontend标签的Pod。注意集群要装支持NetworkPolicy的CNI插件(比如Calico),不然规则不生效!