You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes上Keycloak对接PostgreSQL数据持久化问题排查

Keycloak对接PostgreSQL数据不持久化问题排查与解决

核心问题定位

你遇到的问题大概率是Keycloak未正确加载PostgreSQL配置,默认使用了内置的H2数据库——H2是内存型数据库,Pod重启后数据必然丢失。以下是分步排查与修复方案:


1. 验证Keycloak与PostgreSQL的连接状态

先确认Keycloak是否真的连上了PostgreSQL:

  • 查看Keycloak Pod日志,搜索数据库连接相关信息:

    kubectl logs <keycloak-pod-name>
    

    如果日志里出现Connected to PostgreSQL或类似成功提示,说明连接正常;如果有connection refused、认证失败等错误,先解决网络或权限问题。

  • 进入PostgreSQL Pod,检查是否存在Keycloak创建的表:

    kubectl exec -it <postgres-pod-name> -- psql -U keycloak -d keycloak
    

    执行\dt命令,若能看到user_entity、realm等Keycloak专属表,说明连接生效;反之则Keycloak未使用PostgreSQL。


2. 修正Keycloak的数据库环境变量配置

Keycloak 17+版本(你用的是23.0.6)已改用KC_DB_*前缀的环境变量,旧的DB_*变量不再生效。需修改keycloak-deployment.yaml中的env部分:

env:
  - name: KEYCLOAK_ADMIN
    value: xxxx
  - name: KEYCLOAK_ADMIN_PASSWORD
    value: xxxx
  - name: KC_PROXY
    value: "edge"
  # 替换旧的数据库配置变量
  - name: KC_DB
    value: postgres
  - name: KC_DB_URL_HOST
    value: postgres-service
  - name: KC_DB_URL_DATABASE
    value: keycloak  # 需与PostgreSQL的POSTGRES_DB值一致
  - name: KC_DB_USERNAME
    value: keycloak  # 需与PostgreSQL的POSTGRES_USER值一致
  - name: KC_DB_PASSWORD
    value: your_password  # 需与PostgreSQL的POSTGRES_PASSWORD值一致
  - name: KC_HOSTNAME
    value: env-xxxxxxx.jcloud.ik-server.com

3. 补全PostgreSQL的持久化配置(必做)

你当前的PostgreSQL未配置PVC,一旦PostgreSQL Pod重启,数据也会丢失。需添加持久化存储:

第一步:创建PVC配置文件postgres-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

执行部署:

kubectl apply -f postgres-pvc.yaml

第二步:修改PostgreSQL Deployment挂载PVC

更新postgres-deployment.yaml的容器配置:

spec:
  containers:
    - name: postgres
      image: postgres:13.1
      env:
        - name: POSTGRES_DB
          value: keycloak
        - name: POSTGRES_USER
          value: keycloak
        - name: POSTGRES_PASSWORD
          value: your_password
      ports:
        - containerPort: 5432
      # 添加PVC挂载
      volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  # 声明使用的PVC
  volumes:
    - name: postgres-storage
      persistentVolumeClaim:
        claimName: postgres-pvc

4. 重新部署服务

# 重启Keycloak
kubectl delete deployment keycloak
kubectl apply -f keycloak-deployment.yaml

# 重启PostgreSQL(若修改了配置)
kubectl delete deployment postgres-deployment
kubectl apply -f postgres-deployment.yaml

额外检查点

  • 确认Keycloak与PostgreSQL在同一个命名空间下,若不在,需将KC_DB_URL_HOST改为postgres-service.<namespace>.svc.cluster.local
  • 检查集群是否有网络策略限制,确保Keycloak Pod能访问PostgreSQL的5432端口

内容的提问来源于stack exchange,提问作者Unik6065

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:23:31