k8s 中 Postgres 挂载卷错误

Mil*_*iez 2 postgresql kubernetes google-kubernetes-engine

我正在尝试在PersistentVolumeClaimGKE 中部署 Postgres。根据此处的描述(请参阅 参考资料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
Run Code Online (Sandbox Code Playgroud)

/pgdata我在 中创建子目录/postgresql/data,这将是 Postgres 数据的原始挂载点。

但是当我尝试部署 Postgres pod 时,它因退避错误而停止,并且收到以下事件:

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
Run Code Online (Sandbox Code Playgroud)

这些是来自 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.
Run Code Online (Sandbox Code Playgroud)

因此,我为 mountpoint 创建了子目录,如 的建议initdb,然后它抱怨它。PVC 是在部署之前创建的,因此其中没有数据。

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

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

我该如何处理这个问题?

Mil*_*iez 7

在更仔细地阅读 Postgres 错误日志后,我意识到问题在于我将挂载点路径和数据路径设置为相同的 dir。Postgres 容器中日志消息的这一特定部分是关键部分:

Using a mount point directly as the data directory is not recommended.
Create a subdirectory under the mount point.
Run Code Online (Sandbox Code Playgroud)

我将 env var 的值更改PGDATA/var/lib/postgresql/data/pgdata(这是数据库数据目录),并将安装点更改为/var/lib/postgresql/data(这是 Postgres 从中初始化自身的目录)。

这次改变之后,它就像一个魅力。