在 NFS 中设置 PVC,不挂载设置的 PVC 大小,而是设置整个 NFS 卷大小

Setting up PVC in NFS, doesn't mount the set PVC size, instead sets the whole NFS volume size

我们正在使用 NFS 卷(1TB 大小的 GCP 文件存储)来设置 RWX 许多访问 GCP 中的 PVC,这里的问题是: 例如,我分配了 5Gi 的 PVC 并将其安装到 /etc/nginx/test-pvc 下的 nginx pod,而不是仅仅分配 5Gi,而是分配了整个 NFS 卷大小。

我登录到 nginx pod 并执行了 df -kh:

df -kh
Filesystem           Size  Used Avail Use% Mounted on
overlay               95G   16G   79G  17% /
tmpfs                 64M     0   64M   0% /dev
tmpfs                 63G     0   63G   0% /sys/fs/cgroup
shm                   64M     0   64M   0% /dev/shm
/dev/sda1             95G   16G   79G  17% /etc/hosts
10.x.10.x:/vol 1007G  5.0M  956G   1% /etc/nginx/test-pvc
tmpfs                 63G   12K   63G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                 63G     0   63G   0% /proc/acpi
tmpfs                 63G     0   63G   0% /proc/scsi
tmpfs                 63G     0   63G   0% /sys/firmware

/etc/nginx/test-pvc 的大小是 1007G,这是我在 NFS 中的整个卷大小(1 TB),它应该是 5G 而不是,即使使用 space 5MB 实际上并没有使用/etc/nginx/test-pvc。为什么行为如此?

使用的 PV 和 PVC yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-test
spec:
  capacity:
    storage: 5Gi 
  accessModes:
  - ReadWriteOnce 
  nfs: 
    path: /vol
    server: 10.x.10.x
  persistentVolumeReclaimPolicy: Recycle 


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-claim1
spec:
  accessModes:
    - ReadWriteOnce 
  storageClassName: ""
  resources:
    requests:
      storage: 5Gi
  volumeName: pv-nfs-test

Nginx 部署 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pv-demo-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-pv-demo
  template:
    metadata:
      name: nfs-pv-pod
      labels:
        app: nfs-pv-demo
    spec:
      containers:
      - image: nginx
        name: nfs-pv-multi
        imagePullPolicy: Always
        name: ng
        volumeMounts:
          - name: nfs-volume-1
            mountPath: "/etc/nginx/test-pvc"
      volumes:
      - name: nfs-volume-1
        persistentVolumeClaim:
          claimName: nfs-claim1

有什么我遗漏的吗?或者这是 NFS 的行为?如果是这样,在生产中处理它的最佳方法是什么,因为我们将有多个其他 PVC,可能会导致一些混乱和容量拒绝问题。

Is there anything I'm missing ? Or is this the behaviour of NFS ?

不,什么都没有。这就是它的工作方式。而且它也不是 NFS 特有的。

5Gi 在您的 PV 中定义的存储容量更像是一个 声明 您有一个 PersistentVolume 对象5 GB 的底层存储空间。 但这只不过是一个声明而已。您不能以这种方式对可用磁盘容量施加任何限制。 因此,如果您的磁盘实际容量为 100 GB,最好在 PV 定义的此字段中声明100Gi 为了保持一致性。

您在 PVC 中设置的存储容量有点不同。可以理解为满足您的存储要求的最小存储容量。因此,如果您有 3 个不同的 PVs,它们具有以下容量(在 PV 定义中声明,无论它们的实际容量是多少):3Gi10Gi100Gi 并且您在 PersistentVolumeClaim 中申请了 5Gi,其中只有 10Gi100Gi 两个可以满足这样的要求。正如我上面所说的,声明为 3Gi 的最小磁盘实际上由一个具有 1000Gi 的相当大的磁盘支持并不重要。如果您在 kubernetes 环境中定义了一个代表此类磁盘的 PV 对象(并使其可供某些 PVC 使用,最后由某些使用它的 Pod 使用)并且您声明这个特定的 PV 只有 3Gi 的容量,您在其中请求 5GiPVC 无法验证磁盘的实际容量并“看到”这样的卷因为没有足够的容量来满足 5Gi.

的请求

为了说明它不是特定于 NFS,您可以创建一个 100 GB 的新 GCE 永久磁盘(例如,通过云控制台,这似乎是最简单的方法),然后您可以在 PVPVC 最终将由简单的 nginx pod 使用。这是描述 here.

因此您可以在 PV 中声明 10Gi(然后在 PVC 中最多声明 10Gi),尽管您的 GCE 永久磁盘实际上具有 100 GB 的容量。如果你连接到这样的 pod,你将不会看到 10Gi 的声明容量,而是磁盘的实际容量。而且它完全正常并且完全按照设计工作。

您可能认为它的工作方式类似于 LVM,您可以在其中创建一个由一个或多个磁盘组成的卷组,然后您可以创建尽可能多的逻辑卷,只要您的基础容量允许即可。 PVs 在 kubernetes 中不允许你做这样的事情。 您在 PV 定义中“设置”的容量只是一个声明,而不是任何类型的约束。 如果您需要将巨大磁盘的单独块安装到不同的 pods,您需要先将其分成多个分区,然后创建单独的 PV 个对象,每个对象都来自一个分区。