Keycloak Operator部署/auth子路径返回404问题求助
核心问题分析
你遇到的问题根源是Keycloak本身不知道它运行在/auth上下文路径下:只靠Ingress重写会导致Keycloak生成的内部URL(比如登录跳转、控制台链接)缺失/auth前缀;直接让Ingress转发/auth请求到Keycloak根路径,又会因为Keycloak没监听/auth返回404。必须让Keycloak和Ingress的配置保持一致。
正确配置步骤
1. 修改Keycloak Operator自定义资源(CR),设置上下文路径
在Keycloak CR中添加httpRelativePath参数,让Keycloak内部以/auth作为根路径处理请求:
apiVersion: keycloak.org/v1alpha1 kind: Keycloak metadata: name: your-keycloak-instance spec: instances: 1 # 关键配置:让Keycloak监听/auth路径 httpRelativePath: /auth # 其他原有配置(比如数据库、资源限制等)保留不变
应用这个CR后,Keycloak Pod的启动命令会自动带上--http-relative-path=/auth参数,此时Keycloak会处理所有以/auth开头的请求。
2. 配置Ingress-Nginx,直接转发请求无需重写
修改Helm模板中的Ingress配置,去掉URL重写注解,直接将/auth路径的请求转发到Keycloak服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: keycloak-ingress annotations: kubernetes.io/ingress.class: nginx # 移除所有rewrite-target相关注解 spec: rules: - host: your-domain.example.com http: paths: - path: /auth pathType: Prefix backend: service: name: your-keycloak-service-name port: number: 8080
这里的path: /auth配合pathType: Prefix会匹配所有/auth开头的请求(比如/auth/login、/auth/admin),直接转发到Keycloak服务的8080端口,Keycloak内部已经配置了/auth上下文,能正确处理这些请求。
验证与排查
- 查看Keycloak Pod日志,确认启动参数包含
--http-relative-path=/auth:kubectl logs <your-keycloak-pod-name> | grep "http-relative-path" - 访问
https://your-domain.example.com/auth,应该能正常加载Keycloak登录页面;访问/auth/admin能进入管理控制台(需确保控制台已启用)。 - 如果仍有404,检查Ingress控制器日志,确认请求是否正确转发到Keycloak Pod;同时检查Keycloak服务的端口是否指向8080(Keycloak默认HTTP端口)。
为什么之前的重写方案不行?
当你用Ingress将/auth重写为/时,Keycloak收到的请求都是/开头,但它本身的路由是基于根路径的,生成的跳转URL(比如登录后的回调)会是/admin而不是/auth/admin,导致前端访问时出现404,同时页面上的静态资源路径也会缺失/auth前缀,加载失败。只有让Keycloak自身感知到上下文路径,才能生成正确的URL。
内容的提问来源于stack exchange,提问作者Joe M

