Failed to provision volume with StorageClass "gp3": invalid AWS VolumeType "gp3"

3 min read | by Jordi Prats

If we try to provision a gp3 Volume using a PVC on an EKS cluster we might get the invalid AWS VolumeType "gp3" error. This means we are using an outdated EBS CSI

We can check whether if we are able to use gp3 Volumes creating an StorageClass as follows:

kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:  name: gp3 provisioner: kubernetes.io/aws-ebs parameters:  type: gp3  fsType: ext4  volumeBindingMode: Immediate 

And then creating a test volume using a PVC:

kind: PersistentVolumeClaim apiVersion: v1 metadata:  name: testgp3 spec:  accessModes:  - ReadWriteOnce  resources:  requests:  storage: 10Gi  storageClassName: gp3 

If we need to update the EBS CSI, the PVC will remain in Pending state and we will get the following error if we describe the PersistentVolumeClaim:

$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pet2cattle-data Bound pvc-00b232c1-3603-4b15-80b0-a07d25bab876 20Gi RWO gp2 71m testgp3 Pending gp3 4s $ kubectl describe pvc testgp3 Name: testgp3 Namespace: pet2cattle StorageClass: gp3 Status: Pending Volume:  Labels: <none> Annotations: volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/aws-ebs Finalizers: [kubernetes.io/pvc-protection] Capacity:  Access Modes:  VolumeMode: Filesystem Used By: <none> Events:  Type Reason Age From Message  ---- ------ ---- ---- -------  Warning ProvisioningFailed 9s (x2 over 16s) persistentvolume-controller Failed to provision volume with StorageClass "gp3": invalid AWS VolumeType "gp3" 

To install a newer version, we can follow AWS's instructions on how to install the latest EBS CSI. Once we have installed it we can create the gp2 and gp3 StorageClasses using the following yaml:

kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:  name: ebs-gp2 provisioner: ebs.csi.aws.com parameters:  type: gp2  fsType: ext4  volumeBindingMode: WaitForFirstConsumer --- kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:  name: ebs-gp3 provisioner: ebs.csi.aws.com parameters:  type: gp3  fsType: ext4  volumeBindingMode: WaitForFirstConsumer 

Once we have the new StorageClasses deployed we will have to update the default StorageClass. In a nutshell, we can do it using kubectl patch as follows:

kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' kubectl patch storageclass ebs-gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' 

Repeating the kubectl get sc we can check that the new default StorageClass is the new gp2 StorageClass (ebs-gp2):

$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ebs-gp2 (default) ebs.csi.aws.com Delete WaitForFirstConsumer true 2d5h ebs-gp3 ebs.csi.aws.com Delete WaitForFirstConsumer true 2d5h gp2 kubernetes.io/aws-ebs Delete WaitForFirstConsumer true 184d 

We can, of course, set the gp3 instead, whatever suits best. If we create the PVC again we will see how the status transitions to bound:

$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE testgp3 Bound pvc-00b232c1-3603-4b15-80b0-a07d25bab876 10Gi RWO gp3 7s 

Posted on 21/09/2021