NetworkPolicy需CNI插件支持(如Calico/Cilium),默认白名单机制;示例策略限制frontend访问api的80端口,或隔离命名空间、拒绝legacy-db所有入站流量。

直接配置 NetworkPolicy 就能限制 Pod 之间的网络访问,但前提是集群已启用支持该功能的 CNI 插件(比如 Calico、Cilium 或 Weave Net)。Flannel 默认不支持,不能直接用。策略本身是“白名单机制”——没明确允许的流量,默认全部拒绝。
确保底层网络插件支持
NetworkPolicy 不是 Kubernetes 自带的功能,它依赖 CNI 插件实现。必须先确认并安装兼容组件:
- 推荐使用 Calico:
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml - 也可选 Cilium(尤其适合 eBPF 场景)或 Weave Net
- 执行
kubectl get nodes -o wide查看 CNI 是否就绪;若Ready状态正常且无报错,说明基础已通
写一个只允许特定 Pod 访问的策略
这是最常见需求:比如只让 app=frontend 的 Pod 访问 app=api 的服务(80 端口)。
创建 api-allow-frontend.yaml:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-frontend
namespace: default
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
关键点:
-
podSelector定义谁被限制(这里是app=api的 Pod) -
from.podSelector定义谁被允许访问 -
ports明确端口和协议,不写则默认拒绝所有端口
隔离整个命名空间,禁止跨命名空间访问
适用于多环境(如 dev/test/prod)严格隔离场景。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
在 prod-ns 命名空间中部署以下策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-cross-namespace
namespace: prod-ns
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
效果:
- 同一命名空间内 Pod 可互访(
podSelector: {}匹配本空间所有 Pod) - 其他命名空间的 Pod 无法访问本空间任何 Pod
- 注意:此策略不控制出站(egress),如需限制外发流量,要额外加
egress规则
彻底拒绝某个应用的所有入站流量
常用于调试、灰度发布前的安全锁定,或作为白名单策略的起点。
例如阻止所有对 app=legacy-db 的访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: legacy-db-deny-all
namespace: default
spec:
podSelector:
matchLabels:
app: legacy-db
policyTypes:
- Ingress
ingress: [] # 空列表 = 不允许任何入站
应用后,任何 Pod(包括同命名空间)都无法通过网络连接该数据库 Pod。验证可用 kubectl run 启动临时 Pod 并 wget 测试是否超时。

















