This document provides guides on how to manage local volumes in your Kubernetes cluster. Before managing local volumes on your cluster nodes, here are some configuration requirements you must know:
- The local-volume plugin expects paths to be stable, including across reboots and when disks are added or removed.
- The static provisioner only discovers either mount points (for Filesystem mode volumes) or symbolic links (for Block mode volumes). For directory-based local volumes, they must be bind-mounted into the discovery directories.
Glossary:
- discovery directory: Directory on the host from which provisioner will discover both filesystem and block local PVs.
- provisioner: In our documents, provisioner indicates local-volume-provisioner program.
- local PV: Kubernetes local persistent volume.
- filesystem local PV: Local PV with Filesystem mode
- block local PV: Local PV with Block mode
- Create a directory for provisioner discovering
- Prepare and set up local volumes in discovery directory
- Deleting/removing the underlying volume
$ sudo mkdir -p /mnt/disks
NOTE:
- We use
/mnt/disks
as an example, but you can use any directory - This directory is configured in
hostDir
field in provisioner configuration and can only be configured for one storage class - If you want to configure more than one local storage class, create one directory for each storage class
After you prepared discovery directory, you can set up local volumes to be discovered by provisioner.
If you attached a disk onto your machine (e.g /dev/path/to/disk
). You
can format and mount it into discovery directory with the following commands:
- Format and mount
$ sudo mkfs.ext4 /dev/path/to/disk
$ DISK_UUID=$(sudo blkid -s UUID -o value /dev/path/to/disk)
$ sudo mkdir /mnt/disks/$DISK_UUID
$ sudo mount -t ext4 /dev/path/to/disk /mnt/disks/$DISK_UUID
- Persistent mount entry into /etc/fstab
$ echo UUID=`sudo blkid -s UUID -o value /dev/path/to/disk` /mnt/disks/$DISK_UUID ext4 defaults 0 2 | sudo tee -a /etc/fstab
NOTE:
- We use
/dev/path/to/disk
as a disk example, change it to real path of your device. - You can also adjust filesystem and mount options as you wish
- It's best practice to use UUID both in fstab entries and the directory name of mount point, see our best practices.
- Using a whole disk is best practice if you need IO isolation
- On some cloud platforms, they may provide mechanism to format and mount local disks automatically which is recommended. Please refer to cloud platform documentation.
Instead of mount root of disk filesystem into discovery directory, you can create multiple directory in disk, and bind mount them into discovery directory. By doing this, a disk can be shared by multiple local filesystem PVs. Here is an example:
- Format and mount
$ sudo mkfs.ext4 /dev/path/to/disk
$ DISK_UUID=$(blkid -s UUID -o value /dev/path/to/disk)
$ sudo mkdir /mnt/$DISK_UUID
$ sudo mount -t ext4 /dev/path/to/disk /mnt/$DISK_UUID
NOTE: we should not mount disk into discovery directory.
- Persistent mount entry into /etc/fstab
$ echo UUID=`sudo blkid -s UUID -o value /dev/path/to/disk` /mnt/$DISK_UUID ext4 defaults 0 2 | sudo tee -a /etc/fstab
- Create multiple directories and bind mount them into discovery directory
for i in $(seq 1 10); do
sudo mkdir -p /mnt/${DISK_UUID}/vol${i} /mnt/disks/${DISK_UUID}_vol${i}
sudo mount --bind /mnt/${DISK_UUID}/vol${i} /mnt/disks/${DISK_UUID}_vol${i}
done
- Persistent bind mount entries into /etc/fstab
for i in $(seq 1 10); do
echo /mnt/${DISK_UUID}/vol${i} /mnt/disks/${DISK_UUID}_vol${i} none bind 0 0 | sudo tee -a /etc/fstab
done
NOTE:
- Local PVs sharing one disk filesystem will have same capacity and will have no capacity isolation. If you want to separate a disk into multiple PVs with capacity isolation. You can separate disk into multiple partitions first.
If you want to use block devices directly, you can simply link them into discovery directory.
For safety, you must use the unique path of device.
Find unique path of device:
$ ls -l /dev/disk/by-id/
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-kdWgMJ-OOfq-ox5N-ie4E-NU2h-8zPJ-edX1Og -> ../../sde
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-VqD1G2-upe2-Xnek-PdXD-mkOT-LhSv-rUV2is -> ../../sdc
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf -> ../../sdb
For example, if you want to use /dev/sdb
, you must link
/dev/disk/by-id/lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf
not
/dev/sdb
.
Link it into discovery directory:
$ sudo ln -s /dev/disk/by-id/lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf /mnt/disks
Note that in provisioner configuration, you must have volumeMode
in storage
class map set to "Block".
Similar to the above instruction for block PVs, if you want to expose block devices directly without preformatting them, you can link them into the discovery directory.
For safety, you must use the unique path of device.
Find unique path of device:
$ ls -l /dev/disk/by-id/
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-kdWgMJ-OOfq-ox5N-ie4E-NU2h-8zPJ-edX1Og -> ../../sde
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-VqD1G2-upe2-Xnek-PdXD-mkOT-LhSv-rUV2is -> ../../sdc
lrwxrwxrwx 1 root root 9 Apr 18 14:26 lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf -> ../../sdb
For example, if you want to use /dev/sdb
, you must link
/dev/disk/by-id/lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf
not
/dev/sdb
.
Link it into discovery directory:
$ sudo ln -s /dev/disk/by-id/lvm-pv-uuid-yyTnct-TpUS-U93g-JoFs-6seh-Yy29-Dn6Irf /mnt/disks
Note that in provisioner configuration, you must have volumeMode
in storage
class map set to "Filesystem" (default if unspecified).
You can use parted or other tools to separate your disk into multiple partitions. This helps to isolate capacity. Here is an example:
sudo parted --script /dev/path/to/disk \
mklabel gpt \
mkpart primary 1MiB 1000MiB \
mkpart primary 1000MiB 2000MiB \
mkpart primary 2000MiB 3000MiB \
mkpart primary 3000MiB 4000MiB
sudo parted /dev/path/to/disk print
NOTE:
- Partition disk is dangerous, please check your command carefully, use at your own risk
- Adjust arguments according to your needs, refer to parted manual
After disks are partitioned, for each partition, you can follow above operation guide to format and discover as filesystem volume or use as block device.
When you want to decommission the local volume, here is a possible workflow.
- Stop the pods that are using the volume
- Remove the local volume from the node (ie unmounting, pulling out the disk, remove mount entries from /etc/fstab, etc)
- Delete the PVC
- The provisioner will try to cleanup the volume, but will fail since the volume no longer exists
- Manually delete the PV object