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

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

Ahora procederemos a dejar todos los nodos en “Taint” con el siguiente comando:
kubectl taint nodes --all 'node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule'

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

Y para validar la correcta aplicación de los archivos anteriores, ejecutaremos:
oc describe nodes | grep "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

Ejecutaremos el siguiente comando:
oc get deployments --namespace=kube-system
Y esperaremos hasta que “READY” se encuentre en el estado 1/1:

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

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:

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.

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

Y también lo podremos validar en la consola de 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”:
- Seleccionamos el StorageClass que creamos con vSphere CSI
- Ingresamos el Nombre del Volumen
- Ingresamos el tamaño
- Clic en “Create”

Y veremos la creación del disco en OpenShift:

En el Datastore configurado:


Ahora eliminaremos el disco para validar el correcto funcionamiento:

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:

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:

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:

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

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.