kubernetes networkpolicy 核心是定义入站和出站白名单规则,仅允许显式声明的流量,依赖支持的cni插件(如calico、cilium),最小配置需包含apiversion、podselector、policytypes及ingress/egress规则块。

Kubernetes 中配置 NetworkPolicy 的核心是定义明确的入站(Ingress)和出站(Egress)白名单规则,它不提供“拒绝”语义,只允许显式声明的流量。策略生效的前提是集群已部署支持 NetworkPolicy 的 CNI 插件(如 Calico、Cilium 或 Weave),Flannel 默认不支持。
必须先确认网络插件支持
不是所有网络插件都原生支持 NetworkPolicy。例如:
- Calico、Cilium、Weave、Kube-router → 原生支持,开箱即用
- Flannel → 不支持,需额外集成或更换插件
- 在云厂商集群(如 TKE、CCE、AKS)中,需确认是否已启用 DataPlane V2 或 NetworkPolicy 扩展组件
基础配置结构要写全
一个最小可用的 NetworkPolicy 至少包含四部分:
-
apiVersion:固定为
networking.k8s.io/v1(Kubernetes 1.19+ 推荐;旧版本可能用extensions/v1beta1,已弃用) -
podSelector:指定策略作用的目标 Pod。空 selector
{}表示匹配命名空间内所有 Pod -
policyTypes:必须显式声明
Ingress、Egress或两者。仅定义ingress字段但未声明policyTypes,默认只启用 Ingress -
ingress/egress 规则块:每个规则由
from(入站源)或to(出站目标) +ports(可选端口限制)组成
常用规则组合方式
NetworkPolicy 支持按三种维度放行流量,可单独或组合使用:
-
podSelector:匹配同命名空间内带指定标签的 Pod,例如
role: frontend -
namespaceSelector:匹配带标签的命名空间,例如
project: prod;常与podSelector嵌套使用以精确控制跨命名空间访问 -
ipBlock:指定 CIDR 网段(如
10.244.0.0/16),注意ipBlock在 Ingress 中可用于限制来源 IP,在 Egress 中可用于限制目标地址;except字段可排除子网
典型场景配置示例
-
禁止所有入站流量(默认拒绝):
spec: podSelector: {} policyTypes: ["Ingress"] -
只允许 frontend Pod 访问 db Pod 的 5432 端口:
spec: podSelector: matchLabels: role: db policyTypes: ["Ingress"] ingress: - from: - namespaceSelector: matchLabels: project: default podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 5432 -
允许 Pod 访问 kube-system 命名空间中的 DNS(UDP 53):
spec: podSelector: {matchLabels: app: backend} policyTypes: ["Egress"] egress: - to: - namespaceSelector: matchLabels: name: kube-system ports: - protocol: UDP port: 53
不复杂但容易忽略











