Usar el controlador de CSI para Persistent Disk en Compute Engine

Google Kubernetes Engine (GKE) te ofrece una forma sencilla de desplegar y gestionar automáticamente el controlador de Container Storage Interface (CSI) para Persistent Disk en Compute Engine en tus clústeres. El controlador de CSI para Persistent Disk en Compute Engine siempre está habilitado en los clústeres Autopilot y no se puede inhabilitar ni editar. En los clústeres estándar, debes habilitar el controlador de CSI para Persistent Disk en Compute Engine.

La versión del controlador de CSI para Persistent Disk en Compute Engine está vinculada a los números de versión de GKE. La versión del controlador de CSI para Persistent Disk en Compute Engine suele ser la más reciente disponible en el momento en que se lanza la versión de GKE. Los controladores se actualizan automáticamente cuando el clúster se actualiza al último parche de GKE.

Ventajas

Usar el controlador de CSI para Persistent Disk en Compute Engine ofrece las siguientes ventajas:

  • Permite desplegar y gestionar automáticamente el controlador de Persistent Disk sin tener que configurarlo manualmente.
  • Puedes usar claves de cifrado gestionadas por el cliente (CMEKs). Estas claves se usan para cifrar las claves de cifrado de datos que cifran tus datos. Para obtener más información sobre las CMEK en GKE, consulta Usar CMEK.
  • Puedes usar instantáneas de volumen con el controlador de CSI para Persistent Disk en Compute Engine. Las capturas de volumen te permiten crear una copia de tu volumen en un momento concreto. Puedes usar esta copia para restaurar un volumen a un estado anterior o para aprovisionar un volumen nuevo.
  • Puedes usar la clonación de volúmenes con el controlador de CSI para Persistent Disk en Compute Engine en clústeres que ejecuten GKE 1.22 o versiones posteriores. La clonación de volúmenes te permite crear un duplicado de tu volumen en un momento específico, aprovisionado con todos los datos del volumen de origen.
  • Las correcciones de errores y las actualizaciones de funciones se lanzan de forma independiente a las versiones secundarias de Kubernetes. Este calendario de lanzamientos suele dar lugar a una cadencia de lanzamientos más rápida.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Habilitar el controlador de CSI para Persistent Disk en Compute Engine

Para habilitar el controlador de CSI para Persistent Disk en Compute Engine en clústeres estándar, usa la CLI de Google Cloud o la Trusted Cloud consola.

Para habilitar el controlador en un clúster, sigue estos pasos:

gcloud

gcloud container clusters update CLUSTER-NAME \
   --update-addons=GcePersistentDiskCsiDriver=ENABLED

Sustituye CLUSTER-NAME por el nombre del clúster.

Consola

  1. Ve a la página Google Kubernetes Engine en la Trusted Cloud consola.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En Funciones, junto al campo Controlador de CSI para Persistent Disk en Compute Engine, haz clic en Editar controlador de CSI de Compute Engine.

  4. Marca la casilla Habilitar el controlador de CSI para Persistent Disk en Compute Engine.

  5. Haz clic en Guardar cambios.

Una vez que hayas habilitado el controlador de CSI para Persistent Disk en Compute Engine, podrás usarlo en volúmenes de Kubernetes con el nombre del controlador y del aprovisionador: pd.csi.storage.gke.io.

Inhabilitar el controlador de CSI para Persistent Disk en Compute Engine

Puedes inhabilitar el controlador de CSI para Persistent Disk en Compute Engine en clústeres estándar mediante la CLI de Google Cloud o la consola de Trusted Cloud .

Si inhabilitas el controlador, no se podrá cancelar ningún pod que utilice volúmenes persistentes que pertenezcan al controlador. Los pods nuevos que intenten usar esos volúmenes persistentes tampoco se podrán iniciar.

Para inhabilitar el controlador en un clúster estándar, sigue estos pasos:

gcloud

gcloud container clusters update CLUSTER-NAME \
    --update-addons=GcePersistentDiskCsiDriver=DISABLED

