FlexVolume
FlexVolume: Enabling Advanced Storage in Kubernetes
FlexVolume is an extension mechanism for storage plugins supported by Kubernetes v1.8 and later. Similar to CNI plugins, it requires external plugins to place binary files in a pre-configured path (such as /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
), and all necessary dependencies must be installed on the system.
For new storage plugins, it is recommended to build based on CSI.
FlexVolume Interface
Creating a FlexVolume involves two steps:
Implementing the FlexVolume plugin interface, which includes commands such as
init/attach/detach/waitforattach/isattached/mountdevice/unmountdevice/mount/umount
(see LVM example and NFS example)Placing the plugin in the
/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/<driver>
directory
The FlexVolume interface includes:
init
: Called by kubelet/kube-controller-manager when initializing the storage plugin. The plugin needs to return whetherattach
anddetach
operations are necessary.attach
: Mounts the storage volume to the Node.detach
: Unmounts the storage volume from the Node.waitforattach
: Waits for theattach
operation to succeed (timeout is 10 minutes).isattached
: Checks if the storage volume is mounted.mountdevice
: Mounts the device to a specific directory for subsequent bind mounting.unmountdevice
: Unmounts the device.mount
: Mounts the storage volume to a specific directory.umount
: Unmounts the storage volume.
When storage drivers implement these interfaces, they need to return data in JSON format. The data format is as follows:
Utilizing FlexVolume
When using FlexVolume, you need to specify the volume's driver in the format <vendor~driver>/<driver>
, as in the example below using kubernetes.io/lvm
:
Note:
In version v1.7, deploying a new FlexVolume plugin required restarting kubelet and kube-controller-manager.
Starting from v1.8, restarting them is no longer necessary.
Rephrased version:
FlexVolume: Expanding Storage Possibilities in Kubernetes
FlexVolume is a storage plugin extension method supported by Kubernetes starting from version 1.8. In a manner akin to CNI plugins, it leverages external plugins that add binary files to an established path (e.g., /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
). Prior installation of all essential dependencies is a must.
It's advised for newcomers to storage plugin creation to use CSI as their building block.
The FlexVolume Blueprint
To spin up a FlexVolume, you'll need to:
Forge the FlexVolume plugin interface, which involves sequences like
init/attach/detach/waitforattach/isattached/mountdevice/unmountdevice/mount/umount
(check out the LVM example or the NFS example)Plant the plugin firmly in the
/usr/libexec/kubernetes/kubelet-plugins/volume/exec/<vendor~driver>/<driver>
garden
FlexVolume's interface boasts features such as:
'init': Springs into action when the kubelet or kube-controller-manager is getting the storage plugin up to speed. It determines if 'attach' and 'detach' are on the day's agenda.
'attach': Latches the storage volume onto the Node.
'detach': Peels the storage volume off the Node.
'waitforattach': Plays the waiting game for 'attach' to triumph (10-minute countdown).
'isattached': Plays detective, sleuthing if the storage volume is indeed attached.
'mountdevice': Transforms a specific directory to accommodate the device pre-bind mount.
'unmountdevice': Revers the mounting spell.
'mount': Sets up camp for the storage volume in its designated directory.
'umount': Breaks camp and leaves no trace.
Storage drivers that are up to the challenge of these interfaces should send back their stories in JSON format, something like this:
FlexVolume in Action
To get FlexVolume rolling, pin down the driver's identity in <vendor~driver>/<driver>
fashion. Here's how you do it, demonstrated by the kubernetes.io/lvm
case:
Things to bear in mind:
With v1.7, welcoming a new FlexVolume plugin into the fold meant restarting the kubelet and kube-controller-manager.
Come v1.8, this reboot ritual is a thing of the past.
最后更新于