A estas alturas tenemos ya cubiertos prácticamente todo lo que necesitamos configurar en nuestro cluster, pero nos falta una pata fundamental que es el almacenamiento.
Kubernetes soporta una gran variedad de soluciones de almacenamiento. Para ello, la solución debe implementar el Container Storage Interface (CSI) y así será compatible con cualquier cluster Kubernetes.
Cabe destacar que no todas las capacidades están implementadas en todos los backends así que, aunque tenemos un nivel de abstracción importante sobre el almacenamiento, no podemos contar que podamos mover nuestras aplicaciones de un cluster a otro sin hacer ningún cambio.
Habitualmente nuestro proveedor del cluster (AWS, GCP, etc.) nos proporcionará diferentes opciones de almacenamiento sobre los diferentes productos que ofrecen. Por ejemplo en el caso de AWS tendremos un StorageClass para EBS y otro para EFS.
En nuestro caso y como hemos hecho anteriormente con el LoadBalancer tendremos que desplegar nuestra propia solución de almacenamiento para el cluster.
Nuestros requisitos
- Almacenamiento de tipo bloque, fichero y objeto (S3)
- Disponible dentro del cluster
- Posibilidad de ofrecer almacenamientos a servicios de fuera del cluster
- Auto provisionamiento
- Posibilidades de ampliación
- Estable
Después de barajar diferentes opciones como OpenEBS, LongHorn y similares nos decidimos por Rook porque realmente hace check en todos los requisitos.
La gestión de un cluster Ceph tiene bastante complejidad pero gracias a Rook al menos el despliegue se hace relativamente sencillo.
Instalación de Rook Ceph
En este post vamos a ver cómo hemos instalado Rook en nuestro cluster.
Como es habitual tenemos varias opciones. En esta ocasión lo instalaremos a partir del repositorio oficial.
Lo clonaremos con:
git clone https://github.com/rook/rook.gitEditamos rook/deploy/examples/operator.yaml y cambiamos las siguiente líneas:
ROOK_CSI_KUBELET_DIR_PATH: "/var/lib/k0s/kubelet"
ROOK_ENABLE_DISCOVERY_DAEMON: "true"Y finalmente aplicamos la configuración:
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f csi-operator.yaml -f operator.yamlEsperaremos a que se hayan realizado todos los cambios.
En el fichero cluster.yaml cambiaremos la siguiente línea que nos permitirá a los recursos de Ceph desde fuera del cluster.
# enable host networking
provider: hostA continuación desplegaremos la configuración del cluster con:
kubectl create -f cluster.yamlEl proceso de despliegue tardará varios minutos mientras se ejecutan los pods y se detectan los discos para añadir a Ceph.
Rook Toolbox
Para poder monitorizar y configurar el cluster podemos desplegar un pod de herramientas de gestión de Ceph.
Desplegaremos el pod con:
kubectl create -f deploy/examples/toolbox.yaml
Y una vez desplegado podremos abrir un shell en el pod con:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bashUna vez en el shell podemos ver el estado del cluster con ceph status:

Se puede ver que el estado del cluste es OK en este momento.
Almacenamiento de bloques (RWO)
En Ceph podemos crear almacenamiento de bloques, de filesystem compartido y de objetos (S3).
En esta ocasión configuraremos el almacenamiento de bloques y filesystem que van a ser loas más habituales en nuestros despliegues. Dejaremos para más adelante el almacenamiento de objetos porque es algo más complicado de desplegar y tendrá su capítulo aparte.
Para crear la storage class de bloques ejecutaremos el siguiente comando:
kubectl create -f deploy/examples/csi/rbd/storageclass.yamlY veremos como se ha creado:

Para facilitar el día a día configuraremos la StorageClass para que funcione por defecto y no haya que explicitarla en las configuraciones.
kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'Vemos ahora que la clase está marcada como default.

Almacenamiento de filesystem (RWX)
A continuación vamos a configurar el almacenamiento de filesystem. El despliegue es muy similar al servicio de bloques.
kubectl create -f deploy/examples/csi/cephfs/storageclass.yamlY comprobaremos que la tenemos disponible como un nueva StorageClass en el cluster.

Eliminación de Rook
Debido a la complejidad y la enorme cantidad de opciones que tenemos al desplegar Rook es posible que nos encontremos en la situación de querer desinstalarlo para poder instalarlo de otra manera.
Como no podía ser de otra forma por la cantidad de recursos que genera en el cluster, desinstalar correctamente Rook no es sencillo.
Si estamos todavía en el proceso de despliegue del K0s y podemos recrear las máquinas y el almacenamiento yo no me complicaría y optaría por esta vía. Al fin y al cabo, con la configuración de k0sctl y algunos recursos más podemos tenerlo todo funcionando en cuestión de minutos con la seguridad que hemos partido de una instalación limpia.
Si no podemos recrear fácilmente la infraestructura desde cero tenemos más información de cómo desinstalar Rook en la documentación oficial y en este post.
Para resetear los volúmenes utilizados por Ceph necesitaremos la utilidad sgdisk que en RHEL está dentro del paquete gdisk.
Comentarios