Kubernetes - Pod 通过 mountOptions 共享 NFS 上的特定目录

标签 kubernetes nfs

我正在尝试设置一个 kubernetes 服务,其中多个 pod 共享 NFS 卷上的同一目录。 NFS 卷在 kubernetes 外部的特定目录中预先生成了一堆数据,供 pod 读取和写入。

我可以想到两种方法来尝试这个,但都不能正常工作。我们目前的做法是使用 NFS 选项直接在 pod 中创建卷,如下所示:

kind: Deployment
spec:
  template:
    spec:
      containers:
         ...
      volumes:
        - name: embeddings
          nfs:
            path: /data/embeddings
            server: fs-blahblah.efs.us-west-2.amazonaws.com

这基本上有效。所有 Pod 都会在 NFS 上看到相同的目录,该目录预先填充了数据,并且它们都可以访问该目录。 但是 据我所知,没有办法指定 NFS 挂载选项。唯一允许的其他选项是readonlyref我们需要调整 NFS 客户端中的一些内容,例如 noac

我能想到的另一种方法是使用 PersistentVolume。如果您使用 NFS 创建 PV,您可以指定挂载选项:

kind: PersistentVolume
spec:
  mountOptions:
    - nfsvers=4.1
    - noac

但我不知道如何让 pod 访问 PV 中的特定目录。我的理解是这是不可能的 - 因为 pod 无法挂载 PV,它们只能挂载 PVC,并且据我所知,您无法为 PVC 选择特定目录,也不能让多个 pod 共享 PVC,这正是我特别想要的。另外 PVC 的语义似乎是错误的 - 我不希望 k8s 在此驱动器上设置存储限制,我希望所有 Pod 使用它们想要/需要的磁盘上的所有空间。但也许它仍然可以工作?

那么,如何在指定 mountOptions 的同时让多个 pod 访问 NFS 卷上的同一特定目录?

最佳答案

NFS 卷支持access mode ReadWriteMany。这意味着您可以多次安装它。

claim仅尝试查找与其规范匹配的卷,您仍然安装该卷而不是声明。该声明只是表达您想要安装的卷的外观的一种方式。
也许某些集群管理员已经创建了您可以声明的卷(如果它们符合您的条件)。或者您让存储类根据声明创建卷。
在下面的示例中,规范明确要求具有该名称的卷,因此在这种情况下,即使给出了所有其他标准,也没有其他卷可以匹配。
您可以使用 claimRef 进一步加强这种联系。位于该卷上,这将阻止除引用的声明之外的任何其他声明来声明该卷。

你是对的,如果你想指定mount options,你必须走数量+声明的方式。对于 NFS。

请注意 capacity在此示例中实际上并没有执行任何操作,预先存在的 NFS 卷具有实际 NFS 的容量,而不是您指定的容量。您仍然需要在 list 中提供一些容量,这是 Kubernetes 所要求的。它可以是任意值,没关系。

又,东西是空的storage class 。这是因为您不想通过存储类创建 NFS,而是使用 Kubernetes 外部预先创建的 NFS。如果您不指定存储类别,则将使用默认类别,这不是您想要的。因此,需要空字符串。

关于路径,如果你想将NFS内部的不同路径挂载到不同的Pod或者将同一个Pod的不同路径下的同一个NFS挂载到不同的位置,可以使用subPath 。尽管您的问题似乎并不需要它。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-nfs-volume
spec:
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/embeddings
    server: fs-blahblah.efs.us-west-2.amazonaws.com
  mountOptions:
    - vers=4
    - minorversion=1
    - noac
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-nfs-claim
spec:
  volumeName: my-nfs-volume
  storageClassName: ""
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mounter-fleet
spec:
  replicas: 5
  selector:
    matchLabels:
      app: mounter-fleet
  template:
    metadata:
      labels:
        app: mounter-fleet
    spec:
      containers:
        - name: mounter
          image: busybox
          command: ["sleep", "infinity"]
          volumeMounts:
            - name: nfs
              mountPath: /mnt/nfs
      volumes:
        - name: nfs
          persistentVolumeClaim:
            claimName: my-nfs-claim

关于Kubernetes - Pod 通过 mountOptions 共享 NFS 上的特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71329701/

相关文章:

kubernetes - kube-apiserver healthz 调用中检查了什么?

kubernetes - 具有2个入口的Kubernetes(nginx)

ssl - kubectl 无法连接到服务器 : x509: certificate signed by unknown authority

使用 Ansible 的 Docker NFS 卷

git - 推送到 NFS 共享上的 Git 存储库失败

kubernetes - 无法连接到卡夫卡经纪人

amazon-web-services - kubectl exec 命令失败并显示 : Upgrade request required

Solr 解决 NFS 问题

java - Android NFS 客户端

hadoop - MapR 分发中使用的容器架构是什么?