#postgresql #kubernetes #kubernetes-helm #psql #minikube
Вопрос:
У меня есть кластер kubernetes с двумя репликами базы данных PostgreSQL в нем, и я хотел увидеть значения, хранящиеся в базе данных.
Когда я exec
сам вхожу в один из двух модулей postgres ( kubectl exec --stdin --tty [postgres_pod] -- /bin/bash
) и проверяю базу данных изнутри, у меня есть только частичная часть базы данных. Остальные данные базы данных находятся в другом модуле Postgres, и я не вижу никакого каталога, созданного постоянными томами, в котором хранится вся база данных.
Короче говоря, я создаю 4 таблицы; в одном модуле postgres у меня есть 4 таблицы, но 2 пустые, в другом модуле postgres есть 3 таблицы, и таблицы, которые были пустыми в первом модуле, здесь заполнены данными.
Почему в капсулах нет одинаковых данных?
Как я могу получить доступ и загрузить всю базу данных?
пс. Я развертываю кластер с помощью HELM в мини-кубе.
Вот файлы YAML:
--- apiVersion: v1 kind: ConfigMap metadata: name: postgres-config labels: app: postgres data: POSTGRES_DB: database-pg POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres PGDATA: /data/pgdata --- kind: PersistentVolume apiVersion: v1 metadata: name: postgres-pv-volume labels: type: local app: postgres spec: storageClassName: manual capacity: storage: 1Gi accessModes: - ReadWriteMany hostPath: path: "/mnt/data" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: postgres-pv-claim spec: storageClassName: manual accessModes: - ReadWriteMany resources: requests: storage: 1Gi --- apiVersion: v1 kind: Service metadata: name: postgres labels: app: postgres spec: ports: - name: postgres port: 5432 nodePort: 30432 type: NodePort selector: app: postgres --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres spec: serviceName: postgres-service selector: matchLabels: app: postgres replicas: 2 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:13.2 volumeMounts: - name: postgres-disk mountPath: /data # Config from ConfigMap envFrom: - configMapRef: name: postgres-config volumeClaimTemplates: - metadata: name: postgres-disk spec: accessModes: ["ReadWriteOnce"] --- apiVersion: apps/v1 kind: Deployment metadata: name: postgres labels: app: postgres spec: selector: matchLabels: app: postgres replicas: 2 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:13.2 imagePullPolicy: IfNotPresent envFrom: - configMapRef: name: postgres-config volumeMounts: - mountPath: /var/lib/postgresql/data name: postgredb volumes: - name: postgredb persistentVolumeClaim: claimName: postgres-pv-claim ---
Комментарии:
1. Вы не должны напрямую взаимодействовать с файловой системой базы данных. Если вам нужно загрузить всю базу данных, используйте
pbdump
. Следуете ли вы какому-либо конкретному руководству по развертыванию postgres в kubernets ? Используете ли выDeployment
иStatafulset
в то же время ?2. Спасибо тебе, Марио. Использование
pgdump
было бы хорошим решением для загрузки базы данных, однако я хотел проверить конкретный сценарий загрузки каталога томов. Я объяснил это более подробно в своем ответе на этот пост.
Ответ №1:
Я нашел решение своей проблемы загрузки каталога томов, однако, когда я запускаю несколько реплик postgres, таблицы БД все еще разбросаны между стручками.
Вот что я сделал, чтобы загрузить том postgres:
Прежде всего, minikube поддерживает некоторые конкретные каталоги для тома.:
minikube настроен на сохранение файлов, хранящихся в следующих каталогах, которые созданы в виртуальной машине Minikube (или на вашем локальном хосте, если он работает на голом металле). При перезагрузке вы можете потерять данные из других каталогов.
/data /var/lib/minikube /var/lib/docker /tmp/hostpath_pv /tmp/hostpath-provisioner
Поэтому я изменил путь монтирования, чтобы он находился в /data
каталоге. Это сделало том базы данных видимым.
После этого я вошел по ssh в мини-куб и скопировал том базы данных в новый каталог (я использовал /home/docker
его как пользователь minikube
is docker
).
sudo cp -R /data/pgdata /home/docker
Том pgdata
все еще принадлежал root
(ошибка отказа в доступе), поэтому я изменил его на принадлежащий docker
. Для этого я также установил новый пароль, который я знал:
sudo passwd docker # change password for docker user sudo chown -R docker: /home/docker/pgdata # change owner from root to docker
Затем вы можете выйти и скопировать каталог на свой локальный компьютер:
exit scp -r $(minikube ssh-key) docker@$(minikube ip):/home/docker/pgdata [your_local_path].
записка
Совет Марио, который следует использовать pgdump
, вероятно, является лучшим решением для копирования базы данных. Я все еще хотел загрузить каталог томов, чтобы посмотреть, есть ли в нем полная база данных, когда модули содержат только часть всех таблиц. В конце концов оказалось, что это не так.