Veeam + Kasten

Excelente noticia! La adquisición de Kasten por Veeam Software, lo cual amplia las bondades de protección de datos de Veeam en los centros de datos modernos con tecnologías de contenedores usando Kubernetes o k8s. En este post veremos la instalación, configuración y recuperación de contendores con Kasten en un cluster de Kubernetes basado en Tanzu Kubernetes Grid.

Introducción

Ahora más de alguno/a se preguntará, ¿Qué es Kasten?, Bueno, Kasten es el líder de respaldo y recuperación ante desastres para Kubernetes, una de las características importantes es que es una solución muy fácil de usar, está desarrollada para kubernetes y en una arquitectura nativa para Cloud.

Es por ello que Kasten puede ayudar a proteger tus contenedores con integración de aplicaciones ya sea en Cloud Publicas o Privadas, por ejemplo, Google Kubernetes Engine, AWS Elastic Kubernetes Services, Azure Kubernetes Services, IBM Kubernetes Services, VMware vSphere, Red Hat OpenShift, entre otros.

Como también integrarse con distintas tecnologías de Storage, como por ejemplo:

  • Amazon Elastic Block Store (EBS)
  • Amazon Elastic File System (EFS)
  • Azure Managed Disks
  • Google Persistent Disk
  • IBM Cloud Block Storage
  • Ceph (RBD)
  • Cinder-based providers on OpenStack
  • vSphere Cloud Native Storage (CNS) (Requiere vSphere 6.7u3+)
  • Portworx
  • Pure Storage
  • Netapp

Además permite realizar migraciones de contenedores entre distintos servicios de contenedores para el caso de algún desastre, cambio de proveedor, pruebas o simplemente mantener una arquitectura hibrida.

Si quieres saber más de Kasten, puedes ingresar a su Web y a la Web de documentación:

https://www.kasten.io/

https://docs.kasten.io/latest/

Luego de saber un poco que es Kasten, comenzaremos por detallar que tengo como ambiente para respaldar mis contenedores Tanzu Kubernetes Grid 1.1.3, en vSphere 7 Update 1, recuerda que se puede usar desde vSphere 6.7 Update 3

Cluster Productivo de Tanzu Kubernetes Grid:

Donde el management cluster esta con un plan productivo, y para el cluster de aplicaciones también use el plan productivo para utilizar múltiples roles de k8s, si quieres saber mas de los planes que ofrece Tanzu Kubernetes Grid o TKG visita:

https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.1/vmware-tanzu-kubernetes-grid-11/GUID-tanzu-k8s-clusters-create.html

Y si revisamos los recursos del cluster podremos observar:

Con el comando:

 kubectl get pvc,pv,sc --all-namespaces

Nos indicará las solicitudes de discos pvc (PersistentVolumeClaim) para aplicaciones, volúmenes persistentes que son provistos por el sistema o dinámicos pv (PersistenVolume), y la clase de storage o almacenamiento se ofrece al cluster sc (Storage Classes).

kubectl get pod --all-namespaces

Nos indicara todos los pods que instala por defecto Tanzu al crear un cluster y sus respectivos namespaces, que nos permite identificar el proyecto que se instale en el cluster.

kubectl get node --all-namespaces

Y por ultimo ver la cantidad de nodos que están involucrados en el cluster y su respectivo rol, como se puede observar en las imagen anterior es posible ver:

kube-system   vsphere-csi-controller-8c9b98f7f-tt9p6                   5/5     Running   8          3h30m
kube-system   vsphere-csi-node-5k2fp                                   3/3     Running   0          3h17m
kube-system   vsphere-csi-node-5skv2                                   3/3     Running   3          3h11m
kube-system   vsphere-csi-node-g9dpn                                   3/3     Running   0          3h17m
kube-system   vsphere-csi-node-rptch                                   3/3     Running   3          3h30m
kube-system   vsphere-csi-node-vgn7s                                   3/3     Running   3          3h17m
kube-system   vsphere-csi-node-xg6mb                                   3/3     Running   3          3h17m