Sustituye CLUSTER-NAME por el nombre del clúster.

Consola

  1. Ve a la página Google Kubernetes Engine en la Trusted Cloud consola.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En Funciones, junto al campo Controlador de CSI para Persistent Disk en Compute Engine, haz clic en Editar controlador de CSI de Compute Engine.

  4. Desmarque la casilla Habilitar el controlador de CSI para Persistent Disk en Compute Engine.

  5. Haz clic en Guardar cambios.

Usar el controlador de CSI para Persistent Disk en Compute Engine en clústeres Linux

En las siguientes secciones se describe el proceso habitual para usar un volumen de Kubernetes respaldado por un controlador CSI en GKE. Estas secciones se aplican específicamente a los clústeres que usan Linux.

Crear un StorageClass

Después de habilitar el controlador de CSI para Persistent Disk en Compute Engine, GKE instala automáticamente las siguientes StorageClasses:

  • standard-rwo, con un disco persistente balanceado
  • premium-rwo, con disco persistente SSD

En los clústeres de Autopilot, la clase de almacenamiento predeterminada es standard-rwo, que usa el controlador de CSI para Persistent Disk en Compute Engine. En los clústeres estándar, la clase de almacenamiento predeterminada usa el complemento de volumen gcePersistentDisk integrado de Kubernetes.

Para ver el nombre de las StorageClasses instaladas, ejecuta el siguiente comando:

kubectl get sc

También puedes instalar otra StorageClass que use el controlador de CSI para Persistent Disk en Compute Engine añadiendo pd.csi.storage.gke.io en el campo provisioner.

Por ejemplo, puedes crear un StorageClass con el siguiente archivo, llamado pd-example-class.yaml.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-example
provisioner: pd.csi.storage.gke.io
# Recommended setting. Delays the binding and provisioning of a PersistentVolume until a Pod that uses the
# PersistentVolumeClaim is created and scheduled on a node.
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-balanced

Puede especificar los siguientes tipos de disco persistente en el parámetro type:

  • pd-balanced
  • pd-ssd
  • pd-standard
  • pd-extreme (compatible con GKE 1.26 y versiones posteriores)

Si usas pd-standard o pd-extreme, consulta Tipos de máquinas no admitidos para ver otras restricciones de uso.

Si usas la opción pd-extreme, también debes añadir el campo provisioned-iops-on-create a tu manifiesto. Este campo debe tener el mismo valor que el valor de IOPS aprovisionado que especificó al crear el disco persistente.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-extreme-example
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-extreme
  provisioned-iops-on-create:'10000'

Después de crear el archivo pd-example-class.yaml, ejecuta el siguiente comando:

kubectl create -f pd-example-class.yaml

Crear un PersistentVolumeClaim

Puedes crear un objeto PersistentVolumeClaim que haga referencia a la clase de almacenamiento del controlador de CSI para Persistent Disk en Compute Engine.

El siguiente archivo, llamado pvc-example.yaml, usa la clase de almacenamiento preinstalada standard-rwo:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: podpvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: standard-rwo
  resources:
    requests:
      storage: 6Gi

Después de crear el manifiesto PersistentVolumeClaim, ejecuta el siguiente comando:

kubectl create -f pvc-example.yaml

En la clase de almacenamiento preinstalada (standard-rwo), volumeBindingMode se ha definido como WaitForFirstConsumer. Cuando volumeBindingMode se define como WaitForFirstConsumer, el PersistentVolume no se aprovisiona hasta que se programa un Pod que haga referencia al PersistentVolumeClaim. Si volumeBindingMode en StorageClass se define como Immediate (o se omite), se aprovisiona un PersistentVolume respaldado por un disco persistente después de crear PersistentVolumeClaim.

Crea un pod que consuma el volumen.

Cuando uses pods con PersistentVolumes, te recomendamos que utilices un controlador de carga de trabajo (como un Deployment o un StatefulSet). Aunque normalmente no se usa un pod independiente, en el siguiente ejemplo se usa uno para simplificarlo.

