Как смонтировать том postgresql с помощью Aws EBS в Kubernete

  1. Сначала я создал постоянный том (EBS 10G) и соответствующее требование постоянного тома. Но когда я пытаюсь развернуть поды postgresql, как показано ниже (файл yaml):

test-postgresql.yaml

Получите ошибки из модуля:

initdb: каталог "/ var / lib / postgresql / data" существует, но не пуст. Он содержит каталог lost + found, возможно, из-за того, что он является точкой монтирования. Не рекомендуется использовать точку монтирования напрямую в качестве каталога данных. Создайте подкаталог под точкой монтирования.

Почему капсула не может использовать этот путь? Такие же тесты пробовал на миникубе. Никаких проблем не встретил.

  1. Я попытался изменить путь к каталогу монтирования тома на «/ var / lib / test / data», модули могут работать. Я создал новую таблицу и некоторые данные по ней, а затем убил этот модуль. Kubernete создал новый под. Но в новом не сохранились предыдущие данные и таблица.

Итак, как правильно смонтировать том postgresql с помощью Aws EBS в Kubernete, что позволяет воссозданным модулям повторно использовать исходную базу данных, хранящуюся в EBS?


person X.J    schedule 04.07.2018    source источник


Ответы (3)


Итак, как правильно смонтировать том postgresql с помощью Aws EBS

Вы на правильном пути ...

Ошибка возникает из-за того, что вы хотите использовать корневую папку смонтированного тома / в качестве каталога данных postgresql, а postgresql жалуется, что это не лучшая практика, поскольку он не пуст и уже содержит некоторые данные внутри (а именно каталог lost+found).

Намного лучше разместить каталог данных в отдельной пустой подпапке (например, /postgres) и дать postgresql «чистый лист» при создании его файловой структуры. У вас не было того же на minicube, поскольку вы, скорее всего, подключили папку хоста, в которой ничего не было (было пусто), и не вызывали такой жалобы.

Для этого вам потребуется сначала пустой subPath вашего тома ( пустая подпапка /postgres на вашем PV, например), смонтированная в соответствующую точку монтирования (/var/lib/posgresql/data) в вашем модуле. Обратите внимание, что вы можете назвать subPath и конечную папку точки монтирования одинаковыми именами, здесь они разные, как в примере, где папка test-db-volume/postgres будет смонтирована на модуле в папку /var/lib/postgresql/data:

...
volumeMounts:
- mountPath: /var/lib/postgresql/data
  name: test-db-volume
  subPath: postgres
...
person Const    schedule 04.07.2018
comment
Это отличный ответ. Я пробовал много решений, включая удаление потерянных + найденных после установки, но в конце концов нашел это простое рабочее решение. - person Shashwat Kumar; 07.10.2019
comment
Это также работает для томов на управляемых дисках Azure (не для файлов). - person C.Nivs; 27.08.2020

Я исправил это, указав postgres, где я хочу создать базу данных с помощью PGDATA env. Он создает пустой каталог и инициализирует БД. Если у вас его нет, предполагается, что вы хотите создать его в каталоге монтирования комнаты, который для меня имел каталог; ost + found, который не понравился postgres

containers:
  - name: postgres
    imagePullPolicy: Always
    image: postgres:9.6
    ports:
    - containerPort: 5432
      name: postgres
    env:
    - name: POSTGRES_DB
      value: "mydb"
    - name: PGDATA
      value: /var/lib/postgresql/data/pgdata
    volumeMounts:
      - mountPath: /var/lib/postgresql/data
        name: postgres-data
person Martin Naughton    schedule 20.03.2019
comment
Спасибо тебе за это. - person Woody; 18.06.2021

это из описания dockerhub ...

PGDATA Эту необязательную переменную можно использовать для определения другого местоположения - например, подкаталога - для файлов базы данных. По умолчанию это / var / lib / postgresql / data, но если объем данных, который вы используете, является точкой монтирования файловой системы (например, с постоянными дисками GCE), Postgres initdb рекомендует подкаталог (например, / var / lib / postgresql / data / pgdata), который будет содержать данные.

Итак, создайте еще один более глубокий каталог, и он работает

person Nikita Shesterikov    schedule 23.05.2019