класс хранилища kubernetes не сохраняет существующие данные

#kubernetes

#kubernetes

Вопрос:

Мой том класса хранилища Kubernetes не сохраняет существующие данные, когда модуль удаляется и развертывается обратно с моей базой данных postgresql. Когда я удаляю модуль, создается новый модуль, но база данных пуста.

Я следил за различными версиями руководств (https://kubernetes.io/docs/concepts/storage/persistent-volumes /) но, похоже, ничего не работает.

Я вставляю все файлы YAML, потому что проблема может быть в комбинации.

хранилище-google.yaml

 apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: spingular-pvc
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 7Gi
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  zone: us-east4-a
  

jhipsterpress-postgresql.yml

 apiVersion: v1
kind: Secret
metadata:
  name: jhipsterpress-postgresql
  namespace: default
  labels:
    app: jhipsterpress-postgresql
type: Opaque
data:
  postgres-password: NjY0NXJxd24=
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jhipsterpress-postgresql
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: jhipsterpress-postgresql
    spec:
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: spingular-pvc
      containers:
      - name: postgres
        image: postgres:10.4
        env:
        - name: POSTGRES_USER
          value: jhipsterpress
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jhipsterpress-postgresql
              key: postgres-password
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/
---
apiVersion: v1
kind: Service
metadata:
  name: jhipsterpress-postgresql
  namespace: default
spec:
  selector:
    app: jhipsterpress-postgresql
  ports:
  - name: postgresqlport
    port: 5432
  type: LoadBalancer
  

jhipsterpress-deployment.yml

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: jhipsterpress
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jhipsterpress
      version: "v1"
  template:
    metadata:
      labels:
        app: jhipsterpress
        version: "v1"
    spec:
      initContainers:
        - name: init-ds
          image: busybox:latest
          command:
            - '/bin/sh'
            - '-c'
            - |
                while true
                do
                  rt=$(nc -z -w 1 jhipsterpress-postgresql 5432)
                  if [ $? -eq 0 ]; then
                    echo "DB is UP"
                    break
                  fi
                  echo "DB is not yet reachable;sleep for 10s before retry"
                  sleep 10
                done
      containers:
      - name: jhipsterpress-app
        image: galore/jhipsterpress
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: prod
        - name: SPRING_DATASOURCE_URL
          value: jdbc:postgresql://jhipsterpress-postgresql.default.svc.cluster.local:5432/jhipsterpress
        - name: SPRING_DATASOURCE_USERNAME
          value: jhipsterpress
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jhipsterpress-postgresql
              key: postgres-password
        - name: JAVA_OPTS
          value: " -Xmx256m -Xms256m"
        resources:
          requests:
            memory: "256Mi"
            cpu: "500m"
          limits:
            memory: "512Mi"
            cpu: "1"
        ports:
        - name: http
          containerPort: 8080
        readinessProbe:
          httpGet:
            path: /management/health
            port: http
          initialDelaySeconds: 20
          periodSeconds: 15
          failureThreshold: 6
        livenessProbe:
          httpGet:
            path: /management/health
            port: http
          initialDelaySeconds: 120
  

jhipsterpress-service.yml

 apiVersion: v1
kind: Service
metadata:
  name: jhipsterpress
  namespace: default
  labels:
    app: jhipsterpress
spec:
  selector:
    app: jhipsterpress
  type: LoadBalancer
  ports:
  - name: http
    port: 8080

  

Когда я включал политику сохранения, я получал эту ошибку:

 @cloudshell:~ (academic-veld-230622)$ kubectl apply -f storage-google.yaml
error: error validating "storage-google.yaml": error validating data: 
ValidationError(PersistentVolumeClaim.spec): unknown field "persistentVolumeReclaimPolicy" in io.k8s.api.core.v1.PersistentVolumeClaimSpec; if you choose to ignore these errors, turn validation off with --validate=false
  

Пожалуйста, если вы знаете полный пример общедоступного образа, который работает (в postgresql я могу заставить его работать с Mongo), я буду очень признателен.

Спасибо всем.

Ответ №1:

Обратите внимание, что для этого вам нужно, чтобы ваш PVC динамически предоставлял PV для удовлетворения его требований, тогда между PVC и PV будет постоянная привязка, и каждый раз, когда ваша рабочая нагрузка использует PVC, она будет использовать тот же PV. Конкретно указано в этом отрывке:

Если PV был динамически подготовлен для нового PVC, цикл всегда будет привязывать этот PV к PVC

Если в вашем случае постоянный диск Google подготавливается с помощью PVC, и вы можете убедиться, что в GCP каждый раз используется один и тот же PV, то, вероятно, это проблема с процессом запуска pod, когда он удаляет все данные. (Есть ли какая-либо причина, по которой вы используете /var/lib/postgresql/ vs /var/lib/postgresql ?)

Кроме того, persistentVolumeReclaimPolicy: Retain применяется к PV, а не к PVC. Для динамически подготовленных PVS значение равно Delete . В вашем случае это не будет применяться, поскольку ваш динамически выделяемый том должен быть привязан к вашему PVC. Другими словами, вы не восстанавливаете объем.

Сказав все это, рекомендуемый способ развертывания БД — использовать StatefulSets, аналогичный этому примеру mysql с использованием a volumeClaimTemplate .

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

1. Спасибо, Рико, я уверен, что вы правы. Я забыл о политике возврата. Я изменил /var/lib/postgresql, но все равно ломается. Я думал, что у меня был PVC в хранилище -google.yaml! (вид: PersistentVolumeClaim). Пример mysql работает, но я понятия не имею, как применить его к моей проблеме. Я попытался найти пример для 1 db master, без репликации, но не смог. Просто хочу, чтобы данные БД не удалялись при разрыве модуля БД. Все монолитные приложения для Jhipster должны столкнуться с той же проблемой при развертывании в GCP. Не могли бы вы помочь, пожалуйста?