如何使用NFS部署具有持久卷的单实例mongodb

如何使用NFS部署具有持久卷的单实例mongodb,mongodb,kubernetes,docker-compose,persistent-storage,Mongodb,Kubernetes,Docker Compose,Persistent Storage,我的笔记本电脑上有一个微型服务。但是,我使用的是docker compose。我正在努力部署到我已经设置好的kubernetes集群。我一直坚持让数据持久化。这是我在docker compose中的mongodb systemdb: container_name: system-db image: mongo:4.4.1 restart: always ports: - '9000:27017' volumes: - ./syste

我的笔记本电脑上有一个微型服务。但是,我使用的是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服务器。我创建了一个持久卷和持久卷声明(pvc-nfs-pv1),在使用nginx进行测试时,它似乎工作得很好。但是,我不知道如何部署mongodb状态集来使用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

如何执行此操作?

volumeClaimTemplates
用于动态卷资源调配。因此,您定义了一个批量索赔模板,用于为每个pod创建一个
PersistentVolumeClaim

volumeClaimTemplates
将使用 由PersistentVolume供应器供应

因此,对于您的用例,您需要使用nfs provisioner创建
storageclass
。是一个自动资源调配器,它使用现有和已配置的NFS服务器通过持久卷声明支持Kubernetes持久卷的动态资源调配。持久卷设置为
${namespace}-${pvcName}-${pvName}

下面是一个如何定义存储类的示例:

apiVersion:storage.k8s.io/v1 种类:StorageClass 元数据: 名称:受管nfs存储 provisioner:fuseim.pri/ifs#或选择其他名称,必须与部署的环境provisioner_名称匹配 参数: pathPattern:“${.PVC.namespace}/${.PVC.annotations.nfs.io/storage path}”等待nfs.io/storage-path注释,如果未指定,将接受为空字符串。 删除:删除
您的问题是mongo StatefulSet将如何使用您创建的pvc?默认情况下,不会。它将通过volumeClaimTemplates自动创建新pvc的数量(取决于复制集的数量),其名称如下:pvc-nfs-pv1-mongod-0、pvc-nfs-pv1-mongod-1等。。 因此,如果您想使用您创建的pvc,请更改名称以匹配pvc-nfs-pv1-mongod-0 像这样的

apiVersion:v1 种类:PersistentVolumeClaim 元数据: 标签: 角色:mongo 名称:pvc-nfs-pv1-mongod-0 名称空间:默认值 规格: ... 卷名:nfs-pv1 访问模式: -读写 资源: 请求: 储存量:500毫升 ... 但是,我不建议使用此方法(问题:当您有许多其他复制集时..您是否必须手动创建所有pv和相应的pv)。。下面是在和中提出的类似问题,我建议使用动态NFS资源调配


希望我能提供帮助

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

对于我的博士后来说,这很好。但是使用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状态集:

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


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