Назад | Перейти на главную страницу

Ошибка монтирования тома postgres в k8s

Я пытаюсь развернуть 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