Kubernetes中Postgres部署崩溃求助:未指定超级用户密码
排查Kubernetes中Postgres部署初始化错误
问题场景
在Kubernetes中配置Postgres数据库部署时,容器启动失败,报错提示未指定超级用户密码。
配置文件
database/secret.yml
apiVersion: v1 kind: Secret metadata: name: postgres-secrets type: Opaque data: database: ZXRs username: cG9zdGdyZXM= password: cG9zdGdyZXM=
database/deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: postgres spec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgresdb image: postgres imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 env: - name: DATABASE_NAME valueFrom: secretKeyRef: name: postgres-secrets key: database - name: DATABASE_USER valueFrom: secretKeyRef: name: postgres-secrets key: username - name: DATABASE_PASSWORD valueFrom: secretKeyRef: name: postgres-secrets key: password volumeMounts: - mountPath: /var/lib/postgresql/data name: postgresdb - name: postgres-secrets mountPath: "/etc/postgres-secrets" readOnly: true volumes: - name: postgresdb persistentVolumeClaim: claimName: postgres-pvc - name: postgres-secrets secret: secretName: postgres-secrets
错误日志
执行命令:kubectl logs postgres-6667fcb9c-sk77f
返回错误:
错误:数据库未初始化,且未指定超级用户密码。 必须为超级用户指定非空的POSTGRES_PASSWORD值。例如,在"docker run"时使用"-e POSTGRES_PASSWORD=password"。 你也可以使用"POSTGRES_HOST_AUTH_METHOD=trust"来允许无密码连接,但这*不*推荐。
问题原因及解决方法
核心问题
Postgres官方镜像只识别固定命名的初始化环境变量,你当前使用的DATABASE_NAME、DATABASE_USER、DATABASE_PASSWORD不是镜像预期的变量名,导致镜像无法读取密码配置,触发初始化失败。
修复步骤
- 修正环境变量名
将容器的env部分替换为Postgres镜像要求的标准变量名:env: - name: POSTGRES_DB valueFrom: secretKeyRef: name: postgres-secrets key: database - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secrets key: username - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secrets key: password - 移除无效的Secret挂载
你已经通过环境变量引用了Secret中的值,无需再将Secret挂载到容器目录,可删除以下配置:- 容器
volumeMounts中关于postgres-secrets的条目 - Deployment的
volumes中关于postgres-secrets的条目
- 容器
- 验证Secret内容
你的Secret中base64编码内容解码后有效:database: ZXRs→ 解码为etlusername: cG9zdGdyZXM=→ 解码为postgrespassword: cG9zdGdyZXM=→ 解码为postgres
这部分无需修改。
修复后的Deployment示例
apiVersion: apps/v1 kind: Deployment metadata: name: postgres spec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgresdb image: postgres imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 env: - name: POSTGRES_DB valueFrom: secretKeyRef: name: postgres-secrets key: database - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secrets key: username - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secrets key: password volumeMounts: - mountPath: /var/lib/postgresql/data name: postgresdb volumes: - name: postgresdb persistentVolumeClaim: claimName: postgres-pvc
应用修复
执行以下命令更新部署:
kubectl apply -f database/deployment.yml
内容的提问来源于stack exchange,提问作者SDRJ
相关产品推荐
相关产品推荐

