我正在尝试设置一个 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 挂载选项。唯一允许的其他选项是readonly
。 ref我们需要调整 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/