Resumen
CSI es una especificación para propocionar una interfaz de almacenamiento a contenedores (Container Storage Interface), de forma que los fabricantes puedan desarrollar plugins de sus productos. En este tutorial veremos cómo configurar OpenStack Cinder como proveedor de almacenamiento en un cluster de Kubernetes.
-
Configurar OpenStack Cinder como backend de almacenamiento en un cluster de Kubernetes.
-
Configurar una clase de almacenamiento Kubernetes (Storage Class) para OpenStack Cinder.
-
Crear un volumen de OpenStack Cinder en un cluster Kubernetes
1. Introducción
CSI (Container Storage Interface) define una interfaz de almacenamiento para contenedores. Esta interfaz define un protocolo y una API que proporciona un conjunto de operaciones, como por ejemplo, aprovisionar y liberar volúmenes, o conectar y montar volúmenes, entre otras. Esta interfaz es usada por los fabricantes para implementar drivers para sus sistemas de almacenamiento.
Kubernetes mantiene una lista de drivers CSI en la que aparecen gran cantidad de proveedores con enlaces para su configuración, como CephFS, Dell EMC, GlusterFS, NetApp, Nutanix, Synology, vSphere, entre otros.
Si nuestro sistema de almacenamiento no puede ser usado por nuestro cluster de Kubernetes, tendremos que seguir las indicaciones del fabricante para configurar el driver CSI en nuestro cluster de Kubernetes.
En este tutorial usaremos Rancher para administrar nuestros clusters de Kubernetes. Por tanto, no citamos los proveedores de almacenamiento que incorpora Rancher, como son Amazon EBS Disk, Azure Disk, Azure File, Google Persistent Disk, Longhorn o VMware Sphere Volume. |
2. Clonar el repositorio de plugins de OpenStack para Kubernetes
Comenzaremos clonando el repositorio de plungins de OpenStack para Kubernetes ejecutando el comando siguiente en una terminal.
La carpeta manifests/cinder-csi-plugin
contiene el driver CSI de OpenStack Cinder. En esta carpeta se encuentra un archivo csi-secret-cinderplugin.yaml
que configuraremos más adelante con las credenciales que dan acceso al proyecto OpenStack que proporcionará los volúmenes Cinder.
3. Descarga del archivo .kubeconfig
Para poder acceder al cluster de Kubernetes desde nuestro cliente kubectl
tendremos que disponer de las credenciales de acceso al cluster. En Rancher las podemos descargar de dos formas:
-
En el menú
Cluster Management
, cada cluster muestra al final unos puntos suspensivos. Pulsar con el botón derecho y seleccionarDownload Kubeconfig
. -
Si tenemos seleccionado nuestro cluster, la barra de herramientas superior derecha muestra un icono
Download Kubeconfig
para descargar el archivo.
De una forma o de otra, descargar el archivo y colocarlo en una carpeta accesible.
4. Preparar las credenciales de acceso al proyecto OpenStack
OpenStack Cinder proporcionará almacenamiento al cluster de Kubernetes a través de un proyecto OpenStack. En esta sección veremos cómo generar la configuración necesaria que pasaremos más adelante a nuestro cluster de Kubernetes.
4.1. Preparar un archivo de credenciales de acceso al proyecto OpenStack
Prepararemos un archivo cloud.conf
como el siguiente con las credenciales de acceso al proyecto OpenStack que proporcionará los volúmenes al cluster de Kubernetes.
cloud.conf
[Global]
username = YOUR_USER
password = YOUR_PASSWORD
domain-name = default
auth-url = https://<openstack-url>:5000/v3
tenant-id = YOUR_TENANT_ID
region = YOUR_REGION
El valor de Aparecerá un cuadro de diálogo con las credenciales del usuario en el proyecto, entre ellas |
4.2. Codificar cloud.conf
en base64
Kubernetes necesita las credenciales de acceso al proyecto de OpenStack en base64. A continuación, codificaremos el contenido de cloud.conf
en base64 con este comando.
cat cloud.conf | base64 |tr -d '\n'
Esto generará un resultado similar a este.
W0dsb2JhbF0KdXNlcm5hbWUgPSBZT1VSX1VTRVIKcGFzc3dvcmQgPSBZT1VSX1BBU1NXT1JECmRvbWFpbi1uYW1lID0gZGVmYXVsdAphdXRoLXVybCA9IGh0dHBzOi8vWU9VUl9EVV9VUkwva2V5c3RvbmUvdjMKdGVuYW50LWlkID0gWU9VUl9URU5BTlRfSUQKcmVnaW9uID0gWU9VUl9SRUdJT04K
Este valor lo usaremos a continuación para crear un objeto Secret
en el cluster de Kubernetes que proporcione acceso al proyecto OpenStack.
4.3. Configurar el objeto Secret
del driver CSI
En este paso configuraremos el objeto Secret
que desplegaremos más adelante con las credenciales en base64 de cloud.conf
. Para ello, configuramos el archivo manifests/cinder-csi-plugin/csi-secret-cinderplugin.yaml
sustituyendo el valor predeterminado en la sección data.cloud.conf
por el valor generado en paso anterior con nuestras credenciales en base64 de nuestro archivo cloud.conf
.
5. Desplegar el driver CSI de Cinder
Una vez modificado el objeto Secret
del archivo manifests/cinder-csi-plugin/csi-secret-cinderplugin.yaml
con nuestras credenciales, lo desplegaremos junto al controlador y los plugins con el comando siguiente desde la raíz del repositorio que clonamos en la sección Clonar el repositorio de plugins de OpenStack para Kubernetes.
Para hacer el despliegue sobre nuestro cluster de Kubernetes, usaremos el archivo |
kubectl --kubeconfig <path-to-downloaded-kubeconfig> apply -f manifests/cinder-csi-plugin/
Podemos comprobar la evolución del despliegue con el comando siguiente, que muestra los pods con la cadena csi
en el namespace kube-system
$ kubectl --kubeconfig <path-to-downloaded-kubeconfig> get pods -n kube-system | grep csi
csi-cinder-controllerplugin-86486c7584-gkhc2 6/6 Running 510 (18m ago) 2d16h
csi-cinder-nodeplugin-4smh4 3/3 Running 0 2d16h
csi-cinder-nodeplugin-5tvt9 3/3 Running 0 2d16h
csi-cinder-nodeplugin-bch9c 3/3 Running 0 2d16h
csi-cinder-nodeplugin-ffhk6 3/3 Running 0 2d16h
csi-cinder-nodeplugin-kz7cr 3/3 Running 0 2d16h
Podemos observar que crea 6 pods para controller-plugin
y 3 pods del plugin en cada nodo que tenga nuestro cluster de Kubernetes, 5 en caso de este tutorial.
También podemos ver la información del driver CSI en el cluster con el comando siguiente
$ kubectl --kubeconfig <path-to-downloaded-kubeconfig> get csidrivers.storage.k8s.io
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
cinder.csi.openstack.org true true false <unset> false Persistent,Ephemeral 2d16h
6. Creación de la clase de almacenamiento para Cinder
Tras instalar el driver CSI de OpenStack Cinder, crearemos una clase de almacenamiento (StorageClass
) para poder crear los volúmenes Cinder en nuestro cluster de Kubernetes. Basta con ejecutar el comando siguiente, el cual crea una clase de almacenamiento denominada cinder
en la zona de disponibilidad nova
.
kubectl --kubeconfig <path-to-downloaded-kubeconfig> apply -f https://gist.githubusercontent.com/ualmtorres/483b8b4bfb913c4fd6879f2187099063/raw/d8da79057326f0b35f201fc296841c03382ddeb3/cinder-storage-class.yaml
Si se quieren realizar cambios sobre el contenido del archivo de la clase de almacenamiento, descargar el archivo anterior, realizar los cambios deseados y desplegar el archivo local con las cambios introducidos.
StorageClass
para CinderapiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cinder (1)
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
availability: nova (2)
1 | Nombre de la clase de almacenamiento |
2 | Zona de disponibilidad para la creación de los volúmenes |
Podemos comprobar que la clase de almacenamiento ha sido creada y está disponible para crear volúmenes Cinder.
7. Creación de un volumen de prueba
Para probar que la instalación del driver CSI de Cinder es correcta, crearemos un volumen de prueba en nuestro proyecto Rancher (Storage | Persistent Volume Claims | Create
). Crearemos un volumen de 2 GB denominado alpha-volume
usando la clase cinder
creada anteriormente.
Tras unos instantes, el volumen aparecerá creado.
8. Conclusiones
De forma predeterminada, Kubernetes no ofrece soporte para todos los sitemas de almacenamiento. CSI (Container Storage Interface) es una especificación que permite a los fabricantes crear drivers para ofrecer su almacenamiento a Kubernetes. En este tutorial hemos visto cómo configurar un OpenStack Cinder como proveedor de almacenamiento para un cluster de Kubernetes.