NGINX Ingress网络策略访问限制异常问题求助
核心原因分析
LoadBalancer类型的Ingress在云环境中通常会经过SNAT(源地址转换),导致Ingress Controller Pod接收到的请求源IP变为Worker节点或LB集群内部IP;同时可能存在标签不匹配、端口名称错误、多策略冲突等问题,导致添加IP后仍无法访问。
分步解决步骤
1. 验证Pod标签匹配性
执行命令确认Ingress Controller Pod的标签与Network Policy中的podSelector完全一致(标签大小写、键值对必须完全匹配):
kubectl get pods -n ingress-nginx --show-labels
如果标签不匹配,修改Network Policy中的matchLabels为实际Pod标签。
2. 替换端口名称为数字端口
部分Ingress Controller的Pod端口名称并非http/https,直接使用数字端口更稳妥。修改Network Policy的ports段:
ports: - protocol: TCP port: 80 - protocol: TCP port: 443
3. 补充所有必要的IP段到规则中
需要同时允许客户端真实IP、所有Worker节点IP、LoadBalancer的集群内部IP:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ingress-access namespace: ingress-nginx spec: podSelector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/component: controller app.kubernetes.io/instance: nginx-ingress policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 11.11.11.11/32 # 你的客户端真实IP - ipBlock: cidr: 22.22.22.22/32 # Worker节点IP,如有多个需全部添加 - ipBlock: cidr: 10.0.0.10/32 # LoadBalancer的ClusterIP,通过`kubectl get svc -n ingress-nginx`获取 ports: - protocol: TCP port: 80 - protocol: TCP port: 443
4. 检查是否存在多策略冲突
执行命令查看当前命名空间下所有Network Policy,确认没有其他策略阻止流量(Kubernetes中多个Network Policy为逻辑与关系,需满足所有允许规则):
kubectl get networkpolicies -n ingress-nginx
5. 配置Ingress Controller保留真实客户端IP(可选优化)
修改Ingress Controller的Service,启用externalTrafficPolicy: Local,让LB直接转发请求到运行Ingress Controller的Worker节点,避免SNAT,此时仅需在Network Policy中添加你的客户端IP即可:
kubectl patch svc nginx-ingress-controller -n ingress-nginx -p '{"spec":{"externalTrafficPolicy":"Local"}}'
注意:该配置会让流量仅分发到运行Ingress Controller Pod的Worker节点,需确保Pod分布满足可用性需求。
6. 重新部署策略并测试
kubectl apply -f your-network-policy.yaml
内容的提问来源于stack exchange,提问作者Wonderhost

