k8s 中的 Postgres 挂载卷错误

k8s 中的 Postgres 挂载卷错误

我正在尝试在 GKE 中部署 Postgres PersistentVolumeClaim。根据描述在这里(查看PGDATA),如果安装外部卷,建议创建一个子目录。因此,这是我对 PG 部署所做的:

spec:
  containers:
    - name: postgres-dev
      image: "postgres:12.1"
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 5432
      env:
        - name: PGDATA
          value: "/var/lib/postgresql/data/pgdata"
      volumeMounts:
        - name: postgres-persistent-storage-dev
          mountPath: "/var/lib/postgresql/data/pgdata"
  volumes:
    - name: postgres-persistent-storage-dev
      persistentVolumeClaim:
        claimName: postgres-pvc-dev

/pgdata在中创建了子目录/postgresql/data,它将成为 Postgres 数据的原始挂载点。

但是当我尝试部署 Postgres pod 时,它会因 Back-off 错误而停滞,并且我收到以下事件:

Events:
  Type     Reason                  Age               From                                                  Message
  ----     ------                  ----              ----                                                  -------
  Normal   Scheduled               20s               default-scheduler                                     Successfully assigned default/postgres-dev-7f549754d-nm2lf to gke-cluster-pool-1-4ce1e4d6-m33c
  Normal   SuccessfulAttachVolume  15s               attachdetach-controller                               AttachVolume.Attach succeeded for volume "pvc-eea8ee4d-9d00-11ea-a854-42010a8a0057"
  Normal   Pulled                  9s (x2 over 10s)  kubelet, gke-cluster-pool-1-4ce1e4d6-m33c             Container image "postgres:12.1" already present on machine
  Normal   Created                 9s (x2 over 10s)  kubelet, gke-cluster-pool-1-4ce1e4d6-m33c             Created container postgres-dev
  Normal   Started                 9s (x2 over 10s)  kubelet, gke-cluster-pool-1-4ce1e4d6-m33c             Started container postgres-dev
  Warning  BackOff                 7s (x2 over 8s)   kubelet, gke-cluster-pool-1-4ce1e4d6-m33c             Back-off restarting failed container

这些是来自 Postgres 容器的日志:

initdb: error: directory "/var/lib/postgresql/data/pgdata" exists but is not empty
It contains a lost+found directory, perhaps due to it being a mount point.
Using a mount point directly as the data directory is not recommended.
Create a subdirectory under the mount point.

因此,我按照 的建议为挂载点创建了子目录initdb,然后它对此发出了抱怨。PVC 是在部署之前创建的,因此其中没有数据。

我也尝试使用全新的、不存在的目录/var/lib/postgres/data,但效果是一样的。

另一个有趣的点是,当我在 中设置它时minikube,一切都正常。

我该如何处理这个问题?

答案1

在仔细阅读了 Postgres 错误日志后,我意识到问题在于我将挂载点路径和数据路径设置为同一目录Postgres 容器中的日志消息的这个特定部分是至关重要的:

Using a mount point directly as the data directory is not recommended.
Create a subdirectory under the mount point.

我将环境变量的值更改PGDATA/var/lib/postgresql/data/pgdata(即 DB 数据目录),并将挂载点更改为/var/lib/postgresql/data(即 Postgres 从中初始化自身的目录)。

经过这次改变之后,效果非常好。

答案2

您正在声明 PGDATA 字段,这可能是导致问题的原因。我遇到了同样的错误,这是因为该目录中已经有一个 LOST+FOUND 文件夹,但是容器希望它是一个空目录。提供 subPath 字段可以解决这个问题。请尝试一下,它应该可以解决问题,您不需要任何 PGDATA 字段。添加子路径到某个文件夹。请阅读以下清单。

https://github.com/mendix/kubernetes-howto/blob/master/postgres-deployment.yaml

https://www.bmc.com/blogs/kubernetes-postgresql/

当涉及数据库部署时,通常应该使用状态集而不是部署。

        - name: postgredb
          mountPath: /var/lib/postgresql/data
         #setting subPath will fix your issue it can be pgdata or 
         #postgres or any other folder name according to your 
         #choice.
          subPath: postgres 

相关内容