Lo que nos indica que ya se encuentra instalado el driver CSI de vSphere, CSI es el acrónimo de Container Storage Interface:

https://github.com/kubernetes-sigs/vsphere-csi-driver

Este driver es la pieza esencial para la integración de Kubernetes con vSphere ya que permite crear discos para asignarlos a los volúmenes persistentes necesarios para las aplicaciones instaladas en el cluster de Tanzu Kubernetes Grid.

Storage Class

Ahora una de las requerimientos de Kasten son discos persistentes y como vimos anteriormente, el cluster por defecto no posee ningún Storage Class habilitado, por tanto, la aplicación que instalemos no podrá crear los volúmenes que necesite para su funcionamiento, para ello debemos ejecutar en la maquina que esta administrando TKG:

echo "
 kind: StorageClass
 apiVersion: storage.k8s.io/v1
 metadata:
   name: 24xs-vol
   annotations:
     storageclass.kubernetes.io/is-default-class: \"true\"
 provisioner: csi.vsphere.vmware.com
 parameters:
   DatastoreURL: "ds:///vmfs/volumes/5b00a1aa-6b210381-9411-54e1ad1b3bcd/"
   fstype: ext4
 " > 24xs-vol.yaml
 kubectl create -f 24xs-vol.yaml

Donde en la linea 5 podemos asignar el nombre del Storage Class, en la linea 7 asegurarnos que el valor sea “true” ya que con esto nos aseguramos que quede por defecto configurado y habilitado, linea 8 nos aseguramos que es el driver csi de vsphere, en la linea 10 es clave para indicarle la url del Datastore que utilizaremos como destino de los volúmenes persistentes en vSphere (en la siguiente imagen veras de donde tomar el dato) y por ultimo el nombre del archivo para guardarlo con su extensión .yaml.

Resumen DataStore Url
Creación Storage Class

Como observamos en la imagen anterior el primer comando nos muestra que no tenemos ningún Storage Class en nuestro cluster de Tanzu y luego ejecutamos el archivo para generar el Storage Class que podemos ver con el comando:

kubectl get sc

Ahora, si revisamos el monitoreo del DataStore que seleccionamos para ser el almacenamiento de nuestros volúmenes persistentes, veremos lo siguiente en vCenter:

Datastore Monitor Container Volumes

Por tanto ya tenemos todo listo para instalar Kasten k10 en su ultima versión 2.5.22.

Instalación de Kasten

Ahora revisaremos los prerrequisitos de Kasten que los puedes encontrar:

https://docs.kasten.io/latest/install/requirements.html

Lo primero que necesita es instalar helm, que es una administrador de paquetes para instalar fácilmente aplicaciones:

https://helm.sh/

La instalación de helm es muy sencilla solo debemos descargar el archivo desde github y moverlo a la carpeta de ejecutables del servidor que estas usando para administrar Tanzu Kubernetes Grid o TKG:

wget https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gz
tar xvzf helm-v3.3.4-linux-amd64.tar.gz
cd linux-amd64/

Y por ultimo lo movemos a la carpeta de ejecutables:

mv helm /usr/local/bin/

si ejecutamos el comando helm versión veremos la versión de helm:

Como indica el manual de Kasten, lo que debemos realizar ahora es agregar el repositorio de Kasten en helm, con el siguiente comando:

helm repo add kasten https://charts.kasten.io/

Y luego crear el nombre del proyecto o namespace con el comando:

kubectl create namespace kasten-io

Luego procederemos a la instalación como se indica en:

https://docs.kasten.io/latest/install/vmware/vsphere.html

El primer comando a ejecutar es:

helm install k10 kasten/k10 --namespace=kasten-io

Los cual nos mostrará:

Y luego con el siguiente comando podremos ver el progreso de instalación:

kubectl get pods --namespace kasten-io --watch

Y podremos ver:

Debemos asegurarnos que todos los pods se encuentren en estado “Running” ya que con esto luego podremos acceder a la consola de Kasten.

