Kubernetes部署Keycloak配置AWS RDS外部PostgreSQL不生效问题
问题根因
你使用的Keycloak 17.0.0是基于Quarkus构建的新版本,配置中使用的DB_ADDR、DB_VENDOR、DB_DATABASE、DB_USER、DB_SCHEMA均是旧WildFly架构版本的环境变量,Quarkus版Keycloak不会识别这些配置,因此启动时默认回退到内置的H2内存数据库。
另外你原配置中DB_ADDR的赋值方式本身也有错误:即使在旧版Keycloak中,DB_ADDR也仅需要填写数据库主机地址,不需要携带jdbc:postgresql://前缀和数据库名后缀。
修正方案
将所有旧格式的数据库环境变量替换为Quarkus版Keycloak支持的标准配置项,同时修正连接串格式:
- 删除原有所有
DB_前缀的数据库配置变量 - 新增以下Quarkus版数据库配置变量:
# 数据库类型固定为postgres - name: KC_DB value: postgres # 完整JDBC连接串,注意补上默认端口5432,替换为实际数据库名 - name: KC_DB_URL value: jdbc:postgresql://database.c**7irl*****.us-east-1.rds.amazonaws.com:5432/<替换为实际数据库名> # 数据库用户名 - name: KC_DB_USERNAME value: postgres # 数据库对应用户密码,替换为实际RDS账号密码 - name: KC_DB_PASSWORD value: <替换为RDS数据库实际密码> # 数据库schema - name: KC_DB_SCHEMA value: public
修正后完整的容器env块参考如下:
env: - name: KEYCLOAK_ADMIN value: **** - name: KEYCLOAK_ADMIN_PASSWORD value: ***** - name: PROXY_ADDRESS_FORWARDING value: "true" - name: KC_DB value: postgres - name: KC_DB_URL value: jdbc:postgresql://database.c**7irl*****.us-east-1.rds.amazonaws.com:5432/<实际数据库名> - name: KC_DB_USERNAME value: postgres - name: KC_DB_PASSWORD value: <实际RDS密码> - name: KC_DB_SCHEMA value: public - name: JGROUPS_DISCOVERY_PROTOCOL value: dns.DNS_PING - name: JGROUPS_DISCOVERY_PROPERTIES value: dns_query=keycloak - name: CACHE_OWNERS_COUNT value: "2" - name: CACHE_OWNERS_AUTH_SESSIONS_COUNT value: "2"
配套排查检查项
- 网络连通性校验:在K8s集群同命名空间启动临时PostgreSQL客户端Pod,验证是否可以正常连接RDS实例的5432端口,排除安全组、VPC网络ACL、K8s网络策略拦截的问题
- 版本兼容性校验:Keycloak 17.0.0默认附带的PostgreSQL驱动最高支持PostgreSQL 14版本,如果RDS实例使用15及以上大版本,会出现驱动兼容报错,需要升级Keycloak版本
- 日志校验:你已经配置了DEBUG日志级别,启动后查看日志中是否出现PostgreSQL驱动加载、数据库连接建立的相关日志,如果依旧出现H2数据库初始化日志,说明配置项未正确生效
- 配置生效校验:应用新配置后需要完全删除旧的Pod,等待Deployment滚动更新完成后再验证连接状态,避免旧Pod缓存配置导致验证结果不准
内容的提问来源于stack exchange,提问作者user19386126
相关产品推荐
相关产品推荐