En el siguiente ejemplo se usa el volumen que has creado en la sección anterior:

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       # The path in the container where the volume will be mounted.
       - mountPath: /var/lib/www/html
         # The name of the volume that is being defined in the "volumes" section.
         name: mypvc
  volumes:
   - name: mypvc
     persistentVolumeClaim:
       # References the PersistentVolumeClaim created earlier.
       claimName: podpvc
       readOnly: false

Usar el controlador de CSI para Persistent Disk en Compute Engine en clústeres de Windows

En las siguientes secciones se describe el proceso habitual para usar un volumen de Kubernetes respaldado por un controlador CSI en GKE. Estas secciones son específicas de los clústeres que usan Windows.

Asegúrate de que:

  • La versión del clúster es 1.19.7-gke.2000, 1.20.2-gke.2000 o una posterior.
  • Las versiones de los nodos son 1.18.12-gke.1203, 1.19.6-gke.800 o posteriores.

Crear un StorageClass

Crear un StorageClass para Windows es muy similar a Linux. Debes tener en cuenta que la StorageClass instalada de forma predeterminada no funcionará en Windows porque el tipo de sistema de archivos es diferente. El controlador de CSI para Persistent Disk en Compute Engine para Windows requiere NTFS como tipo de sistema de archivos.

Por ejemplo, puedes crear un StorageClass con el siguiente archivo llamado pd- windows-class.yaml. Asegúrate de añadir csi.storage.k8s.io/fstype: NTFS a la lista de parámetros:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-sc-windows
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: pd-balanced
  csi.storage.k8s.io/fstype: NTFS

Crear un PersistentVolumeClaim

Después de crear un StorageClass para Windows, puedes crear un PersistentVolumeClaim que haga referencia a ese StorageClass:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: podpvc-windows
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: pd-sc-windows
  resources:
    requests:
      storage: 6Gi

Crea un pod que consuma el volumen.

En el siguiente ejemplo se usa el volumen que has creado en la tarea anterior:

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  # Node selector to ensure the Pod runs on a Windows node.
  nodeSelector:
    kubernetes.io/os: windows
  containers:
    - name: iis-server
      # The container image to use.
      image: mcr.microsoft.com/windows/servercore/iis
      ports:
      - containerPort: 80
      volumeMounts:
      # The path in the container where the volume will be mounted.
      - mountPath: /var/lib/www/html
        name: mypvc
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        # References the PersistentVolumeClaim created earlier.
        claimName: podpvc-windows
        readOnly: false

Usar el controlador de CSI para Persistent Disk en Compute Engine con tipos de sistemas de archivos no predeterminados

El tipo de sistema de archivos predeterminado de los discos persistentes de Compute Engine en GKE es ext4. También puedes usar el tipo de almacenamiento xfs siempre que tu imagen de nodo lo admita. Consulta la compatibilidad con controladores de almacenamiento para ver una lista de controladores compatibles por imagen de nodo.

En el siguiente ejemplo se muestra cómo usar xfs como tipo de sistema de archivos predeterminado en lugar de ext4 con el controlador de CSI para Persistent Disk en Compute Engine.

Crear un StorageClass

  1. Guarda el siguiente manifiesto como un archivo YAML llamado pd-xfs-class.yaml:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: xfs-class
    provisioner: pd.csi.storage.gke.io
    parameters:
      # The type of Compute Engine persistent disk to provision.
      type: pd-balanced
      # Specify "xfs" as the filesystem type.
      csi.storage.k8s.io/fstype: xfs
    volumeBindingMode: WaitForFirstConsumer
    
  2. Aplica el archivo de manifiesto:

    kubectl apply -f pd-xfs-class.yaml
    

