Kubernetes Disk Expansion
So your Workload's Persistent Volume is almost full. How can you expand it? With Kubernetes 1.11 and above, this can now easily be done by just updating the Persistent Volume Claim storage specification.
My example in this post is tested in Google's Kubernetes Engine.
Let's get started!
Enabling Volume Expansion in Storage Class
To enable the disk resizing feature, ensure that the Storage Class that your Workload's Persistent Volume Claim uses is configured with allowVolumeExpansion: true
.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard parameters: type: pd-standard provisioner: kubernetes.io/gce-pd allowVolumeExpansion: true # ensure that this is true
A Side Note for StatefulSet Workloads
If you want to resize a disk for a StatefulSet with a configured volumeClaimTemplates
like the following,
volumeClaimTemplates: - metadata: name: postgresql-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: standard
you will only have to modify the Persistent Volume Claim that it has provisioned.
Resizing a Persistent Volume Claim
Find the Persistent Volume Claim to resize.
kubectl get pvc -l app=postgresql
Let's say you want to update postgresql-storage-postgresql-02-1 from 1Gi to 10Gi
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE postgresql-storage-postgresql-01-0 Bound pvc-613c74c3-66b5-11e9-a602-42010a8400c0 10Gi RWO standard 6m12s postgresql-storage-postgresql-01-1 Bound pvc-88f897b1-60d4-11e9-a602-42010a8400c0 5Gi RWO standard 7d11h postgresql-storage-postgresql-02-0 Bound pvc-727c167c-6089-11e9-a602-42010a8400c0 10Gi RWO standard 7d20h postgresql-storage-postgresql-02-1 Bound pvc-80421dab-6089-11e9-a602-42010a8400c0 1Gi RWO standard 7d20h
kubectl edit pvc postgresql-storage-postgresql-02-1
From your text editor, change 1Gi to 10Gi
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd creationTimestamp: "2019-04-16T20:52:09Z" finalizers: - kubernetes.io/pvc-protection labels: app: postgresql name: postgresql-storage-postgresql-02-1 namespace: default resourceVersion: "29892621" selfLink: /api/v1/namespaces/default/persistentvolumeclaims/postgresql-storage-postgresql-02-1 uid: 80421dab-6089-11e9-a602-42010a8400c0 spec: accessModes: - ReadWriteOnce dataSource: null resources: requests: storage: 1Gi # change this to 10Gi storageClassName: standard volumeName: pvc-80421dab-6089-11e9-a602-42010a8400c0 status: accessModes: - ReadWriteOnce capacity: storage: 1Gi # change this to 10Gi phase: Bound
After successfully modifying the Persistent Volume Claim, observe its status.
kubectl get pvc postgresql-storage-postgresql-02-1 -o yaml
This should be the example output. Observe the status at the very end of the YAML.
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd creationTimestamp: "2019-04-16T20:52:09Z" finalizers: - kubernetes.io/pvc-protection labels: app: postgresql name: postgresql-storage-postgresql-02-1 namespace: default resourceVersion: "33540657" selfLink: /api/v1/namespaces/default/persistentvolumeclaims/postgresql-storage-postgresql-02-1 uid: 80421dab-6089-11e9-a602-42010a8400c0 spec: accessModes: - ReadWriteOnce dataSource: null resources: requests: storage: 10Gi storageClassName: standard volumeName: pvc-80421dab-6089-11e9-a602-42010a8400c0 status: accessModes: - ReadWriteOnce capacity: storage: 1Gi conditions: - lastProbeTime: null lastTransitionTime: "2019-04-24T17:30:51Z" message: Waiting for user to (re-)start a pod to finish file system resize of volume on node. status: "True" type: FileSystemResizePending phase: Bound
Restart the Pod
The next step is to restart the Pod as recommended by Kubernetes.
kubectl delete pod postgresql-02-1
Then wait until the Pod starts running again.
Observe the Changes
After a successful Pod restart, check the status of the Persistent Volume Claim again and you should see that the storage has been updated.
kubectl get pvc postgresql-storage-postgresql-02-1 -o yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd creationTimestamp: "2019-04-16T20:52:09Z" finalizers: - kubernetes.io/pvc-protection labels: app: postgresql name: postgresql-storage-postgresql-02-1 namespace: default resourceVersion: "33541444" selfLink: /api/v1/namespaces/default/persistentvolumeclaims/postgresql-storage-postgresql-02-1 uid: 80421dab-6089-11e9-a602-42010a8400c0 spec: accessModes: - ReadWriteOnce dataSource: null resources: requests: storage: 10Gi storageClassName: standard volumeName: pvc-80421dab-6089-11e9-a602-42010a8400c0 status: accessModes: - ReadWriteOnce capacity: storage: 10Gi phase: Bound
Do kubectl exec
to the Pod and verify that the disk has been resized!
Run df -h
.
# df -h Filesystem Size Used Avail Use% Mounted on overlay 5.7G 4.7G 1.1G 83% / tmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 5.7G 4.7G 1.1G 83% /etc/hosts shm 64M 0 64M 0% /dev/shm /dev/sdc 9.9G 1.3G 8.6G 13% /var/lib/postgresql tmpfs 1.9G 12K 1.9G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 1.9G 0 1.9G 0% /sys/firmware
Magic!
Top comments (0)