首页 > 解决方案 > 如何使用 NFS 部署具有持久卷的单实例 mongodb

问题描述

我有一个在我的笔记本电脑上运行的微服务。但是,我正在使用 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

我该怎么做?

标签: mongodbkubernetesdocker-composepersistent-storage

解决方案


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

将使用PersistentVolume Provisioner 提供的 PersistentVolumevolumeClaimTemplates提供稳定的存储

因此,对于您的用例,您需要storageclass使用 nfs 配置器进行创建。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

推荐阅读