基于Bitnami Helm Chart在K8s部署Keycloak 18生产环境配置问题
部署环境概述
- 运行环境:Azure AKS Kubernetes集群
- 部署方式:Bitnami Helm Chart,StatefulSet模式
- Ingress Controller:Traefik 2.7
- 数据库:外部PostgreSQL
- 代理模式:Keycloak "edge"模式,SSL由Traefik+cert-manager+Let's Encrypt处理
问题1:启用生产模式后数据库连接异常
现象
初始部署后日志提示处于开发模式:
2022-07-29 22:43:21,460 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, jdbc-mariadb, jdbc-mssql, jdbc-mysql, jdbc-oracle, jdbc-postgresql, keycloak, narayana-jta, reactive-routes, resteasy, resteasy-jackson, smallrye-context-propagation, smallrye-health, smallrye-metrics, vault, vertx]
2022-07-29 22:43:21,466 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.
添加生产模式Helm配置后,出现数据库驱动错误,服务尝试回退到内置H2数据库:
cache: enabled: true auth: adminUser: **** adminPassword: **** managementUser: **** managementPassword: **** proxy: edge postgresql: enabled: false externalDatabase: host: **** port: 5432 user: **** password: **** database: keycloak resources: requests: cpu: 0.5 memory: 512Mi limits: cpu: 1 memory: 1Gi extraEnvVars: - name: KEYCLOAK_PRODUCTION value: "true" - name: KC_HOSTNAME value: "<external host name>" - name: KC_HOSTNAME_STRICT_HTTPS value: "false"
错误日志片段:
at org.h2.jdbcx.JdbcDataSource.getXAConnection(JdbcDataSource.java:352)
at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:216)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:513)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:494)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
2022-07-29 18:27:20,885 WARN [io.agroal.pool] (agroal-11) Datasource '': No suitable driver found for jdbc:postgresql://***********:5432/keycloak?currentSchema=public
解决方案
Quarkus生产模式下不会自动加载所有JDBC驱动,需显式指定启用PostgreSQL驱动,修改Helm配置的extraEnvVars块:
extraEnvVars: - name: KEYCLOAK_PRODUCTION value: "true" - name: KC_HOSTNAME value: "<external host name>" - name: KC_HOSTNAME_STRICT_HTTPS value: "false" # 新增:显式启用PostgreSQL驱动 - name: QUARKUS_JDBC_POSTGRESQL_ENABLED value: "true"
同时确认externalDatabase配置的主机、端口、账号信息正确,且AKS集群网络能访问外部PostgreSQL实例。
问题2:Infinispan缓存无法持久化,多副本运行异常
现象
日志提示Infinispan未启用全局状态,无法持久化内部缓存:
[org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled
解决方案
修改Helm配置开启Infinispan全局状态与持久化,支持多副本缓存一致性:
- 调整
cache配置块:
cache: enabled: true # 启用全局状态 globalState: enabled: true # 配置缓存持久化存储 persistence: enabled: true storageClass: "your-aks-storage-class" # 替换为AKS中可用的存储类 size: 10Gi
- 添加环境变量指定Keycloak使用集群缓存模式:
extraEnvVars: # 保留已有变量... - name: KC_CACHE value: "ispn" - name: KC_CACHE_STACK value: "kubernetes"
- 配置多副本数(按需调整):
replicaCount: 2
内容的提问来源于stack exchange,提问作者Pascal Paulis

