Instalar un controlador de interfaz de almacenamiento de contenedor

En esta página se explica cómo instalar un controlador de almacenamiento de interfaz de almacenamiento de contenedores (CSI) en clústeres de Google Distributed Cloud.

Información general

La interfaz de almacenamiento de contenedores (CSI) es una API estándar abierta compatible con muchos proveedores de almacenamiento importantes que permite a Kubernetes exponer sistemas de almacenamiento arbitrarios a cargas de trabajo en contenedores.

Los volúmenes de Kubernetes se gestionan mediante controladores de almacenamiento específicos de cada proveedor, que históricamente se han compilado en archivos binarios de Kubernetes. Antes, no podías usar un controlador de almacenamiento que no estuviera incluido en Kubernetes. Al instalar un controlador de CSI, se añade compatibilidad con un sistema de almacenamiento que no es compatible de forma nativa con Kubernetes. Además, CSI permite usar funciones de almacenamiento modernas, como las copias de seguridad y el cambio de tamaño.

Para usar un controlador de CSI, debes crear una StorageClass de Kubernetes. Has definido el controlador CSI como aprovisionador de la clase de almacenamiento. Después, puedes configurar StorageClass como predeterminada del clúster o configurar tus cargas de trabajo para que usen StorageClass (ejemplo de StatefulSet).

Instalar un controlador de 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 sencillos, la instalación solo implica desplegar manifiestos en tus clústeres. Consulta la lista de controladores CSI en la documentación de CSI.

Para el almacenamiento de producción, te recomendamos que instales un controlador de CSI de un partner de almacenamiento GDC Ready.

Verificar la instalación de un controlador

Después de instalar un controlador de CSI, puedes verificar la instalación ejecutando el siguiente comando:

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

Usar un controlador de CSI

Para usar un controlador de CSI, sigue estos pasos:

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

  2. Para aprovisionar almacenamiento, puedes hacer lo siguiente:

Consideraciones sobre StorageClasses respaldados por un controlador de CSI

Cuando crees un StorageClass, ten en cuenta lo siguiente:

  • La documentación del controlador CSI debe incluir los parámetros específicos del controlador que proporciones a tu StorageClass, incluido el nombre del provisioner.
  • Debes asignar a StorageClass el nombre de sus propiedades, en lugar del nombre del controlador o del dispositivo específico que haya detrás. Si asignas a StorageClass el nombre de sus propiedades, podrás crear StorageClasses con el mismo nombre en varios clústeres y entornos, y tus aplicaciones podrán obtener almacenamiento con las mismas propiedades en todos los clústeres.

Ejemplo: hacer referencia a StorageClass en un StatefulSet

En el siguiente ejemplo se muestra cómo definir un controlador CSI en una StorageClass y, a continuación, hacer referencia a la StorageClass en una carga de trabajo StatefulSet. En este ejemplo se da por hecho que el controlador ya se ha instalado en el clúster.

La siguiente StorageClass sencilla, premium-rwo, usa un controlador de CSI ficticio, csi.example.com, como aprovisionador:

fast-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-rwo
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

Haces referencia a StorageClass en la especificación volumeClaimTemplates de un StatefulSet.

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

A continuación, se muestra un StatefulSet sencillo que hace referencia a 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: registry.k8s.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: premium-rwo # This field references the existing StorageClass

Siguientes pasos