3 min read | by Jordi Prats
Velero is an open-source tool that helps you backup, restore, and migrate Kubernetes resources and volumes. It provides a simple and reliable way to protect your Kubernetes applications and data from data loss or disasters. Although Velero supports multiple cloud providers, in this post we are just going to see how to install it on AWS (both using IRSA and an explicit IAM role)
In order to allow Velero to handle Snapshots (for PersistentVolumes) and being able to backup data to a S3 bucket, we'll need to add the following permissions, setting the S3 bucket we want to use:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeVolumes",
"ec2:DescribeSnapshots",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:CreateSnapshot",
"ec2:DeleteSnapshot"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME"
]
}
]
}
Assuming we have attached the previous policy to an IAM user, we can configure velero to use it's static credentials by creating a file an aws config file as follows:
$ cat velero_aws_user_cred
[default]
aws_access_key_id=AACCESSKEY
aws_secret_access_key=SeCr3t
With this file present in the current directory we can use helm to install velero (after adjusting the values for bucket name
and region region
to our needs):
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero \
--namespace velero --create-namespace \
--set-file 'credentials.secretContents.cloud=./velero_aws_user_cred' \
--set 'configuration.provider=aws' \
--set 'configuration.backupStorageLocation.bucket=BUCKET_NAME' \
--set 'configuration.backupStorageLocation.config.region=us-west-2' \
--set 'configuration.volumeSnapshotLocation.name=default' \
--set 'configuration.volumeSnapshotLocation.config.region=us-west-2' \
--set 'initContainers[0].name=velero-plugin-for-aws' \
--set 'initContainers[0].image=velero/velero-plugin-for-aws' \
--set 'initContainers[0].volumeMounts[0].mountPath=/target' \
--set 'initContainers[0].volumeMounts[0].name=plugins'
We'll see how the AWS credentials will be pushed into this secret:
$ kubectl get secrets velero -n velero
NAME TYPE DATA AGE
velero Opaque 1 78s
If we want to use IRSA we'll just need to make sure it has the correct annotation, to do se we can use the following command (updating as well the region
, bucket name
and role ARN
)
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero \
--namespace velero --create-namespace \
--set 'configuration.provider=aws' \
--set 'serviceAccount.server.annotations.eks\.amazonaws\.com/role-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>' \
--set 'configuration.backupStorageLocation.bucket=S3_BUCKET' \
--set 'configuration.backupStorageLocation.config.region=us-west-2' \
--set 'configuration.volumeSnapshotLocation.name=default' \
--set 'configuration.volumeSnapshotLocation.config.region=us-west-2' \
--set 'initContainers[0].name=velero-plugin-for-aws' \
--set 'initContainers[0].image=velero/velero-plugin-for-aws' \
--set 'initContainers[0].volumeMounts[0].mountPath=/target' \
--set 'initContainers[0].volumeMounts[0].name=plugins'
This will annotate Velero's ServiceAccount to use the role ARN we are setting:
$ kubectl describe sa velero-server
Name: velero-server
Namespace: velero
Labels: app.kubernetes.io/instance=velero
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=velero
helm.sh/chart=velero-3.1.6
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>
meta.helm.sh/release-name: velero
meta.helm.sh/release-namespace: velero
Image pull secrets: <none>
Mountable secrets: <none>
Tokens: <none>
Events: <none>
Either way, both methods provide secure authentication for Velero to interact with AWS services: IAM User provides more fine-grained control over permissions but requires managing access keys, while IAM Role offers a more secure and seamless integration with AWS services but requires additional configuration and an additional trust policy to make it work.
Posted on 12/04/2023