Instalando velero en kubernetes sobre vSphere
Velero que es una herramienta open source que nos permite realizar backups de objetos kubernetes en conjunto con snapshots de los volúmenes que estos utilizan. Es una herramienta muy útil utilizada para restauración en caso de pérdida, para replicar ambientes de trabajo en otros clusters como así también para migrar clusters.
En este post vamos a hacer una breve introducción a sus componentes y su
funcionamiento para luego instalarlo en un cluster kubernetes desplegado sobre
VMware/vSphere
.
Comencemos…
¿Cómo funciona velero?
Velero consiste en un servidor instalado en el cluster y un cliente que se ejecuta en forma local mediante la linea de comandos.
Al ejecutar un comando en nuestras computadoras se crea un CRD en el cluster que representa la operación pedida. Este CRD es observado por un controller que lo reconoce y ejecuta las acciones necesarias para completar la tarea.
Tomemos el caso de un backup:
- El usuario ejecuta
velero backup create my-first-backup
- Se crea el CRD
backups.velero.io
en el cluster. - El controller lo ve y pide al api server cada objeto a resguardar.
- El controller genera archivos .tar.gz que envia a un object store.
En caso de que existan volúmenes, se pueden crear snapshots de los mismos de forma que al ser restaurados estos tengan el mismo estado que cuando fueron resguardados.
Velero se apoya en un sistema de plugins para su funcionamiento. Estos plugins se encargan de interactuar tanto con el object store como con la infraestructura subyacente para el manejo de discos.
Instalación
Cliente
Instalar el cliente de velero es tan sencillo como bajar un binario y agregarlo a nuestro path.
Servidor
Primero tenemos que determinar que provider vamos a utilizar. En este caso
trabajaremos sobre un cluster en VMware/vSphere
por lo que utilizaremos
velero-plugin-for-vsphere.
En caso de trabajar sobre otra infraestructura podemos ver el listado de providers de velero donde se detallan sus funcionalidades.
Este provider no cuenta con un object store
propio por lo que antes de instalar
el servidor hemos instalado MiniO, un object store
open
source compatible con S3. Su instalación es muy sencilla y se puede realizar
mediante helm con el
siguiente chart.
Teniendo disponible el object store
que utilizara velero debemos configurar el
cluster para que funcione con el provider, quien se encargara de interactuar con
vSphere.
Plugin de velero para vSphere
Este plugin se encarga de manejar los snapshots de volúmenes en vSphere, de forma tal que en nuestros backups no se guardan datos de los volúmenes sino referencias a los snapshots almacenados en el datacenter.
Para que este plugin funcione se deben cumplir los siguientes requisitos:
-
Se debe tener abierto el puerto
902
en cada host que albergue a los nodos del cluster kubernetes. -
Se debe contar con un usuario con los permisos relativos CSI driver de vSphere. Estos se pueden consultar aquí
-
El usuario anterior debe contar tambien con los permisos relativos a VDDK. Estos permisos pueden consultarse aquí y deben ser aplicados a nivel de vCenter con propagacion.
En caso de no contar con estos permisos configurados correctamente nos encontraremos con errores 3014 (falta de autorización) y no podremos bajar ni borrar snapshots.
Una que cumplimos estos requisitos, debemos agregar dos objetos que se utilizan para configurar el plugin:
- Creamos un secreto que contiene las credenciales de acceso del usuario mencionado previamente, el vCenter y el id del cluster sobre el que se trabaja. Para ello creamos un archivo de configuración y luego el secreto de la siguiente manera:
# csi-vsphere.conf
[Global]
cluster-id="my-cluster"
[VirtualCenter "<ip-vcenter>"]
user = "<usuario>"
password = "<password>"
kubectl -n velero create secret generic --from-file csi-vsphere.conf
- Creamos un configmap en donde establecemos el tipo de cluster, el nombre del secreto creado en el paso anterior y el namespace de dicho secreto.
cat <<EOF | kubectl -n <velero-namespace> apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: velero-vsphere-plugin-config
data:
cluster_flavor: VANILLA
vsphere_secret_name: velero-vsphere-config-secret
vsphere_secret_namespace: velero
EOF
Instalación de velero
Para instalar velero en el cluster nos valemos de su chart oficial.
Primero agregamos el repositorio:
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
Y creamos el archivo de valores que aplicaremos al chart, a modo de ejemplo vemos el siguiente archivo:
# values.yaml
velero:
initContainers:
- name: velero-plugin-for-aws
image: velero/velero-plugin-for-aws:v1.1.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /target
name: plugins
- name: velero-plugin-for-vsphere
image: vsphereveleroplugin/velero-plugin-for-vsphere:v1.3.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /target
name: plugins
configuration:
provider: aws
backupStorageLocation:
bucket: <nombre_bucket>
config:
region: minio
s3ForcePathStyle: true
s3Url: <url_de_minio>
volumeSnapshotLocation:
name: vsphere-volumes
provider: vsphere
serviceAccount:
server:
name: velero
snapshotEnabled: true
credentials:
useSecret: true
name: cloud-credentials
secretContents:
cloud: |
[default]
aws_access_key_id = <key_minio>
aws_secret_access_key = <access_key_minio>
deployRestic: true
Más información acerca de los valores de este chart puede verse aquí
Este archivo configura lo siguiente:
- Utiliza el plugin de AWS para interactuar con un
object store
. Ya que contamos con un MiniO el cual es compatible con S3. - Configuramos el plugin de vsphere para realizar los snapshots de volúmenes.
- Configura las credenciales para interactuar con minio.
- Habilitamos la creación de snapshots.
- Despliega soporte para restic.
Una vez que tenemos creado el archivo de valores instalamos velero ejecutando:
helm install velero vmware-tanzu/velero --namespace <velero-namespace> \
--create-namespace \
-f values.yaml
Una vez que finaliza la instalación y todos los pods se encuentran corriendo ya estamos en condiciones de comenzar a trabajar con velero.
En los próximos posts realizaremos backups de nuestros objetos, simularemos la pérdida de los mismos y restauraremos el cluster al estado previo.