Volumes are expanded in two stages. First, Longhorn expands the frontend (the block device), then it expands the filesystem.
To prevent the frontend expansion from interference by unexpected data R/W, Longhorn supports offline expansion only. The detached
volume will be automatically attached to a random node with maintenance mode.
Rebuilding and adding replicas is not allowed during the expansion, and expansion is not allowed while replicas are rebuilding or being added.
If the volume was not expanded though the CSI interface (e.g. for Kubernetes older than v1.16), the capacity of the corresponding PVC and PV won’t change.
Prerequisite
- The Longhorn version must be v0.8.0 or higher.
- The volume to be expanded must be in the
detached
state.
Expand a Longhorn volume
There are two ways to expand a Longhorn volume: with a PersistentVolumeClaim (PVC) and with the Longhorn UI.
Via PVC
This method is applied only if:
- The PVC is dynamically provisioned by the Kubernetes with Longhorn StorageClass.
- The field
allowVolumeExpansion
should betrue
in the related StorageClass.
This method is recommended if it’s applicable, because the PVC and PV will be updated automatically and everything is kept consistent after expansion.
Usage: Find the corresponding PVC for Longhorn volume, then modify the requested spec.resources.requests.storage
of the PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"longhorn-simple-pvc","namespace":"default"},"spec":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"1Gi"}},"storageClassName":"longhorn"}}
pv.kubernetes.io/bind-completed: "yes"
pv.kubernetes.io/bound-by-controller: "yes"
volume.beta.kubernetes.io/storage-provisioner: driver.longhorn.io
creationTimestamp: "2019-12-21T01:36:16Z"
finalizers:
- kubernetes.io/pvc-protection
name: longhorn-simple-pvc
namespace: default
resourceVersion: "162431"
selfLink: /api/v1/namespaces/default/persistentvolumeclaims/longhorn-simple-pvc
uid: 0467ae73-22a5-4eba-803e-464cc0b9d975
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: longhorn
volumeMode: Filesystem
volumeName: pvc-0467ae73-22a5-4eba-803e-464cc0b9d975
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
Via Longhorn UI
Usage: On the volume page of Longhorn UI, click Expand
for the volume.
Filesystem expansion
Longhorn will try to expand the file system only if:
- The expanded size should be greater than the current size.
- There is a Linux filesystem in the Longhorn volume.
- The filesystem used in the Longhorn volume is one of the following:
- ext4
- XFS
- The Longhorn volume is using the block device frontend.
Handling Volume Revert
If a volume is reverted to a snapshot with smaller size, the frontend of the volume is still holding the expanded size. But the filesystem size will be the same as that of the reverted snapshot. In this case, you will need to handle the filesystem manually:
Attach the volume to a random node.
Log in to the corresponding node, and expand the filesystem.
If the filesystem is
ext4
, the volume might need to be mounted and umounted once before resizing the filesystem manually. Otherwise, executingresize2fs
might result in an error:resize2fs: Superblock checksum does not match superblock while trying to open ......
Couldn't find valid filesystem superblock.
Follow the steps below to resize the filesystem:
mount /dev/longhorn/<volume name> <arbitrary mount directory>
umount /dev/longhorn/<volume name>
mount /dev/longhorn/<volume name> <arbitrary mount directory>
resize2fs /dev/longhorn/<volume name>
umount /dev/longhorn/<volume name>
If the filesystem is
xfs
, you can directly mount, then expand the filesystem.mount /dev/longhorn/<volume name> <arbitrary mount directory>
xfs_growfs <the mount directory>
umount /dev/longhorn/<volume name>