You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:44:53