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

Kubernetes部署PostgreSQL时出现'testusr'角色不存在错误求助

解决PostgreSQL StatefulSet部署中"role不存在"的问题

问题场景

在Mac环境下通过Kubernetes的ConfigMap、Service、StatefulSet和PersistentVolumeClaim部署PostgreSQL数据库,执行命令:

kubectl exec -it postgres-0 -- psql -U testusr

触发如下错误:

psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "testusr" does not exist command terminated with exit code 2

相关配置文件如下:

Configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  labels:
    app: postgres
data:
  POSTGRES_DB: testdb
  POSTGRES_USER: testusr
  POSTGRES_PASSWORD: testusr

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  selector:
    app: postgres
  ports:
    - port: 5432
      targetPort: 5432
  type: ClusterIP

statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          resources:
            requests:
              cpu: 100m
              memory: 256Mi
            limits:
              cpu: 500m
              memory: 512Mi
          volumeMounts:
            - name: postgres-data
              mountPath: "/var/lib/postgresql/data"
  volumeClaimTemplates:
    - metadata:
        name: postgres-data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 5Gi

volume.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-volume-claim
  labels:
    app: postgres
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

问题原因与修复步骤

核心原因

PostgreSQL官方镜像的初始化逻辑仅在首次启动且数据目录完全为空时,读取POSTGRES_USER、POSTGRES_DB等环境变量创建初始用户和数据库。如果之前部署过PostgreSQL并残留了数据卷(PV/PVC未清理),环境变量会被直接忽略,导致配置的testusr角色未被创建。此外,你提供的volume.yaml中的PVC并未被StatefulSet使用,属于冗余资源。

修复方案

方案1:重置数据卷(适合无需保留旧数据的场景)

  1. 删除现有StatefulSet:
    kubectl delete statefulset postgres
    
  2. 删除StatefulSet自动生成的PVC(名称格式为postgres-data-postgres-0):
    kubectl delete pvc postgres-data-postgres-0
    
  3. 若存在自定义PV,同步删除:
    kubectl delete pv <your-pv-name>
    
  4. 重新部署所有资源:
    kubectl apply -f Configmap.yaml
    kubectl apply -f service.yaml
    kubectl apply -f statefulset.yaml
    
  5. 等待Pod启动完成,验证连接:
    kubectl exec -it postgres-0 -- psql -U testusr -d testdb
    

方案2:手动创建角色(适合需要保留现有数据的场景)

  1. 以默认超级用户postgres身份进入数据库:
    kubectl exec -it postgres-0 -- psql -U postgres
    
  2. 手动创建配置的用户和数据库:
    CREATE USER testusr WITH PASSWORD 'testusr';
    CREATE DATABASE testdb OWNER testusr;
    GRANT ALL PRIVILEGES ON DATABASE testdb TO testusr;
    
  3. 退出后用testusr登录验证连接。

额外注意事项

  • StatefulSet的volumeClaimTemplates会自动为每个Pod生成匹配的PVC,无需手动创建volume.yaml中的PVC,避免资源冲突。
  • 若后续需要修改初始用户/数据库配置,必须清理数据卷后重新部署,否则环境变量不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:05:11