当部署在 Kubernetes 中时,我发现 Keycloak 有一个奇怪的行为,让我无法理解。
用例:
我比较了(相同)镜像 (quay.io/keycloak/keycloak:17.0.0) 在 Docker 或 Kubernetes (K3S) 上运行时的行为。
如果我从 Docker 运行它,则会加载帐户控制台。换句话说,我的请求获得了成功(204)
GET /realms/master/protocol/openid-connect/login-status-iframe.html/init?client_id=account-console
从部署在 Kubernetes 中的同一镜像中,相同的请求失败并出现错误 403。但是,在同一个应用程序上,我的请求获得了成功(204)
GET /realms/master/protocol/openid-connect/login-status-iframe.html/init?client_id=security-admin-console
由于我可以调用 security-admin-console,因此这看起来不像 Kubernetes Ingress 网关的问题,也不像与路由相关的任何问题。
然后我考虑了 Keycloak 访问控制配置问题,但在这两种情况下我都使用默认图像而不进行任何更改。我反复检查以确保,管理员用户和帐户控制台客户端在 docker 和 k8s 应用程序中的配置方式似乎完全相同。
我不知道可能是什么问题,你有什么建议吗?
尝试将Keycloak数据库中
realm表中的
ssl_required = NONE
设置为您的领域(master)
我可以使用以下环境变量解决问题,我的 Keycloak 版本是 23.0.4:
- name: KC_HOSTNAME
value: subdomain.domain.com
- name: KC_HOSTNAME_ADMIN_URL
value: https://subdomain.domain-name.com/
- name: KC_HTTP_ENABLED
value: 'false'
- name: KC_HOSTNAME_STRICT
value: 'true'
- name: KC_HOSTNAME_STRICT_HTTPS
value: 'true'
- name: KC_PROXY
value: edge
所以我们发现是
nginx
入口控制器导致了很多问题。 虽然我们能够通过 nginx
等方式使其与 X-Forwarded-Proto
一起工作,但它有点复杂和令人费解。改为 haproxy
反而解决了这个问题。另外,请确保您通过 https
与入口控制器连接,否则可能会导致 keycloak 出现问题。
annotations:
kubernetes.io/ingress.class: haproxy
...
我遇到了类似的问题,并使用 Nginx 作为 HTTPS 的代理。 管理 Web 控制台因 403 加载而卡住:
/realms/master/protocol/openid-connect/login-status-iframe.html/init
我通过添加这些用于 KeyCloak 位置配置的 Nginx 行来修复它。
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;