Aprovisiona discos persistentes regionales


En esta página, se explica cómo habilitar el aprovisionamiento dinámico de discos persistentes regionales y cómo aprovisionarlos de forma manual en Google Kubernetes Engine (GKE).

Si deseas crear soluciones de extremo a extremo para aplicaciones de alta disponibilidad con discos persistentes regionales, consulta Aumenta la disponibilidad de las apps con estado con el operador de HA con estado.

Discos persistentes regionales

Al igual que con los discos persistentes zonales, el administrador del clúster puede aprovisionar de forma dinámica o manual por adelantado los discos persistentes regionales según sea necesario, aunque la primera opción es la recomendada.

Aprovisionamiento dinámico

Para habilitar el aprovisionamiento dinámico de discos persistentes regionales, crea una StorageClass con el parámetro replication-type y especifica las restricciones de zona en allowedTopologies.

Por ejemplo, en el siguiente manifiesto, se describe una StorageClass llamada regionalpd-storageclass en la que se usan discos persistentes estándares y se replican datos en las zonas europe-west1-b y europe-west1-c:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

Si usas un clúster regional, puedes dejar allowedTopologies sin especificar. Si lo haces, cuando crees un Pod que consume una PersistentVolumeClaim que usa este StorageClass, se aprovisiona un disco persistente regional con dos zonas. Una zona es la misma en la que está programado el Pod. La otra zona se elige al azar entre las zonas disponibles para el clúster.

Cuando se usa un clúster zonal, se debe configurar allowedTopologies.

Una vez creado StorageClass, crea un objeto PersistentVolumeClaim y usa el campo storageClassName para hacer referencia a StorageClass. Por ejemplo, con el siguiente manifiesto, se crea un PersistentVolumeClaim llamado regional-pvc que hace referencia a regionalpd-storageclass:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: regional-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Gi
  storageClassName: regionalpd-storageclass

Dado que StorageClass se configura con volumeBindingMode: WaitForFirstConsumer, el PersistentVolume no se aprovisiona hasta que se crea un pod mediante PersistentVolumeClaim.

El siguiente manifiesto es un pod de ejemplo en el que se usa el PersistentVolumeClaim creado con anterioridad:

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: regional-pvc
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

Aprovisionamiento manual

Primero, crea un disco persistente regional con el comando gcloud compute disks create. En el siguiente ejemplo, se crea un disco llamado gce-disk-1 replicado en las zonas europe-west1-b y europe-west1-c:

gcloud compute disks create gce-disk-1 \
   --size 500Gi \
   --region europe-west1 \
   --replica-zones europe-west1-b,europe-west1-c

Luego, puedes crear un PersistentVolume que haga referencia al disco persistente regional que acabas de crear. Además de los objetos que figuran en Usa discos persistentes preexistentes como PersistentVolumes, el PersistentVolume para un disco persistente regional también debe especificar una node-affinity. Si usas un StorageClass, debe especificar el controlador CSI del disco persistente.

A continuación, se muestra un ejemplo de un manifiesto StorageClass que usa discos persistentes estándares y replica datos en las zonas europe-west1-b y europe-west1-c:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

A continuación, se muestra un manifiesto de ejemplo que crea un PersistentVolume con el nombre pv-demo y hace referencia a regionalpd-storageclass:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "regionalpd-storageclass"
  capacity:
     storage: 500Gi
  accessModes:
     - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: topology.gke.io/zone
            operator: In
            values:
               - europe-west1-b
               - europe-west1-c

Ten en cuenta lo siguiente para el ejemplo de PersistentVolume:

  • El campo volumeHandle contiene detalles de la llamada gcloud compute disks create, incluido tu PROJECT_ID.
  • El campo claimRef.namespace debe especificarse incluso cuando se configura en default.

Asigna nombres a los discos persistentes

Kubernetes no puede distinguir entre discos persistentes regionales y zonales que tengan el mismo nombre. Para evitar este problema, asegúrate de que los discos persistentes tengan nombres únicos. Esto no es necesario cuando se usan los discos persistentes aprovisionados de forma dinámica.

¿Qué sigue?