基于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
相关产品推荐
相关产品推荐

