postgres на k8s с glusterfs в качестве хранилища

#postgresql #kubernetes #glusterfs

Вопрос:

Я развертываю postgres базу данных на k8s томе и glusterfs в качестве тома.Но каждый раз, когда я перезапускаю свой модуль, все данные теряются.Это почему?

 apiVersion: apps/v1       
kind: Deployment               
metadata:     
  name: postgres-deployment
  namespace: gitlab
  labels:                                                                  
    app: postgres 
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13.1
        ports:
        - containerPort: 5432
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: postgres
        env:
        - name: POSTGRES_USERNAME
          valueFrom:
            secretKeyRef:
              name: gitlab
              key: postgres_username
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: gitlab
              key: postgres_password
        - name: POSTGRES_DB
          valueFrom:
            secretKeyRef:
              name: gitlab
              key: postgres_db 
      volumes:
      - name: postgres
        glusterfs:
          endpoints: glusterfs-cluster
          path: gv


 

Комментарии:

1. Это действительно звучит правильно … Вы проверили, что содержимое /var/lib/postgresql действительно содержит вашу базу данных? Что ваш том действительно смонтирован в нужном месте? Можете ли вы попытаться подключить этот том с другого клиента, пока ваше развертывание масштабируется до 0 реплик, проверьте наличие его данных? Хотя это должно сработать, есть ли причина не использовать PersistentVolumeClaim?

Ответ №1:

Определите объекты ПВХ и PV. см.Ниже для справки.

 ---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: postgres-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10GB
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: postgres
  name: postgres-pv-claim
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10GB
 

Затем привяжите ПВХ к капсуле, как показано ниже

 apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: postgres
spec:
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        ...
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-pv-claim
      volumes:
      - name: postgres-pv-claim
        persistentVolumeClaim:
          claimName: postgres-pv-claim
 

Комментарии:

1. ПВХ требует динамической подготовки, а в случае GFS: heketi. Ничто в первоначальном посте не позволило бы нам поверить, что такое было настроено. Кроме того, конфигурация, упомянутая в первоначальном сообщении, строго соответствует документированным примерам Kubernetes: github.com/kubernetes/examples/tree/master/volumes/… . Кроме того, в вашем примере упоминается путь к хосту, что не является тем, что было запрошено в первую очередь, а также не будет работать с кластерами с включенными политиками безопасности — потребуется предоставить дополнительные привилегии учетной записи службы, на которой запущен ваш модуль Postgres.

2. это просто ссылка на то, как создавать pv и пвх, а затем привязывать пвх к определению pod при развертывании. Вам нужно сохранить эти файлы в соответствии с вашей средой.

Ответ №2:

  • В соответствии с документацией Kubernetes https://kubernetes.io/docs/concepts/storage/volumes/#glusterfs, В отличие от emptyDir, который стирается при удалении модуля, содержимое тома glusterfs сохраняется, и том просто размонтируется. Я предлагаю поднять вопрос по ссылке https://github.com/kubernetes/kubernetes/issues/new/choose
  • Если вы хотите установить GitLab с бэкэндом PostgresSQL, его будет проще использовать ниже диаграмм управления.

https://docs.gitlab.com/charts/

https://artifacthub.io/packages/helm/bitnami/postgresql

https://artifacthub.io/packages/helm/bitnami/postgresql-ha

Ответ №3:

Вы можете это сделать:

1.Для служб с отслеживанием состояния, таких как базы данных, для развертывания следует использовать контроллеры набора состояний;

2.Ресурсы данных хранилища должны быть общего типа, а не использовать в качестве хранилища локальные тома, которые могут быть запланированы для других узлов при создании объектов POD;