Kubernetes中PostgreSQL Pod频繁重启且NodePort无法连接求助
PostgreSQL集群在Kubernetes中频繁重启+NodePort无法连接问题排查
我是Kubernetes新手,在VMware ESXi服务器的Ubuntu20.04系统上搭建了主节点与工作节点,通过主节点在node1部署了PostgreSQL数据库集群。集群能启动但会定期自动重启,且NodePort服务无法连接数据库。以下是相关信息:
部署YAML文件
apiVersion: apps/v1 kind: Deployment metadata: name: postgres spec: selector: matchLabels: app: postgres replicas: 1 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:latest imagePullPolicy: "IfNotPresent" envFrom: - configMapRef: name: postgres-config volumeMounts: - mountPath: /var/lib/postgresql/data name: postgredb volumes: - name: postgredb persistentVolumeClaim: claimName: postgres-pv-claim --- kind: PersistentVolume apiVersion: v1 metadata: name: postgres-pv-volume labels: type: local app: postgres spec: storageClassName: manual capacity: storage: 5Gi accessModes: - ReadWriteMany hostPath: path: "/mnt/data" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: postgres-pv-claim labels: app: postgres spec: storageClassName: manual accessModes: - ReadWriteMany resources: requests: storage: 5Gi --- apiVersion: v1 kind: ConfigMap metadata: name: postgres-config labels: app: postgres data: POSTGRES_DB: postgresdb POSTGRES_USER: postgres POSTGRES_PASSWORD: root --- apiVersion: v1 kind: Service metadata: name: postgres labels: app: postgres spec: ports: - name: postgres port: 5432 nodePort: 30432 type: NodePort selector: app: postgres
StorageClass配置文件
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: manual provisioner: kubernetes.io/aws-ebs parameters: type: gp20 reclaimPolicy: Retain allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate
Pod日志(最后12行)
2022-11-21 09:52:34.737 UTC [1] LOG: starting PostgreSQL 15.1 (Debian 15.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit 2022-11-21 09:52:34.737 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 2022-11-21 09:52:34.737 UTC [1] LOG: listening on IPv6 address "::", port 5432 2022-11-21 09:52:34.739 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2022-11-21 09:52:34.743 UTC [26] LOG: database system was shut down at 2022-11-21 09:51:09 UTC 2022-11-21 09:52:34.748 UTC [1] LOG: database system is ready to accept connections 2022-11-21 09:54:48.522 UTC [1] LOG: received fast shutdown request 2022-11-21 09:54:48.525 UTC [1] LOG: aborting any active transactions 2022-11-21 09:54:48.527 UTC [1] LOG: background worker "logical replication launcher" (PID 29) exited with exit code 1 2022-11-21 09:54:48.529 UTC [24] LOG: shutting down 2022-11-21 09:54:48.531 UTC [24] LOG: checkpoint starting: shutdown immediate 2022-11-21 09:54:48.537 UTC [24] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.001 s, total=0.008 s; sync files=2, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB 2022-11-21 09:54:48.546 UTC [1] LOG: database system is shut down
Pod状态
root@k8smasternode-virtual-machine:/home/k8smasternode# kubectl get pods NAME READY STATUS RESTARTS AGE postgres-7dff8d6d74-8q9fd 0/1 CrashLoopBackOff 6 (<invalid> ago) 22m
排查与修复步骤
1. 存储配置问题(核心原因)
- StorageClass驱动不兼容:使用了AWS EBS存储驱动,但你的环境是VMware ESXi本地节点,该驱动无法工作。
- hostPath权限错误:PostgreSQL容器以UID 999的
postgres用户运行,宿主机/mnt/data目录权限不匹配,导致无法写入数据目录触发重启。 - accessModes冲突:hostPath类型PV不支持
ReadWriteMany,仅支持ReadWriteOnce(单节点本地存储无法多节点共享)。
修复操作:
- 修改StorageClass为静态PV适配的无自动配置类型:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: manual provisioner: kubernetes.io/no-provisioner reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: Immediate - 调整PV和PVC的accessModes为
ReadWriteOnce:# PV部分 accessModes: - ReadWriteOnce # PVC部分 accessModes: - ReadWriteOnce - 在工作节点node1上修改数据目录权限:
sudo chown -R 999:999 /mnt/data sudo chmod 700 /mnt/data
2. 验证Pod重启问题
存储修复后,删除现有Pod让Deployment重新创建:
kubectl delete pod postgres-7dff8d6d74-8q9fd
查看Pod状态是否变为Running,并确认日志无自动关机记录。
3. 修复NodePort连接问题
Pod正常运行后,执行以下操作:
- 开放工作节点node1的30432端口:
sudo ufw allow 30432/tcp - 验证Service与Pod的关联状态:
确认kubectl describe service postgresEndpoints字段显示Pod的IP和5432端口。 - 测试连接:
psql -h <node1-ip> -p 30432 -U postgres -d postgresdb
内容的提问来源于stack exchange,提问作者user19238163
相关产品推荐
相关产品推荐

