Ceph como fuente de almacenamiento para Kubernetes (K8S)

Esta publicación te guiará a través de la configuración básica de un clúster Ceph y te permitirá consumir dispositivos de bloques desde otros pods que se ejecuten en el clúster, también puedes consumir almacenamiento por objetos y file systems.

Para realizar esto, vamos a utilizar una herramienta llamada Rook, la cual es un orquestador de almacenamiento nativo en la nube de código abierto, que proporciona la plataforma, el framework y el soporte para un conjunto diverso de soluciones de almacenamiento para integrarse de forma nativa con entornos Cloud Native como Kubernetes.

Rook se integra profundamente en los entornos nativos de la nube aprovechando los puntos de extensión y brindando una experiencia perfecta para la programación, gestión del ciclo de vida, administración de recursos, seguridad, monitoreo y experiencia del usuario.

Para obtener más detalles sobre el estado de las soluciones de almacenamiento actualmente admitidas por Rook, consulte la documentación oficial del proyecto https://rook.io

Requisitos previos

  1. Un Clúster de K8s listo para utilizar (Kubernetes v1.7 o superior es compatible con Rook.)
  2. Si está utilizando dataDirHostPathpara mantener los datos en el hosts de kubernetes, asegúrese de que su host tenga al menos 5 GB de espacio disponible en la ruta especificada.

Clonacion del Proyecto desde Gitub

Ejecuta el siguiente comando:

master $git clone https://github.com/rook/rook.git

Instalando el Operador de Rook

Debido a que Rook utiliza la característica de Operadores de Kubernetes, primero debemos realizar es el despliegue del Operator en el clúster de K8s, puedes revisar más información sobre los operadores de K8s en el siguiente enlace: https://coreos.com/operators/

Ingresamos a la siguiente ruta donde clonamos el proyecto desde GitHub:

master $ cd ~/rook/cluster/examples/kubernetes/ceph

Y ejecutamos el siguiente comando:

master $ kubectl create -f operator.yaml

Verificamos que el operador de rook está en ejecución:

master $ kubectl -n rook-ceph-system get pod

Nota: espera unos momentos hasta que todos los componentes estén creados

Instalando un Clúster de Ceph

Ahora que el operador Rook, el agente y los pods de descubrimiento se están ejecutando, podemos crear el clúster de Ceph. Para que el clúster sobreviva al reinicio, asegúrese de establecer la propiedad dataDirHostPath. Para obtener más configuraciones, consulte la documentación sobre la configuración del clúster.

Guarde las especificaciones (si las cambió) del clúster en el archivo cluster.yaml, para esta guía no es necesario cambiar nada en este archivo.

apiVersion: v1
kind: Namespace
metadata:
name: rook-ceph
---
apiVersion: ceph.rook.io/v1beta1
kind: Cluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
dataDirHostPath: /var/lib/rook
dashboard:
enabled: true
storage:
useAllNodes: true
useAllDevices: false
config:
databaseSizeMB: "1024"
journalSizeMB: "1024"

Cree el clúster Ceph con el siguiente comando:

master $ kubectl create -f cluster.yaml

Use kubectl para mostrar los pods en el namespace de rook. Debería poder ver los siguientes pods una vez que se estén ejecutando. La cantidad de pod osd dependerá de la cantidad de nodos en el clúster y de la cantidad de dispositivos y directorios configurados.

master $ kubectl -n rook-ceph get pod

Nota: espera unos momentos hasta que todos los componentes estén creados

Probando Block Storage

El almacenamiento en bloque le permite montar el almacenamiento en un solo pod. Este ejemplo muestra cómo crear una aplicación web simple de varios niveles en Kubernetes utilizando volúmenes persistentes habilitados por Rook.

Antes de que Rook pueda comenzar a aprovisionar almacenamiento, es necesario crear un StorageClass y su grupo de almacenamiento. Esto es necesario para que Kubernetes interopere con Rook para aprovisionar volúmenes persistentes.

Creando el Storage Class en K8s:

master $ cd ~/rook/cluster/examples/kubernetes/ceph
master $ kubectl create -f storageclass.yaml

Consumir el almacenamiento: ejemplo con Wordpress

Creamos una aplicación de muestra para consumir el almacenamiento en bloque provisto por Rook con las aplicaciones clásicas de wordpress y mysql. Ambas aplicaciones harán uso de los volúmenes de bloque aprovisionados por Rook.

Inicie mysql y wordpress desde la carpeta ubicada en la siguiente ruta:

master $ cd ~/rook/cluster/examples/kubernetes
master $ kubectl create -f mysql.yaml
master $ kubectl create -f wordpress.yaml

Ambas aplicaciones crean un volumen de bloque y lo montan en sus respectivos pods. Puede ver los PVC de Kubernetes ejecutando lo siguiente:

master $ kubectl get pvc

Una vez que los pods de wordpress y mysql estén en el estado Running, obtenga el IP del clúster de la aplicación wordpress e ingréselo en su navegador:

master $ kubectl get svc wordpress

En este punto ya tenemos nuestra aplicación de ejemplo con storage persistente, lo que significa que podemos reiniciar los contenedores sin perder información del portal de Wordpress.

Ingresando al portal de Wordpress

Para acceder de forma externa al portal puedes crear un servicio en K8s de tipo NodePort, utiliza el siguiente archivo de ejemplo:

https://github.com/erickeliseo/kubernetes/blob/master/deploys/rook/cluster/examples/kubernetes/wordpress-service-ext.yml

Y el siguiente comando:

master $ kubectl create -f ~/wordpress-service-ext.yaml

Luego ingresa desde tu navegador la URL:

http://TU-IP:32095

Espero que sea de mucha utilidad, puedes contactarme por cualquier duda o ampliación sobre esta guía.

¡Un Saludo!