NetworkPolicy 可直接控制 Nginx Pod 访问权限,核心是选中带标签的 Pod、明确放行来源、限定端口协议;无需改服务或依赖 Ingress/Service Mesh,纯声明式策略即可生效。

直接用 NetworkPolicy 控制 Nginx Pod 的访问权限,核心是“选中目标 Pod + 明确放行来源 + 限定端口和协议”。不需要改服务、不依赖 Ingress 或 Service Mesh,纯声明式策略即可生效。
明确你要保护的对象
NetworkPolicy 只作用于带标签的 Pod,不是 Service。所以第一步必须确认 Nginx 实际运行的 Pod 有稳定标签,比如:
app: nginx 或 tier: frontend。
检查命令:kubectl get pods -l app=nginx -o wide。如果没标签,先给 Deployment 加上 label,再滚动更新。
写一个最小可用的限制策略
下面这个策略会拒绝所有访问,只允许带 access=true 标签的 Pod 连接 Nginx 的 80 端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-nginx-access
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
ports:
- protocol: TCP
port: 80要点说明:
• podSelector 锁定被保护的 Nginx Pod
• policyTypes: [Ingress] 表示只控制入向流量(出向默认不限制)
• from.podSelector 指定合法访问者,支持 namespaceSelector、ipBlock 等多种来源
• 不写 egress 部分,Nginx Pod 自身对外发起连接不受影响
验证是否生效
测试前确保集群已启用 CNI 插件(如 Calico、Cilium)并支持 NetworkPolicy —— 基础版 kube-proxy 不支持。
验证步骤:
- 启动一个无标签的 busybox 测试 Pod:
kubectl run test-pod --rm -it --image=busybox -- /bin/sh - 在容器内执行:
wget --spider --timeout=2 http://nginx→ 应失败(Connection timed out) - 再启动一个带 access=true 标签的 Pod:
kubectl run allowed-pod --rm -it --labels="access=true" --image=busybox -- /bin/sh - 同样执行 wget → 应成功返回 “remote file exists”
常见增强配置
生产环境常需组合多种条件:
- 只允许来自特定命名空间(如 ingress-nginx)的流量:
namespaceSelector: {name: ingress-nginx} - 限制外部 IP 段访问(如只允公司办公网):
ipBlock: {cidr: 203.0.113.0/24} - 同时控制出入站:加上
- Egress并定义egress.to和ports - 完全禁止所有入向流量(默认拒绝):策略中只写
podSelector和policyTypes: [Ingress],不写ingress字段


















