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

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 postgres
    
    确认Endpoints字段显示Pod的IP和5432端口。
  • 测试连接:
    psql -h <node1-ip> -p 30432 -U postgres -d postgresdb
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:45:41