GKE中Nginx Ingress传递Auth服务UID至微服务问题排查
问题排查:基于Nginx Ingress的微服务身份验证架构问题
我正在构建单Ingress架构(单入口网关),期望实现一个Auth服务,负责验证Firebase Token并返回UID,再将UID传递给S1、S2等后端微服务。但采用单Ingress时出现500 Internal Service Error;改用双Ingress架构后错误消失,但后端微服务无法获取到UID(当前测试用硬编码UID)。
架构说明
- 单Ingress架构:所有请求通过同一个Ingress入口,先路由到Auth服务验证Token,再转发到后端微服务
- 双Ingress架构:一个Ingress负责Token验证请求,另一个负责后端微服务的业务请求
现有代码
Auth服务代码
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.post('/verify-id-token', (req, res) => { const hardcodedUid = 'my-hardcoded-uid'; // 替换为实际UID // 添加UserID到响应头 res.setHeader('UserID', hardcodedUid); return res.status(200).json({ message: 'Token verified' }); }); const PORT = 8080; app.listen(PORT, () => { console.log(`Auth服务运行在端口 ${PORT}`); });
S1服务代码
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use((req, res, next) => { // 提取uid请求头 const uid = req.header('uid'); console.log('收到客户端请求,uid:', uid); // 设置uid头供微服务1使用 if (uid) { req.headers['uid'] = uid; console.log('为微服务1设置uid头:', uid); } next(); }); app.get('/', (req, res) => { // 获取uid头 const uid = req.header('uid'); console.log('微服务1处理请求,uid:', uid); res.status(200).json({ message: `来自微服务1的问候 ${uid}`, uid }); }); const PORT = 3000; app.listen(PORT, () => { console.log(`微服务1运行在端口 ${PORT}`); });
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: service-ingress annotations: nginx.ingress.kubernetes.io/auth-method: POST nginx.ingress.kubernetes.io/auth-url: http://<LB-IP>/verify-id-token nginx.ingress.kubernetes.io/auth-response-headers: uid spec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: test-service1 port: number: 3000 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: token-ingress annotations: nginx.ingress.kubernetes.io/auth-response-headers: uid spec: ingressClassName: nginx rules: - http: paths: - path: /verify-id-token pathType: Prefix backend: service: name: auth-service port: number: 8080
问题排查与修复方案
1. 单Ingress架构500错误修复
- 路由地址错误:
auth-url配置了外部LB IP,导致Ingress Controller无法内部访问Auth服务。应替换为集群内部Service地址,格式为http://<服务名>.<命名空间>.svc.cluster.local:<端口>/verify-id-token,例如:nginx.ingress.kubernetes.io/auth-url: http://auth-service.default.svc.cluster.local:8080/verify-id-token - 服务可达性检查:确认Auth服务在K8s集群内可被Ingress Controller访问,无网络策略、端口暴露问题。
2. 双Ingress架构无法获取UID修复
- 响应头大小写不匹配:Auth服务返回的是
UserID,但Ingress配置提取的是uid,需保持一致。修改Auth服务的响应头为小写uid:res.setHeader('uid', hardcodedUid); - Ingress注解位置错误:
auth-response-headers注解应配置在service-ingress上(负责转发业务请求的Ingress),token-ingress不需要该注解,因为它只是暴露Auth服务接口。 - 确认头转发逻辑:Nginx Ingress会将
auth-response-headers指定的头从Auth服务的响应中提取,添加到转发给后端微服务的请求中,后端服务通过req.header('uid')即可获取。
内容的提问来源于stack exchange,提问作者Ashu Upadhyay
相关产品推荐
相关产品推荐

