En esta página se explica cómo habilitar el aprovisionamiento dinámico de volúmenes de alta disponibilidad de Hyperdisk Balanced y discos persistentes regionales, así como cómo aprovisionarlos manualmente en Google Kubernetes Engine (GKE). Para obtener información sobre la compatibilidad de los tipos de máquinas, consulta las limitaciones de los discos regionales y la compatibilidad de las series de máquinas con Hyperdisk. Por lo general, debes usar volúmenes Hyperdisk Balanced High Availability en series de máquinas de tercera generación o posteriores, y discos persistentes regionales en series de máquinas de segunda generación o anteriores. Para obtener más información sobre la generación de series de máquinas, consulta la terminología de Compute Engine.
Para crear soluciones completas para aplicaciones de alta disponibilidad con discos persistentes regionales, consulta Aumentar la disponibilidad de aplicaciones con estado con Stateful HA Operator. Esta función no admite volúmenes de Hyperdisk Balanced High Availability.
Hyperdisk Balanced High Availability
En este ejemplo se muestra cómo pueden aprovisionarse dinámicamente los volúmenes de Hyperdisk Balanced High Availability según sea necesario o cómo puede aprovisionarlos manualmente el administrador del clúster con antelación.
Aprovisionamiento dinámico
Guarda el siguiente manifiesto en un archivo llamado
balanced-ha-storage.yaml
.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: balanced-ha-storage provisioner: pd.csi.storage.gke.io volumeBindingMode: WaitForFirstConsumer # Allow volume expansion. allowVolumeExpansion: true parameters: type: hyperdisk-balanced-high-availability # Provisioned throughput in MiB/s. provisioned-throughput-on-create: "250Mi" # Provisioned IOPS (input/output operations per second). provisioned-iops-on-create: "7000" allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - ZONE1 - ZONE2
Haz los cambios siguientes:
ZONE1
yZONE2
: las zonas de la región en las que se replicará el volumen aprovisionado dinámicamente.
Crea el objeto StorageClass:
kubectl create -f hdb-ha-example-class.yaml
Guarda el siguiente manifiesto de PersistentVolumeClaim en un archivo llamado
pvc-example.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
Haz los cambios siguientes:
ACCESS_MODE
: Hyperdisk Balanced High Availability admiteReadWriteOnce
,ReadWriteMany
yReadWriteOncePod
. Para ver las diferencias y los casos prácticos de cada modo de acceso, consulta Modos de acceso de volúmenes persistentes.- Si decides usar
ReadWriteMany
, también debes añadirvolumeMode: Block
aPersistentVolumeClaim
. Este ajuste evita que se dañen los datos, lo que puede ocurrir si varios pods escriben en el almacenamiento simultáneamente. El ajustevolumeMode: Block
expone el disco como un dispositivo de bloque sin formato que omite la gestión del sistema de archivos por parte de Kubernetes. A continuación, se muestra un ejemplo:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany volumeMode: Block storageClassName: balanced-ha-storage resources: requests: storage: 20Gi ```
Aplica el PersistentVolumeClaim que hace referencia al StorageClass que has creado anteriormente:
kubectl apply -f pvc-example.yaml
Aprovisionamiento manual
Sigue la documentación de Compute Engine para crear manualmente un volumen de Hyperdisk Balanced High Availability.
Guarda el siguiente manifiesto de PersistentVolume en un archivo llamado
pv-example.yaml
. El manifiesto hace referencia al volumen de Hyperdisk Balanced High Availability que acabas de crear:apiVersion: v1 kind: PersistentVolume metadata: name: pv-demo spec: capacity: storage: 500Gi accessModes: - ACCESS_MODE # ClaimRef links this PersistentVolume to a PersistentVolumeClaim. claimRef: namespace: default name: podpvc csi: driver: pd.csi.storage.gke.io # The unique identifier of the Compute Engine disk resource that backs this volume. volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1 # Node affinity to ensure the Pod is scheduled in a zone where the volume is replicated. nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.gke.io/zone operator: In values: - ZONE1 - ZONE2
Haz los cambios siguientes:
PROJECT_ID
: el ID del proyecto del volumen que has creado.REGION
: la región del disco que has creado. Consulta la documentación de Compute Engine para ver la disponibilidad regional más reciente.ZONE1
yZONE2
: las zonas de la región en las que se replica el volumen que has creado.ACCESS_MODE
: Hyperdisk Balanced High Availability admiteReadWriteOnce
,ReadWriteMany
yReadWriteOncePod
. Para ver las diferencias y los casos prácticos de cada modo de acceso, consulta Modos de acceso de volúmenes persistentes.
Crea el volumen persistente que haga referencia al volumen de Hyperdisk Balanced High Availability que has creado anteriormente:
kubectl apply -f pv-example.yaml
Guarda el siguiente manifiesto de PersistentVolumeClaim en un archivo llamado
pvc-example.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
Haz los cambios siguientes:
ACCESS_MODE
: Hyperdisk Balanced High Availability admiteReadWriteOnce
,ReadWriteMany
yReadWriteOncePod
. Debe ser el mismo modo de acceso que el especificado en PersistentVolume en el paso anterior. Para ver las diferencias y los casos prácticos de cada modo de acceso, consulta Modos de acceso de volúmenes persistentes.
Aplica la reclamación de volumen persistente que hace referencia al volumen persistente que has creado anteriormente:
kubectl apply -f pvc-example.yaml
Usar un volumen multiescritura en modo de bloque
Para usar un volumen en modo de bloque, debes especificar volumeBlock
en lugar de volumeMounts
en el pod consumidor. Un Pod de ejemplo que use el PersistenVolumeClaim
que hemos presentado anteriormente debería tener el siguiente aspecto:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
# Use volumeDevices instead of volumeMounts to consume the volume as a raw block device.
volumeDevices:
# The "mountPath" field specifies the path where the block device is accessible in the container.
- mountPath: /dev/my-device
name: mypvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: podpvc
readOnly: false
Discos persistentes regionales
Al igual que los discos persistentes zonales, los discos persistentes regionales se pueden aprovisionar dinámicamente según sea necesario o aprovisionar manualmente con antelación por el administrador del clúster, aunque se recomienda el aprovisionamiento dinámico.
Para utilizar discos persistentes regionales de tipo pd-standard
, asigna al atributo spec.resources.requests.storage
de PersistentVolumeClaim un valor mínimo de 200 GiB. Si tu caso práctico requiere un volumen menor, considera usar pd-balanced
o pd-ssd
.
Aprovisionamiento dinámico
Para habilitar el aprovisionamiento dinámico de discos persistentes regionales, crea un StorageClass
con el parámetro replication-type
y especifica las restricciones de zona en allowedTopologies
.
Por ejemplo, el siguiente manifiesto describe un StorageClass
llamado regionalpd-storageclass
que usa discos persistentes estándar y que 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
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
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 consuma un PersistentVolumeClaim
que use este StorageClass
, se aprovisionará un disco persistente regional con dos zonas. Una zona es la misma en la que está programado el Pod. La otra zona se elige aleatoriamente entre las zonas disponibles para el clúster.
Cuando se usa un clúster zonal, se debe definir allowedTopologies
.
Una vez que se haya creado el StorageClass
, crea un objeto PersistentVolumeClaim
con el campo storageClassName
para hacer referencia al StorageClass
. Por ejemplo, el siguiente archivo de manifiesto crea un PersistentVolumeClaim
llamado regional-pvc
y hace referencia al regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: regional-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: regionalpd-storageclass
Como StorageClass
se ha configurado con volumeBindingMode: WaitForFirstConsumer
, PersistentVolume
no se aprovisiona hasta que se crea un pod que usa PersistentVolumeClaim
.
El siguiente manifiesto es un ejemplo de Pod que usa el PersistentVolumeClaim
creado anteriormente:
kind: Pod
apiVersion: v1
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage
# This Pod uses the PVC that's associated with the
# "regionalpd-storageclass" StorageClass.
persistentVolumeClaim:
claimName: regional-pvc
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
# The volume is mounted into the container at the "/usr/share/nginx/html" path.
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
A continuación, puedes crear un PersistentVolume
que haga referencia al disco persistente regional que acabas de crear. Además de los objetos de Usar discos persistentes preexistentes como volúmenes persistentes, el PersistentVolume
de un disco persistente regional también debe especificar un node-affinity
.
Si usas un StorageClass
, debe especificar el controlador de CSI para Persistent Disk.
A continuación se muestra un ejemplo de un manifiesto de StorageClass
que usa discos persistentes estándar y que 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
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
allowedTopologies:
- matchLabelExpressions:
- key: topology.gke.io/zone
values:
- europe-west1-b
- europe-west1-c
Aquí tienes un ejemplo de archivo de manifiesto que crea un PersistentVolume
llamado pv-demo
y hace referencia al regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo
spec:
# The StorageClass that specifies regional replication.
storageClassName: "regionalpd-storageclass"
capacity:
storage: 500Gi
accessModes:
- ReadWriteOnce
claimRef:
namespace: default
name: pv-claim-demo
csi:
driver: pd.csi.storage.gke.io
# The unique identifier for the pre-existing regional disk.
volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
# Ensures that Pods are scheduled in zones where the disk is replicated.
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: topology.gke.io/zone
operator: In
values:
- europe-west1-b
- europe-west1-c
Ten en cuenta lo siguiente en el ejemplo de PersistentVolume
:
- El campo
volumeHandle
contiene detalles de lagcloud compute disks create
llamada, incluido tuPROJECT_ID
. - El campo
claimRef.namespace
debe especificarse aunque se le asigne el valordefault
.
Asignar nombres a discos persistentes
Kubernetes no puede distinguir entre discos persistentes zonales y regionales con el mismo nombre. Como solución alternativa, asegúrate de que los discos persistentes tengan nombres únicos. Este problema no se produce cuando se usan discos persistentes aprovisionados dinámicamente.
Siguientes pasos
- Consulta un tutorial para obtener información sobre cómo desplegar WordPress en GKE con discos persistentes y Cloud SQL.