如何使用 NFS

问题描述

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

我该怎么做?

解决方法

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

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

因此,对于您的用例,您需要使用 nfs 配置程序创建 storageclassNFS Subdir external provisioner 是一个自动配置器,它使用您现有和已经配置的 NFS 服务器来支持通过 Persistent Volume Claims 动态配置 Kubernetes Persistent Volume。永久性卷被配置为 ${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
,

您的问题是 mongo StatefulSet 将如何使用您创建的 pvc?默认情况下它不会。它将通过 volumeClaimTemplates 自动创建新的 pvc 数量(取决于副本集的数量),它的命名方式如下: pvc-nfs-pv1-mongod-0 、 pvc-nfs-pv1-mongod-1 等.. 因此,如果您想使用您创建的 pvc,请更改名称以匹配 pvc-nfs-pv1-mongod-0 像这样

socket.on('message',(content) => {
    $('#messages').append(`<li>${content.bold} ${content.std}</li>`);
    $('#messages').scrollTop = $('#messages').height();
    console.log('scroll')
});

但是我不建议使用这种方法(问题:当您有许多其他副本集时..您是否必须手动创建所有 pvcs 和相应的 pv .. here 中提出了类似的问题和同样在 here 中,我建议使用动态 NFS 配置

希望对我有帮助

,

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

对于我的 postgres,这很好用。但是使用 mongodb kubernetes 运算符我无法运行它。一个 mongodb pod 永远处于“Pending”状态,因为我创建并手动绑定到卷的 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

,

好的,我有一个解决方案。它的工作原理是使用 matchLabels 选择器选择音量。

fig.add_annotation