在Pod中部署Nginx放行Kubernetes集群服务(无需Ingress)
在Pod内部署Nginx实现集群服务白名单+反向代理的配置方案
我来给你拆解一下这个场景下Nginx的具体配置规则——既然没法用Ingress Controller,那Pod里的Nginx就得同时扛起流量拦截和反向代理的活儿。咱们一步步来:
核心前提先明确
首先,同Pod内的容器是共享网络命名空间的,所以Nginx反向代理到另一个容器直接用localhost:应用端口或者容器别名(如果给应用容器设了名称)就行,不用额外的网络配置。
而白名单的核心需求是优先放行全集群服务,再支持指定特定服务,这就需要结合Kubernetes集群的网络特性来配置规则。
具体Nginx允许规则配置
1. 优先放行全集群内所有服务
集群内的所有Pod和Service都属于固定的IP段(Pod CIDR和Service CIDR),我们可以直接允许这两个网段的所有流量,就能覆盖所有集群内的服务请求。
先获取你的集群IP段:
# 查看集群的Pod CIDR和Service CIDR kubectl cluster-info dump | grep -E 'podCIDR|serviceClusterIPRange'
然后把这些IP段写到Nginx配置里,示例如下:
http { # 替换成你集群实际的Pod CIDR和Service CIDR set $cluster_pod_cidr "10.244.0.0/16"; set $cluster_service_cidr "10.96.0.0/12"; server { listen 80; server_name _; # 第一优先级:放行全集群内的所有Pod和Service流量 allow $cluster_pod_cidr; allow $cluster_service_cidr; # 第二优先级:放行指定的特定服务(按需添加) allow 192.168.1.100; # 示例:特定服务的固定IP allow my-special-service.my-namespace.svc.cluster.local; # 示例:特定集群服务的完整DNS名 # 拒绝所有不在白名单内的流量 deny all; # 反向代理到同Pod内的应用容器 location / { proxy_pass http://localhost:8080; # 替换成你的应用容器实际端口 # 传递必要的请求头给后端应用 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
2. 可选:基于请求Host的白名单(针对特定域名访问)
如果你的服务是通过特定Host头来接收请求的,还可以额外配置基于Host的白名单规则,进一步精准管控:
server { listen 80; server_name allowed-app.example.com; # 只允许这个Host的请求 # 同时结合集群IP段白名单 allow $cluster_pod_cidr; allow $cluster_service_cidr; deny all; location / { proxy_pass http://localhost:8080; # 其他代理头配置... } }
3. 关键注意事项
- 规则顺序很重要:Nginx的
allow规则是按从上到下的顺序匹配的,一定要把全集群的规则放在最前面,再放特定服务的规则,最后用deny all收尾。 - 日志排查:建议加上日志配置,方便后续排查拦截情况:
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; - 资源配置:在Pod的资源清单里给Nginx容器分配足够的CPU和内存,避免成为流量瓶颈。
- 端口匹配:确保
proxy_pass里的端口和应用容器的暴露端口完全一致。
内容的提问来源于stack exchange,提问作者newToScala
相关产品推荐
相关产品推荐

