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

基于Ingress主从(Master/Minion)模式实现集群流量路由及认证拦截问题排查

解决NGINX Ingress Master/Minion模式下全局认证不生效的问题

看起来你踩了一个很容易混淆的坑——你使用的是NGINX官方维护的Ingress Controller,而非Kubernetes社区的ingress-nginx项目,两者的注解前缀完全不同,这就是你的认证配置不生效的核心原因。

关键问题分析

你当前使用的镜像nginx/nginx-ingress:1.8.1是NGINX官方的Ingress Controller,它的注解前缀是nginx.org/;而你尝试使用的nginx.ingress.kubernetes.io/auth-url属于Kubernetes社区版ingress-nginx的注解,官方NGINX Ingress根本不会识别这些配置,自然不会生成对应的Nginx规则。

另外,在Master/Minion模式下,全局认证逻辑应该配置在Master Ingress上,这样所有Minion Ingress的路由规则都会自动继承认证配置,不需要在每个Minion里重复配置。

解决方案步骤

1. 使用正确的注解前缀修改Master Ingress

将认证相关的注解替换为NGINX官方Ingress Controller支持的nginx.org/前缀,并把配置放在Master Ingress中:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: master-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.org/mergeable-ingress-type: "master"
    kubernetes.io/ingress.global-static-ip-name: <cluster-ip>
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    # 替换为NGINX官方认证注解前缀
    nginx.org/auth-url: "http://my-auth-service/"
    # 如果需要自定义认证后的请求头,使用官方的auth-snippet注解
    nginx.org/auth-snippet: |
      auth_request_set $auth_service $upstream_http_auth_service;
      proxy_set_header X-foo-Token $auth_service;
spec:
  tls:
  - hosts:
    - app.myurl.com
    secretName: secret-tls
  rules:
  - host: app.myurl.com

2. 移除Minion Ingress中的冗余配置

你之前在Minion里添加的proxy_pass是多余的——NGINX的auth_request指令会在认证通过后自动将请求转发到后端服务,不需要手动配置转发规则。保持Minion Ingress的简洁即可:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pod-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.org/mergeable-ingress-type: "minion"
    nginx.org/rewrites: "serviceName={{ .Values.serviceName }} rewrite=/"
spec:
  rules:
  - host: {{ .Values.clusterHost }}
    http:
      paths:
      - path: /{{ .Values.serviceName }}/
        backend:
          serviceName: {{ .Values.serviceName }}
          servicePort: 80

3. 验证配置是否生效

  • 查看Ingress Controller的日志,确认配置加载无错误:
    kubectl logs <nginx-ingress-pod-name> -n <your-namespace>
    
  • 进入Ingress Controller Pod,检查生成的Nginx配置文件,确认auth_request相关规则已存在:
    kubectl exec -it <nginx-ingress-pod-name> -n <your-namespace> -- cat /etc/nginx/conf.d/app.myurl.com.conf
    
  • 确保my-auth-service在Ingress Controller所在的命名空间可访问,如果跨命名空间,建议使用全限定域名(例如http://my-auth-service.default.svc.cluster.local)。

内容的提问来源于stack exchange,提问作者graned

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:22:56