结论:K8s 默认全通——任何 Pod 可与任何 Pod/外部地址通信。NetworkPolicy 是白名单机制:一旦某 Pod 被任一策略选中(podSelector 匹配),其入站(ingress)或出站(egress)流量立即变为"默认拒绝,仅放行规则允许的";未被选中的 Pod 不受影响。策略本身只是声明,执行依赖支持 NetworkPolicy 的 CNI 插件(Calico、Cilium 等,flannel 不支持)。

展开:规则三要素:作用对象(podSelector)、方向(ingress/egress)、允许的来源/目标(podSelector / namespaceSelector / ipBlock 三者可组合,+端口)。语义陷阱:1)同一规则数组元素间是"与"(如 podSelector + port 同时满足),不同元素间是"或"——一个 - from: 列表项写错就变成放行全网段;2)ingress 和 egress 独立判定,选中入站不影响出站;3)策略是叠加放行,没有任何一条策略能"拒绝"——只能不选或不放行。落地实践:先上"default-deny-all"打底,再逐应用加白名单;DNS(kube-dns 53 端口 TCP/UDP)是最常被忘放行导致全集群解析失败的一条。易错点:换了不支持的 CNI 策略静默失效——创建 NetworkPolicy 后集群"看起来更安全"但什么都没拦。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: { name: default-deny }
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]

追问方向:Cilium 基于 eBPF 的七层策略(L7 HTTP 方法级)、mTLS 与 NetworkPolicy 的层次关系(服务网格不替代网络层隔离)。