kubernetes - 如何使 XFS 配额在 DigitalOcean 上的 Kubernetes 卷中发挥作用?

标签 kubernetes digital-ocean quota xfs

我需要帮助来使 XFS 配额在 DigitalOcean 上的 Kubernetes 中发挥作用。

我的问题本质上是,xfs_quota 工具似乎只有在还可以访问磁盘设备(而不仅仅是已安装的卷)时才能工作。然而,无论我尝试什么,我似乎都无法访问设备和安装座。

我尝试了卷安装和原始 block 卷。

卷安装

这是我的存储类别:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: block-storage-retain-xfs-prjquota
provisioner: dobs.csi.digitalocean.com
parameters:
  fsType: xfs
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
mountOptions:
  - prjquota

然后我声明一个新卷并将其添加到 Pod 中,如下所示:

volumeClaimTemplates:
  - metadata:
      name: my-storage
      namespace: my-namespace
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: block-storage-retain-xfs-prjquota
      resources:
        requests:
          storage: 1Gi

并安装它:

volumeMounts:
  - name: my-storage
    mountPath: "/var/www"

在 Pod 中,所有内容都已正确安装,我可以访问该卷(我可以在其中创建内容)并且安装标志已正确设置:

$ mount | grep -i www
/dev/disk/by-id/scsi-0DO_Volume_pvc-650ccba6-3177-45b5-9ffb-0ac2a931fddc on /var/www type xfs (rw,relatime,attr2,inode64,prjquota)

但是,磁盘设备在 Pod 中不可用:

$ ls -la /dev/disk/by-id/scsi-0DO_Volume_pvc-650ccba6-3177-45b5-9ffb-0ac2a931fddc
ls: cannot access '/dev/disk/by-id/scsi-0DO_Volume_pvc-650ccba6-3177-45b5-9ffb-0ac2a931fddc': No such file or directory

(事实上,整个/dev/disk/目录都不可用)

根据我的调查,缺乏对设备的访问权限是导致 XFS 工具失败的原因:

$ xfs_quota -x -c 'report -h' /var/www
xfs_quota: cannot setup path for mount /var/www: No such device or address

原始 block 体积

我还尝试切换到原始 block 卷:

volumeClaimTemplates:
  - metadata:
      name: my-storage
      namespace: my-namespace
    spec:
      accessModes:
        - ReadWriteOnce
      volumeMode: Block
      storageClassName: block-storage-retain-xfs-prjquota
      resources:
        requests:
          storage: 1Gi

并将其添加为:

volumeDevices:
  - name: my-storage
    devicePath: /dev/my-storage

这给了我设备,但由于某种原因我无法格式化/安装它(实际上既不是 XFS 也不是 ext4):

$ mkfs.xfs /dev/my-storage
mkfs.xfs: error - cannot set blocksize 512 on block device /dev/my-storage: Permission denied
$ mkfs.ext4 /dev/my-storage
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 18f07181-737c-4b68-a5fe-ccd7f2c50ff8
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

$ mount /dev/my-storage /var/www
mount: /var/www: cannot mount /dev/my-storage read-only.

有了 SYS_ADMIN Linux 功能,我实际上可以格式化它,但我仍然无法安装它:

$ mkfs.xfs -f /dev/my-storage
meta-data=/dev/my-storage        isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

$ mount /dev/my-storage /var/www
mount: /var/www: cannot mount /dev/my-storage read-only.

(为什么磁盘设备是只读的?)

原始 block 卷 - 带分区

好的,所以我尝试创建一个分区并格式化它。分区创建成功,但我无权访问分区设备:

$ fdisk -l /dev/my-storage
Disk /dev/my-storage: 1 GiB, 1073741824 bytes, 2097152 sectors
Disk model: Volume
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb4a24142

Device            Boot Start     End Sectors  Size Id Type
/dev/my-storage1        2048 2097151 2095104 1023M 83 Linux

但是,/dev/my-storage1 不存在:

$ ls -la /dev/my-storage*
brw-rw---- 1 root disk 8, 48 Oct 25 14:42 /dev/my-storage

我尝试以特权身份运行容器,这使我可以访问/dev中的更多设备,但后来我根本没有看到我的原始 block 卷设备。

接下来做什么?

据我所知,其中任何一个都适合我:

  1. 获取对底层 block 设备的访问权限以进行卷挂载。
  2. 访问分区设备,以便安装它。
  3. 能够挂载原始 block 卷(例如,通过使其不是只读的,无论这意味着什么?)。
  4. 使 xfs_quota 工具不需要底层设备。

我相信几个月前我使用带有分区的原始 block 卷使其工作,但要么我忘记了 DigitalOcean 上的方式或某些内容发生了变化,我似乎无法再创建和访问分区。

非常感谢任何帮助,谢谢!

最佳答案

来自 DigitalOcean 托管 Kubernetes (DOKS) 团队的 Timo。

您缺少的是 /dev 目录的主机系统挂载。如果您同时添加

 volumes:
 - name: device-dir
   hostPath:
     path: /dev

volumeMounts:
  - name: device-dir
    mountPath: /dev

在正确的位置显示 list ,事情应该按预期进行。

关于kubernetes - 如何使 XFS 配额在 DigitalOcean 上的 Kubernetes 卷中发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64525271/

相关文章:

tcp - Digital Ocean 上的负载均衡 Websockets

amazon-web-services - 亚马逊网络服务上下文中的配额是什么

linux - linux获取硬盘配额的命令

python - 将文件复制到Kubernetes Pod

spring-boot - 在同一Kubernetes集群中从一个Pod调用Rest API到另一个Pod

docker - 无法通过 Digital Ocean 液滴在 Docker 上使用 Shiny 进行端口映射

google-apps-script - 是否有 Google Apps 脚本配额仪表板?

python - 通过API部署Helm图表的代码示例?

kubernetes - Gitlab 10.1 部署到 Google Kubernetes Engine

ruby-on-rails - 在 Rails 应用程序上运行 ruby​​ 时出现问题