Доступ к данным Postgresql кластера Kubernetes

#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 , вероятно, является лучшим решением для копирования базы данных. Я все еще хотел загрузить каталог томов, чтобы посмотреть, есть ли в нем полная база данных, когда модули содержат только часть всех таблиц. В конце концов оказалось, что это не так.