Как развернуть один экземпляр mongodb с постоянным томом с помощью NFS

У меня на ноутбуке работает микросервис. Однако я использую docker compose. Я работаю над развертыванием в кластере Kubernetes, который я уже настроил. Я застрял в том, чтобы сделать данные постоянными. Например, вот мой mongodb в docker-compose

systemdb:
    container_name: system-db
    image: mongo:4.4.1
    restart: always
    ports:
      - '9000:27017'
    volumes:
      - ./system_db:/data/db
    networks:
      - backend

Поскольку это локальное решение, я выбрал сервер NFS. Я создал утверждение о постоянном томе и постоянном томе (pvc-nfs-pv1), которые, похоже, хорошо работают при тестировании с помощью nginx. Однако я не знаю, как развернуть набор состояний mongodb для использования pvc. Я не реализую набор реплик.

Вот мой ямл:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongod
spec:
  serviceName: mongodb-service
  replicas: 1
  selector:
    matchLabels:
      role: mongo
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongod-container
          image: mongo
          resources:
            requests:
              cpu: "0.2"
              memory: 200Mi
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: pvc-nfs-pv1
              mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: pvc-nfs-pv1
       annotations:
         volume.beta.kubernetes.io/storage-class: "standard"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 500Mi

Как мне это сделать?


person Denn    schedule 12.01.2021    source источник


Ответы (4)


volumeClaimTemplates используются для предоставления динамических томов. Итак, вы определяете один шаблон требования к объему, который будет использоваться для создания PersistentVolumeClaim для каждого модуля.

volumeClaimTemplates будет обеспечивать стабильное хранилище с использованием PersistentVolumes, предоставленных поставщиком PersistentVolume.

Итак, для вашего варианта использования вам нужно будет создать storageclass с помощью nfs provisioner. Внешний поставщик NFS Subdir - это автоматический поставщик, использующий ваш существующий и уже настроенный сервер NFS для поддержки динамической подготовки постоянных томов Kubernetes с помощью утверждений о постоянных томах. Постоянные тома предоставляются как ${namespace}-${pvcName}-${pvName}.

Вот пример того, как определить класс хранилища:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}" # waits for nfs.io/storage-path annotation, if not specified will accept as empty string.
  onDelete: delete
person acid_fuji    schedule 12.01.2021

Ваш вопрос в том, как mongo StatefulSet будет использовать созданный вами pvc? По умолчанию не. Он автоматически создаст количество новых pvc (в зависимости от количества наборов реплик) с помощью volumeClaimTemplates, и он будет называться так: pvc-nfs-pv1-mongod-0, pvc-nfs-pv1-mongod-1 и т. Д. Итак, если вы хотите использовать созданный вами ПВХ, измените имя, чтобы оно соответствовало pvc-nfs-pv1-mongod-0 примерно так

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    role: mongo
  name: pvc-nfs-pv1-mongod-0
  namespace: default
spec:
...
  volumeName: nfs-pv1
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
...

Однако я не рекомендую использовать этот метод (проблема: когда у вас много других наборов реплик .. вам нужно создавать все pvcs вручную и соответствующие pv) .. Подобные вопросы задаются в здесь, а также в здесь, я рекомендую использовать динамическую подготовку NFS.

Надеюсь я помог

person Shay    schedule 12.01.2021

Я не использую NFS, но я использую тома на hetzner.com, где работает мой сервер разработки. Но у меня точно такая же проблема: поскольку это моя система разработки, я регулярно ее разрушаю и перестраиваю. И тем самым я хочу, чтобы данные на моих томах пережили удаление всего кластера. И когда я его восстановлю, все тома будут подключены к правильному модулю.

Для моих postgres это работает нормально. Но с помощью оператора mongodb kubernetes я не могу запустить это. Один модуль mongodb всегда остается в состоянии Pending, потому что PVC, который я создал и привязал вручную к тому, уже привязан к тому. По крайней мере, мне так кажется.

Я благодарен за любую помощь, Тобиас

Я вижу точное сообщение:

0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims

ПВХ и ПВ:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-volume-system-mongodb-0
  labels:
    app: moderetic
    type: mongodb
spec:
  storageClassName: hcloud-volumes
  volumeName: mongodb-data-volume
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb-data-volume
  labels:
    app: moderetic
    type: mongodb
spec:
  storageClassName: hcloud-volumes
  claimRef:
    name: data-volume-system-mongodb-0
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  csi:
    volumeHandle: "11099996"
    driver: csi.hetzner.cloud
    fsType: ext4

И mongodb StatefulSet:

apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: system-mongodb
  labels:
    app: moderetic
    type: mongodb
spec:
  members: 1
  type: ReplicaSet
  version: "4.2.6"
  security:
    authentication:
      modes: ["SCRAM"]
  users:
    - name: moderetic
      db: moderetic
      passwordSecretRef:
        name: mongodb-secret
      roles:
        - name: clusterAdmin
          db: moderetic
        - name: userAdminAnyDatabase
          db: moderetic
      scramCredentialsSecretName: moderetic-scram-secret
  additionalMongodConfig:
    storage.wiredTiger.engineConfig.journalCompressor: zlib
  persistent: true
  statefulSet:
    spec:
      template:
        spec:
          containers:
            - name: mongod
              resources:
                requests:
                  cpu: 1
                  memory: 1Gi
                limits:
                  memory: 8Gi
            - name: mongodb-agent
              resources:
                requests:
                  memory: 50Mi
                limits:
                  cpu: 500m
                  memory: 256Mi
      volumeClaimTemplates:
        - metadata:
            name: data-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: hcloud-volumes
            resources:
              requests:
                storage: 10Gi
        - metadata:
            name: logs-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: hcloud-volumes
            resources:
              requests:
                storage: 10Gi

person Tobias Neubert    schedule 12.05.2021

Хорошо, у меня есть решение. Он работает просто путем выбора громкости с помощью селектора matchLabels.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb-data-volume
  labels:
    app: moderetic
    type: mongodb
    role: data
spec:
  storageClassName: hcloud-volumes
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  csi:
    volumeHandle: "11099996"
    driver: csi.hetzner.cloud
    fsType: ext4

---

---
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: system-mongodb
  labels:
    app: moderetic
    type: mongodb
spec:
  members: 1
  type: ReplicaSet
  version: "4.2.6"
  logLevel: INFO
  security:
    authentication:
      modes: ["SCRAM"]
  users:
    - name: moderetic
      db: moderetic
      passwordSecretRef:
        name: mongodb-secret
      roles:
        - name: clusterAdmin
          db: moderetic
        - name: userAdminAnyDatabase
          db: moderetic
      scramCredentialsSecretName: moderetic-scram-secret
  additionalMongodConfig:
    storage.wiredTiger.engineConfig.journalCompressor: zlib
  persistent: true
  statefulSet:
    spec:
      template:
        spec:
          containers:
            - name: mongod
              resources:
                requests:
                  cpu: 1
                  memory: 1Gi
                limits:
                  memory: 8Gi
            - name: mongodb-agent
              resources:
                requests:
                  memory: 50Mi
                limits:
                  cpu: 500m
                  memory: 256Mi
      volumeClaimTemplates:
        - metadata:
            name: data-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: hcloud-volumes
            resources:
              requests:
                storage: 10Gi
            selector:
              matchLabels:
                app: moderetic
                type: mongodb
                role: data
        - metadata:
            name: logs-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: hcloud-volumes
            resources:
              requests:
                storage: 10Gi
            selector:
              matchLabels:
                app: moderetic
                type: mongodb
                role: logs

person Tobias Neubert    schedule 13.05.2021