NetworkPolicy
约 617 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › K8s › 网络与服务(在新窗口打开) › NetworkPolicy
什么是 NetworkPolicy
NetworkPolicy 是 K8s 中用于控制 Pod 之间网络通信的防火墙规则,基于标签选择器定义哪些 Pod 可以访问目标 Pod。
前提:需要 CNI 插件支持 NetworkPolicy(Calico、Cilium、Weave Net 等)。Flannel 不支持。
默认规则
# 没有 NetworkPolicy 时,所有 Pod 之间允许通信(全通)
# 一旦某个 Namespace 中存在任意 NetworkPolicy,默认变为拒绝# 默认拒绝所有入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {} # 匹配所有 Pod
policyTypes:
- IngressIngress 规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-policy
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector: # 允许带有 app=web 标签的 Pod 访问
matchLabels:
app: web
- namespaceSelector: # 允许 monitoring Namespace 下的所有 Pod
matchLabels:
name: monitoring
ports:
- port: 8080Egress 规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-egress
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Egress
egress:
- to:
- podSelector: # 仅允许访问 app=db 的 Pod
matchLabels:
app: db
ports:
- port: 3306
- to: # 允许访问集群 DNS(否则 DNS 解析会失败)
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP完整示例:三层隔离
# 仅允许 Web 访问 API,API 访问 DB
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: web-to-api
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-to-db
spec:
podSelector:
matchLabels:
app: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: api
ports:
- port: 3306
---
# 默认拒绝所有入站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress策略选择器总览
ingress:
- from:
- podSelector: # 同一 Namespace 的 Pod
matchLabels:
app: web
- namespaceSelector: # 指定 Namespace 的所有 Pod
matchLabels:
name: prod
- namespaceSelector: # 指定 Namespace + 指定 Pod 标签
matchLabels:
name: prod
podSelector:
matchLabels:
app: web
- ipBlock: # 外部 IP 范围
cidr: 192.168.0.0/16
except:
- 192.168.1.0/24注意事项
- NetworkPolicy 是允许列表(白名单),需要显式声明允许的流量。
- 多个 NetworkPolicy 是 OR 关系——满足任一规则即可通过。
podSelector: {}匹配该 Namespace 下所有 Pod。- Egress 规则中务必留出 DNS 放行(端口 53 UDP),否则 Pod 无法解析服务名。
- 修改 NetworkPolicy 后立即生效,无需重启 Pod。
小结
- NetworkPolicy 基于标签选择器控制 Pod 间网络流量,是"白名单"模型。
- 默认没有策略时全通;存在任意策略后,未明确的流量被拒绝。
- Ingress 规则控制入站,Egress 规则控制出站。
podSelector/namespaceSelector/ipBlock三种来源选择器。- 需要 CNI 插件支持(Calico / Cilium),Flannel 不支持。
上一节:Ingress 与 DNS 下一节:ConfigMap 与 Secret
