Keycloak多副本部署时API偶发返回401未授权错误如何排查解决?
Keycloak多副本部署偶发未授权问题排查解决方案
多副本下偶发401未授权、单副本运行完全正常的问题90%以上是多Pod之间缓存、密钥或数据不同步导致,可按照以下优先级排查:
1 优先检查分布式缓存配置
官方Keycloak默认使用Infinispan做缓存,单副本下无需额外配置,多副本必须显式开启集群同步:
- 确认StatefulSet的环境变量配置是否正确:
KC_CACHE需设置为ispn启用分布式缓存,KC_CACHE_STACK需设置为kubernetes适配K8s环境的节点发现机制。 - 检查Keycloak对应的ServiceAccount RBAC权限:必须给ServiceAccount授予endpoints资源的get、list权限,Keycloak需要通过K8s API发现其他同组Pod节点,组成缓存集群,权限缺失会导致Pod之间无法发现,本地缓存完全独立。
- 检查签名密钥存储配置:默认Keycloak的JWT签名密钥存在本地缓存中,多副本未同步时,一个Pod签发的令牌在另一个Pod验签会直接失败。需要显式配置
KC_SIGNING_KEY_STORE指定统一的密钥存储路径,或者将签名密钥持久化存储到公共数据库中。
2 检查负载均衡会话粘性配置
临时开启会话粘性可以快速验证问题根因:
- 先开启Ingress或Service的会话粘性,将同一个客户端的所有请求都路由到同一个Keycloak Pod,如果开启后未授权问题完全消失,即可确定是缓存不同步导致的问题。
- 可以使用以下命令验证请求路由的Pod节点是否固定:
curl -v https://<你的Keycloak访问地址>/realms/<你的realm名称> 2>&1 | grep -i "x-keycloak-node"
如果没有返回节点标识响应头,可新增环境变量KC_HEADERS_ENABLED=true开启节点标识头暴露。
3 检查持久化数据一致性
- 确认所有Keycloak Pod连接的是同一个外部公共数据库,没有使用内置的H2本地数据库,内置数据库是Pod级别的独立存储,多Pod之间数据完全不互通。
- 进异常Pod执行以下命令验证数据库连通性,排除个别Pod数据库连接失败读取不到最新配置的情况:
nc -zv <数据库内网地址> <数据库端口>
4 检查全局域名配置一致性
- 确认所有Keycloak Pod的
KC_HOSTNAME配置完全统一,不要启用自动识别hostname的配置。如果不同Pod识别到的签发域名不一致,会导致JWT的iss字段校验失败返回401。 - 解析你获取到的令牌,确认令牌中的
iss字段值和你调用创建用户接口时使用的Keycloak地址前缀完全一致。
内容的提问来源于stack exchange,提问作者EMG
相关产品推荐
相关产品推荐

