簡體   English   中英

如何使 XFS 配額在 DigitalOcean 上的 Kube.netes 卷中工作?

[英]How to make XFS quotas work in Kubernetes volumes on DigitalOcean?

我需要幫助使 XFS 配額在 DigitalOcean 上的 Kube.netes 中工作。

我的問題本質上是xfs_quota工具似乎只有當一個人也可以訪問磁盤設備時才工作,而不僅僅是掛載的卷。 但是,無論我嘗試什么,我似乎都無法同時訪問設備和安裝座。

我嘗試了卷掛載和原始塊卷。

卷掛載

這是我的存儲 class:

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

原始塊卷

我也嘗試改用原始塊卷:

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.

(為什么磁盤設備是只讀的?)

原始塊卷 - 帶分區

好的,所以我嘗試創建一個分區並對其進行格式化。 分區創建成功,但我無權訪問分區設備:

$ 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

我嘗試以privileged方式運行容器,這讓我可以訪問/dev中的更多設備,但后來我根本看不到我的原始塊卷設備。

接下來是什么?

如我所見,其中任何一個都適合我:

  1. 訪問底層塊設備以進行卷安裝。
  2. 訪問分區設備以便我可以掛載它。
  3. 能夠掛載原始塊卷(例如,通過使其不是只讀的,不管它是什么意思?)。
  4. 使xfs_quota工具不需要底層設備。

我相信我在幾個月前使用帶分區的原始塊卷使其工作,但是我忘記了 DigitalOcean 上的更改方式或某些更改,我似乎無法再創建和訪問分區。

非常感謝任何幫助,謝謝!

來自 DigitalOcean 的 Managed Kube.netes (DOKS) 團隊的 Timo。

您缺少的是/dev目錄的主機系統掛載。 如果你同時添加

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

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

在正確的地方顯示清單,事情應該按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM