默认拒绝是什么
NetworkPolicy 采用白名单语义:某个 Pod 一旦被任何策略选中,未被放行的方向就全部拒绝。默认拒绝策略的做法是先建一条 podSelector 为空、policyTypes 同时包含 Ingress 与 Egress 的策略,把命名空间内所有 Pod 的两个方向都关掉,再按业务依赖逐条放行。它是零信任的起点,能把「谁会访问我、我会访问谁」显式描述出来,代价是必须先把依赖梳理清楚。
默认拒绝(入向+出向)
默认拒绝(入向+出向)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: prod
spec:
podSelector: {} # 空选择器 = 选中本命名空间所有 Pod
policyTypes: ['Ingress', 'Egress'] # 两个方向都不放行任何流量随后立刻放行 DNS
随后立刻放行 DNS
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: prod
spec:
podSelector: {}
policyTypes: ['Egress']
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- {protocol: UDP, port: 53}
- {protocol: TCP, port: 53}典型使用场景
- 合规与等保要求:需要证明命名空间之间、Pod 之间默认不可互访,只开放必要路径
- 多租户集群:每个业务命名空间独立设置默认拒绝,避免误连到别人的数据库
- 遏制横向移动:Pod 被入侵后无法扫描并连接同集群其他服务,缩小爆炸半径
- 依赖梳理工具:先上默认拒绝再按告警逐条放行,能倒逼团队盘清真实调用关系
- 与 Ingress/Egress 网关模式配合:只放行到网关,东西向流量统一受控
上线前的验证动作
上线前的验证动作
kubectl get networkpolicy -A # 确认策略已覆盖目标命名空间
kubectl exec -it web-x -n prod -- nslookup kubernetes.default # DNS 是否被放行
kubectl exec -it web-x -n prod -- nc -zv db 5432 # 业务端口是否可达
kubectl exec -it web-x -n prod -- nc -zv 10.0.0.5 443 -w 3 # 出向到外部地址是否被拦
kubectl describe networkpolicy default-deny-all -n prod # 复核选择器与方向生效与不生效的边界
| 条件 | 结果 | 说明 |
|---|---|---|
| CNI 支持 NetworkPolicy | 策略生效 | Calico、Cilium、Antrea 等支持,Flannel 默认不支持 |
| CNI 不支持 | 策略被接受但不生效 | 对象能创建成功,流量不受任何影响,极易误判为已加固 |
| Pod 被任一策略选中 | 该方向默认拒绝 | 同一命名空间里多条策略取并集放行 |
| Pod 未被任何策略选中 | 该方向放开 | 所以默认拒绝必须覆盖全部 Pod |
启用默认拒绝后,出向的 DNS 查询同样会被拒绝。放行规则必须与主策略一同上线,否则整个命名空间的域名解析与对外调用会立刻失败,故障表现像是「网络全挂」,实际根因是策略缺一条 53 端口放行。
策略里不写 ports 表示对所选来源或目的放开全部端口,安全基线应逐项收窄到具体协议与端口;同时记得把监控、日志采集、镜像仓库、外部 API 等出向依赖一起梳理进去。