Como Instalar vSphere CSI Driver en RedHat OpenShift 4.x

Una de las consultas recurrentes que tenemos últimamente es como configurar el Driver CSI de vSphere en entornos OpenShift 4.x sin la necesidad de utilizar el operador que ya desarrolló VMWare, pero que sólo esta soportado para producción a partir de la versión 4.10 de OpenShift. Por tanto, en esta guía revisaremos como instalar y configurar el driver en versiones anteriores a 4.10 sin la necesidad de usar el operador de VMware.

Introducción

Como es de conocimiento general, es posible realizar la instalación del Driver CSI de vSphere para aprovisionar volúmenes directamente como First Class Disk usando los DataStores configurados del ambiente vSphere. Además a partir de la versión 4.8 existe un operador de OpenShift en Preview para realizar la instalación del Driver CSI, el cual es soportado, para ambientes productivos completamente en la ultima versión de OpenShift 4.10.

Generalmente los usuarios de OpenShift no actualizan automáticamente a las últimas versiones de OpenShift hasta que sus aplicaciones y/o las nuevas características o versiones de kOpenShift tengan alguna actualización superior o se encuentren compatibles / soportadas, por tanto, esta guía es para realizar la instalación del driver CSI de vSphere desde la línea de comandos.

Esta guía asume que el lector conoce del ambiente de OpenShift como también conectarse vía línea de comandos. En este caso se usa la version de OpenShift 4.8.39

Requerimientos

Crearemos 2 archivos, csi-vsphere.conf y vsphere.conf, los cuales contienen las credenciales de acceso a vSphere:

csi-vsphere.conf

[Global]
# Para conseguir el ID del cluster se debe ejecutar el siguiente comando
# oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}'
cluster-id = "5341dc3e-4ea8-4de6-a4fd-f2715c75a0b8"
[VirtualCenter "vcenter.24xsiempre.cl"] 
insecure-flag = "true"
user = "SuperUserdevSphere"
password = "SuperDuperPassword"
port = "443"
datacenters = "24xSiempre"

En los puntos anteriores se debe ingresar la información de nuestro ambiente vSphere:

  • cluster-id: id del cluster de openshift, se debe ejecutar el comando que se indica en el archivo
  • VirtualCenter: dirección fqdn de vcenter
  • User: Usuario de vCenter que se usa con OpenShift
  • Password: Contraseña del usuario de vCenter
  • Datacenters: Nombre del Datacenter de vCenter

Luego crearemos el siguiente archivo:

vsphere.conf

[Global]
# Para conseguir el ID del cluster se debe ejecutar el siguiente comando
# oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}'
cluster-id = "5341dc3e-4ea8-4de6-a4fd-f2715c75a0b8"
[VirtualCenter "vcenter.24xsiempre.cl"]
insecure-flag = "true"
user = "SuperUserdevSphere"
password = "SuperDuperPassword"
port = "443"
datacenters = "24xSiempre"

En los puntos anteriores se debe ingresar la información de nuestro ambiente vSphere:

  • cluster-id: id del cluster de openshift, se debe ejecutar el comando que se indica en el archivo
  • VirtualCenter: dirección fqdn de vcenter
  • User: Usuario de vCenter que se usa con OpenShift
  • Password: Contraseña del usuario de vCenter
  • Datacenters: Nombre del Datacenter de vCenter

Luego de generar los archivos procederemos a configurar los “secrets” desde estos archivos, ejecutando los siguientes comandos:

oc create secret generic vsphere-config-secret --from-file=csi-vsphere.conf --namespace=kube-system
oc create configmap cloud-config --from-file=vsphere.conf --namespace=kube-system
Secrets

Y para validar si fueron creados correctamente ejecutaremos:

oc get secret vsphere-config-secret --namespace=kube-system
oc get configmap cloud-config --namespace=kube-system
Secrets creados

Ahora procederemos a dejar todos los nodos en “Taint” con el siguiente comando:

kubectl taint nodes --all 'node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule'
Taints

Y procederemos a aplicar los siguientes archivos yaml:

oc apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-vsphere/master/manifests/controller-manager/cloud-controller-manager-roles.yaml
oc apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-vsphere/master/manifests/controller-manager/cloud-controller-manager-role-bindings.yaml
oc apply -f https://github.com/kubernetes/cloud-provider-vsphere/raw/master/manifests/controller-manager/vsphere-cloud-controller-manager-ds.yaml
Aplicacion yamls

