En esta página se explica cómo instalar un controlador de almacenamiento de interfaz de almacenamiento de contenedores (CSI) en clústeres Estándar de Google Kubernetes Engine (GKE). Esta página no se aplica a los clústeres de Autopilot de GKE, que usan automáticamente el controlador de CSI para Persistent Disk en Compute Engine.
Si usas el controlador de CSI para Persistent Disk en Compute Engine en tu clúster estándar, te recomendamos que despliegues el controlador automáticamente para reducir la sobrecarga de gestión.
Información general
CSI es una API estándar abierta 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.
Instalar un controlador de CSI de un proveedor
Otros 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.
Verificar la instalación de un controlador
Después de instalar un controlador CSI, puedes verificar la instalación ejecutando uno de los siguientes comandos, en función de la versión de GKE de tu clúster:
1.14+
kubectl get csinodes \ -o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
1.13.x
kubectl get nodes \ -o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'
Usar un controlador de CSI
Para usar un controlador de CSI, sigue estos pasos:
Crea un StorageClass de Kubernetes que haga referencia al controlador en su campo
provisioner
si no se ha creado un StorageClass como parte de la instalación del controlador. Algunos controladores de CSI implementan una StorageClass cuando los instalas.Para aprovisionar almacenamiento, puedes hacer lo siguiente:
- Haga referencia a StorageClass en la especificación
volumeClaimTemplates
de un objeto StatefulSet. - Definirla como StorageClass predeterminada del clúster.
- Haga referencia a StorageClass en la especificación
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 provisionador.
- 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 asigna a StorageClass el nombre de sus propiedades, podrá crear StorageClasses con el mismo nombre en varios clústeres y entornos, y sus 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 clase StorageClass y, a continuación, hacer referencia a la clase 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.
A continuación, se muestra un StorageClass sencillo llamado premium-rwo
que usa un controlador 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 un StorageClass en la especificación volumeClaimTemplates
de un StatefulSet, Kubernetes proporciona almacenamiento estable mediante PersistentVolumes.
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 PersistentVolume 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
- Consulta más información sobre los conceptos de almacenamiento de GKE.