Kubernetes集群Nginx代理ClusterIP服务访问/api返回404问题咨询
问题排查与修复
你的配置存在4处明确问题,会直接或间接导致访问LOAD_BALANCER_IP/api返回404:
- Nginx反向代理的后端服务名配置错误。集群内Service通过服务名做DNS解析,你创建的后端ClusterIP Service名称为
league-pool-production-server-service,但Nginx配置中proxy_pass写的是http://league-pool-server,该域名在集群内不存在,会导致Nginx无法连接后端;如果你的Nginx配置未正确加载(比如配置文件放错路径),所有请求会直接匹配静态文件规则,找不到对应文件就返回404。 - Nginx路径转发规则错误。当前
location /api规则搭配不带末尾斜杠的proxy_pass地址,会把/api前缀完整带给后端服务,比如请求/api/users会被转发为http://后端服务/api/users,如果你的后端API服务路由没有配置/api前缀,会直接返回404。 - LoadBalancer Service配置了
externalTrafficPolicy: Local,该模式下流量只会转发到当前节点上运行的Nginx Pod,如果负载均衡把流量打到没有运行Nginx Pod的节点,请求会直接被丢弃,会出现间歇性404或连接超时。 - Nginx Deployment初始副本数与HPA配置冲突。Deployment中写死
replicas: 1,但HPA配置最小副本数为2,两者同时存在会导致副本数被反复调整,可能出现部分节点无Nginx Pod的情况。
修复步骤
1. 修正Nginx站点配置
替换原有Nginx配置,修正服务名、路径转发规则,补充必要的代理头,同时兼容无斜杠的/api访问:
server { listen 80; root /usr/share/nginx/html; location / { try_files $uri $uri/ =404; } location /api/ { # 末尾加斜杠,自动剥离/api前缀后转发到后端 proxy_pass http://league-pool-production-server-service/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 兼容访问/api不带末尾斜杠的场景,自动重定向 location = /api { return 301 /api/; } }
注意:重新构建Nginx镜像时,确认配置文件被放到Nginx的有效配置目录(通常为
/etc/nginx/conf.d/),可以进Pod执行nginx -T查看已加载的完整配置,确认/api规则存在,避免配置不生效。
2. 修正Nginx Service配置
如果没有特殊的获取客户端真实IP需求,删除externalTrafficPolicy: Local配置,使用默认的Cluster流量转发模式,避免流量丢失:
apiVersion: v1 kind: Service metadata: name: league-pool-nginx-service spec: type: LoadBalancer selector: app: league-pool-nginx-production ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 443
3. 修正Nginx Deployment配置
删除Deployment中写死的replicas字段,副本数完全交给HPA管理,避免配置冲突:
apiVersion: apps/v1 kind: Deployment metadata: name: league-pool-nginx-deployment labels: app: league-pool-nginx-production spec: selector: matchLabels: app: league-pool-nginx-production template: metadata: labels: app: league-pool-nginx-production spec: containers: - name: league-pool-nginx-production image: helloitsian/league-pool-nginx imagePullPolicy: Always resources: limits: cpu: 300m requests: cpu: 100m memory: 200Mi ports: - containerPort: 443 - containerPort: 80
验证流程
配置更新完成后按顺序验证:
- 进入任意Nginx Pod,执行
curl http://league-pool-production-server-service(替换为后端实际存在的测试路径),确认能正常连通后端服务,排除集群网络问题。 - 在Nginx Pod内执行
curl localhost/api/测试路径,确认接口正常返回,排除Nginx配置问题。 - 通过LoadBalancer IP访问对外接口,验证服务正常。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

