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:重置数据卷(适合无需保留旧数据的场景)
- 删除现有StatefulSet:
kubectl delete statefulset postgres - 删除StatefulSet自动生成的PVC(名称格式为
postgres-data-postgres-0):kubectl delete pvc postgres-data-postgres-0 - 若存在自定义PV,同步删除:
kubectl delete pv <your-pv-name> - 重新部署所有资源:
kubectl apply -f Configmap.yaml kubectl apply -f service.yaml kubectl apply -f statefulset.yaml - 等待Pod启动完成,验证连接:
kubectl exec -it postgres-0 -- psql -U testusr -d testdb
方案2:手动创建角色(适合需要保留现有数据的场景)
- 以默认超级用户
postgres身份进入数据库:kubectl exec -it postgres-0 -- psql -U postgres - 手动创建配置的用户和数据库:
CREATE USER testusr WITH PASSWORD 'testusr'; CREATE DATABASE testdb OWNER testusr; GRANT ALL PRIVILEGES ON DATABASE testdb TO testusr; - 退出后用
testusr登录验证连接。
额外注意事项
- StatefulSet的
volumeClaimTemplates会自动为每个Pod生成匹配的PVC,无需手动创建volume.yaml中的PVC,避免资源冲突。 - 若后续需要修改初始用户/数据库配置,必须清理数据卷后重新部署,否则环境变量不会生效。
内容的提问来源于stack exchange,提问作者Gayan_Nanayakkara
相关产品推荐
相关产品推荐