Y para validar la correcta aplicación de los archivos anteriores, ejecutaremos:

oc describe nodes | grep "ProviderID"
ProviderID

Instalación vSphere-CSI

Ahora aplicaremos la instalación del driver con la aplicación de los siguientes archivos:

oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v2.1.1/manifests/v2.1.1/vsphere-7.0u1/vanilla/rbac/vsphere-csi-controller-rbac.yaml
oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v2.1.1/manifests/v2.1.1/vsphere-7.0u1/vanilla/deploy/vsphere-csi-node-ds.yaml
oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/v2.1.1/manifests/v2.1.1/vsphere-7.0u1/vanilla/deploy/vsphere-csi-controller-deployment.yaml
Instalación Driver CSI

Ejecutaremos el siguiente comando:

oc get deployments --namespace=kube-system

Y esperaremos hasta que “READY” se encuentre en el estado 1/1:

Estado Deployment CSI vSphere

Y Validaremos la instalación del driver en los nodos con el siguiente comando:

oc get CSINode
Driver CSI Instalado en nodos

Creación de StorageClass

Ahora pasaremos a la configuración del StorageClass para que utilice el driver CSI de vSphere. Antes de todo en vCenter generaremos un “Storage Policy”, este caso de nombre “Contenedores” el cual debe estar asociado al DataStore que utilizaremos para alojar nuestros discos persistentes:

StoragePolicy para Kubernetes

Luego editamos el siguiente archivo:

cat << EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: sc-csi-vsphere
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"
provisioner: csi.vsphere.vmware.com
parameters:
  StoragePolicyName: "Contenedores"
  datastoreURL: "ds:///vmfs/volumes/60634600-6fcc5d36-bd83-dcfe07e145f9/"
EOF

Donde debemos modificar los siguientes parámetros:

  • name: Es el nombre que deseamos para el StorageClass.
  • StoragePolicyName: El nombre del “Storeage Policy” que creamos anteriormente.
  • datastoreURL: La URL del Datastore de vCenter. En la siguiente imagen esta la info.
Datastore URL

Luego de los cambios que aplicamos en el archivo, lo ejecutaremos en la consola y nos mostrará:

Creación StorageClass

Y también lo podremos validar en la consola de OpenShift:

StorageClass en OpenShift

Creación de Disco Persistente

Crearemos un disco persistente desde la consola de OpenShift para validar la creación y eliminación de discos con el nuevo StorageClass. Ingresaremos en la consola de OpenShift, Storage, PersistenVolumeClaims y haremos clic en “Create PersistentVolumeClaim”:

  1. Seleccionamos el StorageClass que creamos con vSphere CSI
  2. Ingresamos el Nombre del Volumen
  3. Ingresamos el tamaño
  4. Clic en “Create”
Creación Disco Persistente

Y veremos la creación del disco en OpenShift:

Disco Persistente OpenShift

En el Datastore configurado:

First Class Disks
Detalles

Ahora eliminaremos el disco para validar el correcto funcionamiento:

Eliminar Disco Persistente

Confirmación en OpenShift:

Confirmación de Eliminación en vCenter:

Configuración StorageClass por defecto

Ingresaremos en la consola de OpenShift, luego, Storage y haremos clic en “StorageClasses”, donde veremos:

Lista de StorageClasses

Como se puede observar en la imagen anterior el StorageClass por defecto es “thin”, el cual es creado automáticamente al instalar OpenShift, seleccionaremos el “thin”, luego “Edit Annotations” y cambiaremos el parámetro “storageclass.kubernetes.io/is-default-class” a “false” y guardamos:

Quitar configuración por defecto StorageClass Thin

Y por último, seleccionamos nuestro StorageClass que usa el driver CSI de vSphere, en este caso, “sc-csi-vsphere”, clic en “Edit Annotations” y cambiamos el parámetro “storageclass.kubernetes.io/is-default-class” a “true” y guardamos:

Aplicar por defecto StorageClass

Ahora veremos que nuestro StorageClass es por defecto y cada nueva creación de discos persistentes lo usará:

StorageClass por defecto en OpenShift

Por tanto, ahora solo falta instalar Kasten K10 para proteger todas tus aplicaciones en OpenShift, donde en este blog existen múltiples guías para instalar y configurar Kasten K10.