【问题标题】:How to deploy a single instance mongodb with persistant volume using NFS如何使用 NFS 部署具有持久卷的单实例 mongodb
【发布时间】:2021-04-17 04:44:58
【问题描述】:

我有一个在我的笔记本电脑上运行的微服务。但是,我正在使用 docker compose。我正在努力部署到我已经设置的 kubernetes 集群。我坚持让数据持久化。例如,这是我在 docker-compose 中的 mongodb

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

因为它是一个本地解决方案,所以我选择了 NFS 服务器。我创建了一个 Persistent Volume 和 Persistent Volume Claim (pvc-nfs-pv1),在使用 nginx 进行测试时似乎效果很好。但是,我不知道如何部署 mongodb statefulset 来使用 pvc。我没有实现副本集。

这是我的 yaml:

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

我该怎么做?

【问题讨论】:

    标签: mongodb kubernetes docker-compose persistent-storage


    【解决方案1】:

    volumeClaimTemplates 用于动态卷配置。因此,您要定义一个卷声明模板,该模板将用于为每个 pod 创建一个 PersistentVolumeClaim

    volumeClaimTemplates 将提供稳定的存储使用 PersistentVolumes 由 PersistentVolume Provisioner 提供

    因此,对于您的用例,您需要使用 nfs 配置器创建 storageclassNFS Subdir external provisioner 是一个自动配置器,它使用您的现有和已配置 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
    

    【讨论】:

      【解决方案2】:

      您的问题是 mongo StatefulSet 将如何使用您创建的 pvc?默认情况下它 不会 。它将通过 volumeClaimTemplates 自动创建新 pvc 的数量(取决于副本集的数量),并将如下命名: pvc-nfs-pv1-mongod-0 , pvc-nfs-pv1-mongod-1 等。 因此,如果您想使用您创建的 pvc,请更改名称以匹配 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 )..herehere,我推荐使用Dynamic NFS Provisioning

      希望我能帮上忙

      【讨论】:

        【解决方案3】:

        我不使用 NFS,而是在运行我的开发服务器的 hetzner.com 上使用卷。但我有完全相同的问题:因为它是我的开发系统,所以我会定期销毁和重建它。通过这样做,我希望我的卷上的数据在整个集群被删除后仍然存在。当我重建它时,所有的卷都应该安装到正确的 pod 上。

        对于我的 postgres 这工作得很好。但是使用 mongodb kubernetes 运算符我无法运行它。一个 mongodb pod 永远处于“待处理”状态,因为我创建并手动绑定到卷的 PVC 已经绑定到卷。或者在我看来是这样。

        感谢您的帮助, 托比亚斯

        我能看到的确切消息是:

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

        PVC 和 PV:

        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
        
        

        【讨论】:

          【解决方案4】:

          好的,我有一个解决方案。只需使用 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
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-10
            • 1970-01-01
            • 2017-09-03
            相关资源
            最近更新 更多