Я пытаюсь развернуть 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
subdir в /postgresql/data
, которая будет исходной точкой монтирования данных Postgres.
Но когда я пытаюсь развернуть модуль Postgres, он останавливается с ошибкой 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
, все нормально работает.
Как мне подойти к этому?
После более внимательного чтения журнала ошибок Postgres я понял, что проблема в том, что я установите путь к точке монтирования и путь к данным как один и тот же каталог. Эта конкретная часть сообщения журнала в контейнере Postgres является важной:
Using a mount point directly as the data directory is not recommended.
Create a subdirectory under the mount point.
Я изменил значение PGDATA
env var быть /var/lib/postgresql/data/pgdata
(это каталог данных БД) и точка монтирования, которая должна быть /var/lib/postgresql/data
(это каталог, из которого Postgres инициализирует себя).
После этого изменения все заработало как шарм.
Вы объявляете поле PGDATA, которое может быть причиной проблемы. Я столкнулся с той же ошибкой, это происходит потому, что в этом каталоге уже есть папка LOST + FOUND, однако контейнер хочет, чтобы это был пустой каталог. Предоставление поля subPath решает эту проблему. Пожалуйста, попробуйте это, это должно решить проблему, и вам не нужно поле PGDATA. Добавить subPath в какую-то папку. Пожалуйста, прочтите следующие манифесты.
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