Skip to main content

EBS

EBS CSI Driver

The EBS CSI driver is required to use EBS volumes with EKS. Install it as a managed addon:

cluster_addons = {
aws-ebs-csi-driver = {
most_recent = true
service_account_role_arn = module.ebs_csi_irsa.iam_role_arn
}
}

IRSA for the CSI driver

module "ebs_csi_irsa" {
source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
version = "~> 5.0"

role_name = "ebs-csi-driver-my-cluster"
attach_ebs_csi_policy = true

oidc_providers = {
main = {
provider_arn = module.eks.oidc_provider_arn
namespace_service_accounts = ["kube-system:ebs-csi-controller-sa"]
}
}
}

Volume types

TypeIOPSThroughputUse case
gp3Up to 16,000Up to 1,000 MB/sGeneral purpose — default choice
io2Up to 64,000Up to 1,000 MB/sHigh-performance databases
st1Throughput-optimizedUp to 500 MB/sSequential big data
sc1Cold HDDArchive / infrequent access

StorageClass (gp3)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain
allowVolumeExpansion: true

Volume snapshots

# Create a VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: ebs-vsc
driver: ebs.csi.aws.com
deletionPolicy: Delete
---
# Snapshot a PVC
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: postgres-snapshot-2024
spec:
volumeSnapshotClassName: ebs-vsc
source:
persistentVolumeClaimName: postgres-data

Restore from snapshot

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data-restore
spec:
accessModes: [ReadWriteOnce]
storageClassName: gp3
resources:
requests:
storage: 50Gi
dataSource:
name: postgres-snapshot-2024
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io