Si revisamos nuestro Datastore que anteriormente no almacenaba volúmenes persistentes y actualizamos podremos observar:

Nos listará los volúmenes usados por Kasten para su correcto funcionamiento. Y volvemos a asegurarnos que todos los pods estén en su estado “Running”:

Y ya tenemos instalado Kasten!

Acceder a Kasten

Como vimos en una imagen anterior, Kasten nos indico que para acceder al Dashboard necesitamos ingresar un comando:

kubectl --namespace kasten-io port-forward service/gateway 8080:8000

Y luego ingresar a la url:

http://127.0.0.1:8080/k10/#/.

Y obviamente si es que tienes instalado GUI o Desktop en tu linux de administración de Tanzu Kubernetes Grid podrás acceder. Pero que pasa si no tengo instalado GUI y necesito acceder desde la red via Web?

Existen distintas formas de acceder al Dashboard de Kasten, aquí veremos la mas simple y rápida con autenticación que inclusive también lo puedes encontrar en el manual de Kasten, de hecho revisaremos los siguientes links:

https://docs.kasten.io/latest/access/dashboard.html#dashboard

https://docs.kasten.io/latest/access/authentication.html#basic-auth

https://hostingcanada.org/htpasswd-generator/

El primer link nos dice las múltiples formas de ingresar al Dashboard, en este caso utilizaremos “Accessing via a LoadBalancer“, para ello instalaremos “metallb” que es un balanceador para k8s:

https://metallb.universe.tf/

La instalación es muy sencilla, debemos ejecutar el siguiente comando:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

Y ya está instalado. Ahora lo configuraremos con el rango de direcciones IP que deseamos que trabaje:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2

      # MetalLB IP Pool
      addresses:
      - 20.20.20.110-20.20.20.140
EOF

En la linea 15, debemos ingresar un pool de direcciones IP para que las asigne a los servicios que instalemos. Y ejecutamos:

Luego de esto volvemos a la configuración de Kasten, debemos generar una contraseña htpasswd, en los links anteriores aparece una web que nos permite realizarlo online:

Copiamos el usuario y contraseña y lo agregamos en el siguiente comando (Si copian y pegan la contraseña cifrada es 24xsiempre.com):

helm upgrade k10 kasten/k10 --namespace=kasten-io \
    --set auth.basicAuth.enabled=true \
    --set auth.basicAuth.htpasswd='admin:$apr1$8zsf2361$V3BlxNRZsfbnUmDFM.XRa1'

En la linea 3, debes copiar tu usuario y password generado en la web. Luego ejecutamos:

Con el comando anterior solo configuramos el mecanismo de autenticación, ahora con la siguiente instrucción le indicaremos que nos permita acceder a través del gateway de Kasten y el balanceador:

helm upgrade k10 kasten/k10 --namespace=kasten-io \
    --reuse-values \
    --set externalGateway.create=true

Vimos que el mensaje cambió y Kasten ahora nos indico que debemos acceder al Dashboard vía:

The K10 Dashboard is accessible via a LoadBalancer. Find the service's EXTERNAL IP using:
  `kubectl get svc gateway-ext --namespace kasten-io -o wide`
And use it in following URL
 `http://SERVICE_EXTERNAL_IP/k10/#/`

Por tanto, solo nos queda saber la dirección IP para acceder, la cual la obtendremos con el siguiente comando:

kubectl get svc gateway-ext --namespace kasten-io -o wide

**Cabe señalar que tengo habilitado DHCP en TKG**

En mi caso la url de acceso será http://kastentkg.24xsiempre.cl/k10/#/ ya que la dirección IP la asocie al DNS (Si no accede directamente a la IP de EXTERNAL-IP) y solicitará el usuario y contraseña antes configurado a través de la pagina que genera el htpasswd:

Y veremos la pantalla de Bienvenida de Kasten, ingresamos empresa, correo y aceptamos:

Configuración de Kasten

Ya tenemos funcionando Kasten, con posibilidad de acceder remotamente con usuario y contraseña, ahora solo nos falta habilitar y configurar la solución, en la parte inferior del Dashboard aparece un mensaje importante “K10 Disaster Recovery is not enabled for this cluster. “

