Kubernetes Nginx Ingress访问Hazelcast Mancenter出现302重定向问题
异常302重定向由两处配置错误共同导致:
- Nginx Ingress的路径重写规则配置无效
- Hazelcast管理中心未配置对应的子路径上下文,和Ingress转发规则不匹配
首先看Ingress配置的问题:你当前配置了nginx.ingress.kubernetes.io/rewrite-target: /$1,但匹配路径写的是/hazelcast-mancenter,没有配置正则捕获组,$1变量取不到任何值,实际转发到后端的路径完全不符合预期。比如访问/hazelcast-mancenter/时,转发到后端的路径不是预期的根路径/,后端服务识别不到请求路径就会触发重定向。
其次是Hazelcast管理中心本身的配置问题:5.x版本的Hazelcast MC默认仅在根路径提供服务,就算Ingress重写规则配置正确,MC返回的重定向地址、静态资源引用路径都是硬编码指向根路径/,不会自动携带/hazelcast-mancenter前缀,就算首页勉强打开,后续资源请求也会404或者循环跳转。
1. 修正Ingress转发规则
调整Ingress的路径匹配规则和重写注解,去掉无效的add-base-url注解(这个注解对后端返回的绝对路径重写兼容性极差,不要依赖),正确配置如下:
metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: james.new-dev.com http: paths: - backend: service: name: hazelcast-mancenter port: number: 8080 path: /hazelcast-mancenter(/|$)(.*) pathType: ImplementationSpecific
配置逻辑说明:
- 路径用正则
/hazelcast-mancenter(/|$)(.*)做匹配,分两个捕获组:第一个组匹配前缀后的斜杠或路径结束标记,第二个组捕获前缀后的实际请求路径 - 重写目标设为
/$2,访问/hazelcast-mancenter时会转发到后端根路径/,访问/hazelcast-mancenter/xxx时会转发到后端对应路径/xxx
2. 给Hazelcast管理中心配置上下文路径
必须让MC自身感知到部署在/hazelcast-mancenter子路径下,否则它生成的跳转地址、资源路径还是会指向根路径。修改StatefulSet中容器的JAVA_OPTS环境变量,添加上下文路径参数:
containers: - name: hazelcast-mancenter env: - name: JAVA_OPTS value: "-Dhazelcast.mc.healthCheck.enable=true -DserviceName=hazelcast -Dnamespace=default -Dhazelcast.mc.tls.enabled=false -Dhazelcast.mc.contextPath=/hazelcast-mancenter"
新增的-Dhazelcast.mc.contextPath=/hazelcast-mancenter参数会指定MC的对外访问前缀,所有内部重定向、静态资源引用都会自动携带该前缀,不会再跳转到根路径。
3. 生效验证
更新Ingress和StatefulSet配置后,等待MC Pod重启就绪,再访问https://james.new-dev.com/hazelcast-mancenter/即可正常加载页面,不会再出现异常302。
如果配置更新后仍有问题,可按以下顺序排查:
- 查看Nginx Ingress Controller日志,确认新的Ingress规则已经成功加载
- 集群内直接curl访问MC Pod的8080端口,请求
/hazelcast-mancenter路径,确认后端服务本身可以正常响应,排除应用自身故障 - 查看浏览器开发者工具中302响应的Location头:如果跳转到根路径
/说明MC的contextPath参数未生效;如果路径携带前缀但返回404,说明Ingress的重写正则配置有误。
内容的提问来源于stack exchange,提问作者Shane Warne

