Versión 1.2 Esta versión ya no se admite como se describe en la política de asistencia de la versión de Anthos. Actualiza a una versión compatible para obtener los parches y las actualizaciones más recientes sobre vulnerabilidades de seguridad, exposiciones y problemas que afectan a los clústeres de Anthos en VMware (GKE On-Prem). Puedes encontrar la versión más reciente aquí.

Instala un controlador de Container Storage Interface

En este tema, se explica cómo instalar un controlador de almacenamiento de Container Storage Interface (CSI) en clústeres de GKE On-Prem.

Descripción general

CSI es una API estándar abierta que permite a Kubernetes exponer sistemas de almacenamiento arbitrarios a cargas de trabajo en contenedores. Cuando implementas un controlador de almacenamiento compatible con CSI en un clúster de GKE On-Prem, el clúster puede conectarse directamente a un dispositivo de almacenamiento compatible sin tener que pasar por el almacenamiento de vSphere.

Los volúmenes de Kubernetes se administran mediante controladores de almacenamiento específicos del proveedor, que siempre se compilaron en objetos binarios de Kubernetes. Antes no se podía usar un controlador de almacenamiento que no se incluyera con Kubernetes. La instalación de un controlador de CSI agrega compatibilidad para un sistema de almacenamiento que no sea compatible de forma nativa con Kubernetes. Además, CSI permite usar funciones de almacenamiento modernas, como instantáneas y cambios de tamaño.

Para usar un controlador de CSI, debes crear una StorageClass de Kubernetes. Establece el controlador CSI como aprovisionador para StorageClass. Luego, puedes establecer la StorageClass como la configuración predeterminada del clúster o configurar las cargas de trabajo mediante el StorageClass (ejemplo de StatefulSet).

Antes de comenzar

Revisa los complementos de volumen en el árbol de Kubernetes y confirma si Kubernetes ya incluye el controlador.

De forma predeterminada, GKE On-Prem usa los almacenes de datos de vSphere a través del controlador vsphereVolume integrado. Además, los controladores integrados para iSCSI y NFS pueden conectar volúmenes existentes a las cargas de trabajo y activarlos.

Instala el controlador CSI de un proveedor

Los proveedores de almacenamiento desarrollan sus propios controladores de CSI y son responsables de proporcionar las instrucciones de instalación. En casos simples, es posible que la instalación solo implique la implementación de manifiestos en tus clústeres. Consulta la lista de controladores de CSI en la documentación de CSI.

Verifica la instalación de un controlador

Después de instalar un controlador de CSI, puedes verificar la instalación mediante la ejecución de uno de los siguientes comandos, según la versión de GKE On-Prem del clúster:

1.2.0-gke.5

kubectl get csinodes \
-o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'

1.1.0-gke.6

kubectl get nodes \
-o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'

Usa un controlador de CSI

Para usar un controlador CSI, sigue estos pasos:

  1. Crea una StorageClass de Kubernetes que haga referencia al controlador en su campo provisioner.

  2. Para aprovisionar almacenamiento, puedes hacer lo siguiente:

Consideraciones para StorageClass con respaldo de controlador CSI

Cuando crees una StorageClass, ten en cuenta lo siguiente:

  • La documentación del controlador CSI debe incluir los parámetros específicos del controlador que proporcionas a tu StorageClass, incluido el nombre del aprovisionador.
  • Debes nombrar StorageClass por sus propiedades (como “rápido” o “alto grado de replicación”), en lugar de por el nombre del controlador o dispositivo específico detrás de él. Nombrar la StorageClass por sus propiedades te permite crear StorageClases con el mismo nombre en varios clústeres y entornos, y permite que tus aplicaciones obtengan almacenamiento con las mismas propiedades en todos los clústeres.

Ejemplo: StorageClass de referencia en un StatefulSet

En el siguiente ejemplo, se muestra cómo definir un controlador CSI en una StorageClass y, luego, hacer referencia a esta en una carga de trabajo StatefulSet. En el ejemplo, se da por sentado que el controlador ya se instaló en el clúster.

A continuación, se muestra una StorageClass simple llamada fast que usa un controlador de CSI ficticio, csi.example.com, como su aprovisionador:

fast-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: csi.example.com # CSI driver
parameters: # You provide vendor-specific parameters to this specification
  type: example-parameter # Be sure to follow the vendor's instructions
  datastore: my-datastore
reclaimPolicy: Retain
allowVolumeExpansion: true

Se hace referencia a la StorageClass en la especificación volumeClaimTemplates de StatefulSet.

Cuando haces referencia a la StorageClass en la especificación volumeClaimTemplates de StatefulSet, Kubernetes proporciona almacenamiento estable mediante PersistentVolumes (PV). Kubernetes llama al aprovisionador definido en la StorageClass para crear un volumen de almacenamiento nuevo. En este caso, Kubernetes llama al proveedor ficticio csi.example.com, que llama a la API del proveedor, para crear un volumen. Una vez que se aprovisiona el volumen, Kubernetes crea de forma automática un PV para representar el almacenamiento.

A continuación, se muestra un StatefulSet simple que hace referencia a la StorageClass:

statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: fast # This field references the existing StorageClass

¿Qué sigue?