我正在尝试在 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