Crear un PersistentVolumeClaim

  1. Guarda el siguiente archivo de manifiesto como pd-xfs-pvc.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: xfs-pvc
    spec:
      # References the StorageClass created earlier.
      storageClassName: xfs-class
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          # The amount of storage requested.
          storage: 10Gi
    
  2. Aplica el archivo de manifiesto:

    kubectl apply -f pd-xfs-pvc.yaml
    

Crea un pod que consuma el volumen.

  1. Guarda el siguiente archivo de manifiesto como pd-xfs-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pd-xfs-pod
    spec:
      containers:
      - name: cloud-sdk
        image: google/cloud-sdk:slim
        # Keep the container running for 1 hour.
        args: ["sleep","3600"]
        volumeMounts:
        # The path in the container where the volume will be mounted.
        - mountPath: /xfs
          name: xfs-volume
      # Define the volumes available to the containers in the Pod.
      volumes:
      - name: xfs-volume
        persistentVolumeClaim:
          # References the PersistentVolumeClaim created earlier.
          claimName: xfs-pvc
    
  2. Aplica el archivo de manifiesto:

    kubectl apply -f pd-xfs-pod.yaml
    

Verificar que el volumen se ha montado correctamente

  1. Abre una sesión de shell en el pod:

    kubectl exec -it pd-xfs-pod -- /bin/bash
    
  2. Busca particiones xfs:

    df -aTh --type=xfs
    

    La salida debería ser similar a la siguiente:

    Filesystem     Type  Size  Used Avail Use% Mounted on
    /dev/sdb       xfs    30G   63M   30G   1% /xfs
    

Ver los registros del controlador de CSI para Persistent Disk en Compute Engine

Puedes usar Cloud Logging para ver los eventos relacionados con el controlador de CSI para Persistent Disk en Compute Engine. Los registros pueden ayudarte a solucionar problemas.

Para obtener más información sobre Cloud Logging, consulta Ver los registros de GKE.

Para ver los registros del controlador de CSI para Persistent Disk en Compute Engine, sigue estos pasos:

  1. Ve a la página Cloud Logging de la consola de Trusted Cloud .

    Ir a Cloud Logging

  2. Para filtrar las entradas de registro y mostrar solo las relacionadas con el controlador CSI que se ejecuta en tu espacio de nombres, ejecuta la siguiente consulta de Cloud Logging:

     resource.type="k8s_container"
     resource.labels.project_id="PROJECT_ID"
     resource.labels.location="LOCATION"
     resource.labels.cluster_name="CLUSTER_NAME"
     resource.labels.namespace_name="kube-system"
     resource.labels.container_name="gce-pd-driver"
    

    Haz los cambios siguientes:

    • PROJECT_ID: el nombre de tu proyecto.
    • LOCATION: la región o zona de Compute Engine del clúster.
    • CLUSTER_NAME: el nombre de tu clúster.

Problemas conocidos

Tipos de máquinas no admitidos

Si usas la familia de máquinas de la serie C3, no se admite el tipo de pd-standarddisco persistente.

Si intentas ejecutar un pod en una máquina y el pod usa un tipo de disco persistente no admitido, verás un mensaje de advertencia como el siguiente en el pod:

AttachVolume.Attach failed for volume "pvc-d7397693-5097-4a70-9df0-b10204611053" : rpc error: code = Internal desc = unknown Attach error: failed when waiting for zonal op: operation operation-1681408439910-5f93b68c8803d-6606e4ed-b96be2e7 failed (UNSUPPORTED_OPERATION): [pd-standard] features are not compatible for creating instance.

Si tu clúster tiene varios grupos de nodos con diferentes familias de máquinas, puedes usar taints de nodos y afinidades de nodos para limitar dónde se pueden programar las cargas de trabajo. Por ejemplo, puedes usar este método para evitar que una carga de trabajo que utilice pd-standard se ejecute en una familia de máquinas no compatible.

Si usas el tipo de disco persistente pd-extreme, debes asegurarte de que el disco esté conectado a una instancia de máquina virtual con una configuración de máquina adecuada. Para obtener más información, consulta Compatibilidad con formas de máquina.

Siguientes pasos