S3 Storage In Kubernetes
In Part VII: Cluster Backup, I set up Minio running on my laptop to provide S3 storage that Velero can use to backup the cluster. In this piece, Minio will be setup “in cluster”, using Longhorn. There are a few links discussion how to do this. I didn’t try this method, but did give this a go (with a bunch of modifications), and am documenting it here.
For starters, I’m using the Helm chart for Minio from Bitnami:
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update
We’ll grab the configuration settings so that they can be modified:
mkdir -p ~/workspace/picluster/minio-k8s cd ~/workspace/picluster/minio-k8s helm show values bitnami/minio > minio.yaml
Create a secret to be used to access Minio:
kubectl create secret generic minio-root-user --namespace minio --from-literal=root-password="DESIRED-PASSWORD" --from-literal=root-user="minime"
In minio.yaml, set auth existingSecret to “minio-root-user” so that the secret will be used for authentication, set defaultBucket to “kubernetes”, and set service type to “NodePort”. The Minio deployment can be created:
helm install minio bitnami/minio --namespace minio --values minio.yaml
The Minio console can be accessed by using a browser, a node’s IP and the NodePort port:
kubectl get svc -n minio NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio NodePort 10.233.60.69 <none> 9000:32602/TCP,9001:31241/TCP 78m
In this case, using a one of the node’s (10.11.12.190) http://10.11.12.190:31241. Use the username and password you defined above, when creating the secret.
Now, we can install Velero, using the default bucket we had created (one could create another bucket from the Minio UI), credentials file, and cluster IP for the Minio service:
cat minio-credentials [default] aws_access_key_id = minime aws_secret_access_key = DESIRED-PASSWORD velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.8.2 \ --bucket kubernetes \ --secret-file minio-credentials \ --use-volume-snapshots=false \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.233.60.69:9000
The backup location can be checked (and should be available):
velero backup-location get NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT default aws kubernetes Available 2024-02-12 20:43:23 -0500 EST ReadWrite true
Finally, you can test the backup and restore of a single deployment (using the example from Part VII, where we pulled the velero repo, which has an example NGINX app):
kubectl create namespace nginx-example kubectl create deployment nginx --image=nginx -n nginx-example velero backup create nginx-backup --selector app=nginx velero backup describe nginx-backup velero backup logs nginx-backup kubectl delete namespace nginx-example velero restore create --from-backup nginx-backup velero restore describe nginx-backup-20240212194128 kubectl delete namespace nginx-example velero backup delete nginx-backup velero restore delete nginx-backup
Side Bar
There is a Minio client, although it seems to be designed for use with a cloud based back-end or local installation. It has predefined aliases for Minio, and is designed to run and terminate on each command. Unfortunately, we need to set a new alias, so that it can be used with later commands. We can hack a way into use it.
First, we need to know the Cluster IP address of the Minio service, so that it can be used later:
kubectl get svc -n minio NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio NodePort 10.233.60.69 <none> 9000:32602/TCP,9001:31241/TCP 78m
We get the user/password, and then run the client so that an alias (using cluster IP 10.233.60.69, in this case) can be created and commands invoked.
export ROOT_USER=$(kubectl get secret --namespace minio minio-root-user -o jsonpath="{.data.root-user}" | base64 -d) export ROOT_PASSWORD=$(kubectl get secret --namespace minio minio-root-user -o jsonpath="{.data.root-password}" | base64 -d) kubectl run --namespace minio minio-client \ --tty -i --rm --restart='Never' \ --env MINIO_SERVER_ROOT_USER=$ROOT_USER \ --env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \ --env MINIO_SERVER_HOST=minio \ --image docker.io/bitnami/minio-client:2024.2.9-debian-11-r0 -- \ /bin/bash mc alias set myminio http://10.233.60.69:9000 $MINIO_SERVER_ROOT_USER $MINIO_SERVER_ROOT_PASSWORD mc admin info myminio ...