Hacemos clic en “See Settings” donde nos indicara que debemos realizar algunas configuraciones antes de Habilitar Kasten:

Hacemos clic en “Locations” y crearemos un nuevo perfil, en este caso Amazon s3:

Como se observa, podrás utilizar distintos perfiles para almacenar los Containers los que pueden ser:

  • Google Cloud Storage
  • Amazon S3
  • Azure Storage
  • S3 Compatible

Ingresas los datos solicitados y veremos el perfil creado:

Luego clic en “Infrastructure” y generaremos un perfil para vSphere:

Al igual que el perfil anterior, tenemos distintas opciones:

  • OpenStack
  • Ceph
  • Portworx
  • vSphere

Ahora volvemos a hacer clic en “K10 Disaster Recovery” y procederemos a habilitar Kasten haciendo clic en “Enable K10 DR“, seleccionamos el perfil de “Location” y asignamos una contraseña para cifrar los respaldos. Muy importante Guarda la contraseña ya que la necesitaras en algunas recuperaciones

Y después si Quieres cambias el tema del Dashboard en el menú “Dashboard” y volvemos al inicio para configurar Políticas de respaldo:

Paralelamente instalé un wordpress en su propio namespace para ver los respaldos de una aplicación adicional:

Al crear un nuevo namespace, Kasten lo reconocerá automáticamente en la parte de “Applications” e indicará que se encuentra “Unmanaged” ya que no tiene ninguna política de respaldo asociada:

Puedes lanzar un “Snapshot” directamente desde “Applications“, realizar tareas de restauración o “Export” el Container que desees.

Políticas de Respaldos

Ingresaremos a “Policies” y veremos una política por defecto de Kasten para protegerse a sí mismo:

El cual, como recomendación, no debemos cambiar ya que estará ejecutándose con su respectiva política de retención.

Ahora haremos clic en “Create New Policy” e ingresaremos los datos solicitados:

Donde ingresamos el nombre, comentarios y la acción, para el caso de protección de datos necesitamos seleccionar “Snapshot” y seleccionar la frecuencia de los snapshots y su respectiva retención. Si haces clic en “Show Advanced Frequency Options” podrás seleccionar la hora de ejecución:

Luego si lo deseamos, podemos exportar los respaldos hacia el bucket S3 habilitando “Backups via Snapshot Exports“:

Luego seleccionaremos la aplicación a respaldar, buscándola por “Name” o si quieres por “Label” en este caso seleccionare wordpress

Y por ultimo hacemos clic en “Create Policy

Ahora podemos ejecutar el respaldo directamente o esperar la agenda. Lo ejecutare para ver el respaldo haciendo clic en “Run once

Y volveremos al Dashboard para ver el estado del respaldo:

Además veremos las ejecuciones de snapshots en vCenter:

También veremos todas las ejecuciones que configuramos en la política:

Y ya estamos respaldando nuestro Tanzu Kubernetes Grid con Kasten!

Recuperación Containers con Kasten

Si hacemos clic en “Applications” veremos nuestra política de respaldo exitosa para wordpress:

En la parte inferior de la política podrás ver un botón “Restore” nos mostrara los puntos de restauración que tenemos:

Y si hacemos clic en el punto de restauración:

Nos permitirá elegir desde donde deseas recuperar, ya sea desde s3 o del snapshot local, en este caso seleccionare el local:

Para confirmar:

Y por ultimo volvemos al Dashboard para ver el estado:

Y podremos ver la recuperación exitosa:

Existen múltiples opciones de recuperación que se deben analizar de acuerdo a la necesidad, pero como vimos el respaldo es simple, la detección de los namespaces lo hace automáticamente y es muy fácil configurar políticas de respaldos, en el siguiente link tienes el detalle de todas las opciones de recuperación:

https://docs.kasten.io/latest/usage/restore.html

Y con eso finalizamos esta guía para usar Kasten! Cualquier idea es bienvenida como siempre!