NetworkPolicy:Pod 网络访问控制¶
NetworkPolicy 是 Kubernetes 的三/四层网络访问策略 API,用 Pod/Namespace Label 描述允许的入站和出站流量。策略是否真正生效取决于 CNI 插件是否支持 NetworkPolicy。
默认行为¶
没有任何 NetworkPolicy 选择某个 Pod 时,该 Pod 默认允许所有入站和出站。创建选择该 Pod 的 Ingress/Egress 策略后,对应方向变为“默认拒绝,显式允许”。多个策略的允许规则取并集,不按顺序执行。
Namespace 默认拒绝¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: order
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
启用默认拒绝前,必须先设计 DNS、监控、日志、镜像/依赖访问和必要业务调用,否则会一次性切断全部流量。
允许同 Namespace 访问应用¶
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-order-api
namespace: order
spec:
podSelector:
matchLabels:
app: order-api
policyTypes: [Ingress]
ingress:
- from:
- podSelector:
matchLabels:
app: order-web
ports:
- protocol: TCP
port: 8080
允许跨 Namespace¶
from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
podSelector:
matchLabels:
app.kubernetes.io/component: controller
同一个列表项中的 Namespace Selector 与 Pod Selector 表示同时满足;拆成两个列表项则表示“任一 Namespace 或任一 Pod”,范围会大很多。审核 YAML 缩进和逻辑非常重要。
允许 DNS 出站¶
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
实际 CoreDNS Label 和 DNS 实现需按集群确认。还要为数据库、外部 API、NTP、代理等明确出站规则。
验证¶
kubectl get networkpolicy -A
kubectl describe networkpolicy -n order
kubectl get pods -n order --show-labels
使用源 Pod 到目标服务的真实协议和端口测试,并同时验证应允许与应拒绝的路径。NetworkPolicy 通常不是传统防火墙的有序规则表,也不自动提供域名级控制、七层 HTTP 路径控制或节点防火墙能力。
常见问题¶
| 现象 | 优先检查 |
|---|---|
| 策略完全不生效 | CNI 是否支持并启用 NetworkPolicy |
| 应用突然不能解析 DNS | Egress 默认拒绝后是否允许 CoreDNS UDP/TCP 53 |
| Ingress Controller 访问后端失败 | Controller Namespace/Pod Label 是否被允许 |
| 同一规则范围过大 | from 列表项、Namespace/Pod Selector 组合逻辑 |
| Pod 重建后策略失效 | 策略应按稳定 Label 选择,不能依赖 Pod IP |
官方参考:Network Policies。