El operador de alta disponibilidad (HA) con estado te permite usar la integración integrada de GKE con Persistent Disk regional para automatizar y controlar la velocidad de la conmutación por error de los pods de StatefulSet. Durante la conmutación por error, el operador se encarga automáticamente de detectar el fallo del nodo, separar un volumen de un nodo con errores y asegurar que el volumen se adjunte de forma segura al nodo de conmutación por error.
Por qué usar el operador de alta disponibilidad con estado
Una arquitectura con estado habitual para conseguir una alta disponibilidad usa discos persistentes regionales como capa de almacenamiento. Estos discos proporcionan la replicación síncrona de datos entre dos zonas de una región. Durante los fallos de nodos o de redes zonales, esta arquitectura permite que tus cargas de trabajo conmuten por error (mediante la conexión forzada) réplicas al almacenamiento de otro nodo de una zona diferente.
El operador de alta disponibilidad con estado te permite hacer las siguientes optimizaciones:
- Mejorar el tiempo de recuperación de las aplicaciones de una sola réplica: si solo usas una réplica, puedes usar el operador de alta disponibilidad con estado y cambiar el almacenamiento zonal por el regional cuando se aprovisione tu aplicación para aumentar la durabilidad y la disponibilidad de los datos en caso de que falle un nodo.
- Reducir los costes de redes entre zonas: replicar datos en varias zonas puede ser costoso para aplicaciones de alto rendimiento. Puedes usar el operador de alta disponibilidad con estado para ejecutar tu aplicación en una sola zona y, al mismo tiempo, mantener una ruta de conmutación por error a una zona alternativa que se ajuste al SLA de tu aplicación.
Limitaciones
- No se admite el tipo de volumen gcePersistentDisk. Usa un
PersistentVolume
que utilice el controlador de CSI para Persistent Disk. - Con una arquitectura de operador de alta disponibilidad con estado de réplica única, GKE conserva tus datos en dos zonas mediante un disco persistente regional, pero solo se puede acceder a los datos mientras la réplica de tu aplicación esté en buen estado. Durante una conmutación por error, tu aplicación no estará disponible temporalmente mientras tu réplica se reprograma en un nuevo nodo en buen estado. Si tu aplicación tiene un objetivo de tiempo de recuperación (RTO) muy bajo, te recomendamos que uses un enfoque de varias réplicas.
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 CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update
. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Requisitos
- Cuando usas el operador de alta disponibilidad con estado, se configura automáticamente el StatefulSet vinculado para que use discos persistentes regionales. Sin embargo, debes asegurarte de que los pods estén configurados para usar estos discos y de que puedan ejecutarse en todas las zonas asociadas al almacenamiento subyacente.
- Asegúrate de que tu aplicación se ejecute en formas de máquina que admita el disco persistente regional: E2, N1, N2 y N2D.
- Asegúrate de que el controlador de CSI para Persistent Disk en Compute Engine esté habilitado. El controlador de CSI para Persistent Disk está habilitado de forma predeterminada en los clústeres Autopilot y Estándar nuevos, y no se puede inhabilitar ni editar cuando se usa Autopilot. Si necesitas añadir manualmente el controlador de CSI para Persistent Disk desde tu clúster, consulta Habilitar el controlador de CSI para Persistent Disk en un clúster ya creado.
- Si usas un StorageClass personalizado, configura el controlador CSI de Persistent Disk con el
pd.csi.storage.gke.io
provisioner y estos parámetros:availability-class: regional-hard-failover
replication-type: regional-pd
Configurar y usar el operador de alta disponibilidad con estado
Sigue estos pasos para configurar el operador de alta disponibilidad con estado para tus cargas de trabajo con estado:
- Habilita el complemento
StatefulHA
. - Instala un recurso HighAvailabilityApplication.
- Instala un StatefulSet.
- Inspecciona el recurso HighAvailabilityApplication.
Habilita el complemento StatefulHA
Para usar el operador de alta disponibilidad con estado, el complemento StatefulHA
debe estar habilitado en tu clúster.
Clústeres de Autopilot: GKE habilita automáticamente el complemento
StatefulHA
al crear el clúster. Si quieres usar el operador de alta disponibilidad con estado en una carga de trabajo, debes habilitar manualmente el controlador de CSI para Persistent Disk en Compute Engine. Para obtener más información, consulta Habilitar el controlador de CSI para Persistent Disk en un clúster disponible.Clústeres estándar:
- Creación de un clúster: sigue las instrucciones de gcloud CLI para crear un clúster estándar y añade la siguiente marca:
--add-on=StatefulHA
. - Clúster estándar: sigue las instrucciones de gcloud CLI para actualizar la configuración de un clúster estándar y usa la siguiente marca para habilitar el complemento:
--update-addons=StatefulHA=ENABLED
.
- Creación de un clúster: sigue las instrucciones de gcloud CLI para crear un clúster estándar y añade la siguiente marca:
GKE instala automáticamente una StorageClass llamada standard-rwo-regional
cuando se habilita el complemento.
Instalar un recurso HighAvailabilityApplication
HighAvailabilityApplication
es un recurso de Kubernetes que simplifica la configuración de StatefulSet y aumenta la disponibilidad de los pods en GKE.
El operador de alta disponibilidad con estado reconcilia los recursos de HighAvailabilityApplication
en GKE.
En la especificación HighAvailabilityApplication
, debes definir HighAvailabilityApplication.spec.resourceSelection.resourceKind
como StatefulSet
.
Para saber cómo configurar el recurso HighAvailability, consulta la HighAvailabilityApplication
documentación de referencia.
Consulta el siguiente ejemplo de PostgreSQL:
Guarda el siguiente manifiesto en un archivo llamado
stateful-ha-example-resource.yaml
:kind: HighAvailabilityApplication apiVersion: ha.gke.io/v1 metadata: name: APP_NAME namespace: APP_NAMESPACE spec: resourceSelection: resourceKind: StatefulSet policy: storageSettings: requireRegionalStorage: true failoverSettings: forceDeleteStrategy: AfterNodeUnreachable afterNodeUnreachable: afterNodeUnreachableSeconds: 20
Haz los cambios siguientes:
- APP_NAME: el nombre de una aplicación de tu clúster que quieras proteger. Este nombre debe ser el mismo para HighAvailabilityApplication y StatefulSet.
- APP_NAMESPACE: el espacio de nombres de la aplicación. Este espacio de nombres debe compartirse entre HighAvailabilityApplication y StatefulSet protegidos.
En este ejemplo:
- La opción
HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettings
está configurada comotrue
. De esta forma, se aplica el almacenamiento regional. HighAvailabilityApplication.spec.policy.failoverSettings
está configurado enAfterNodeUnreachable
. Determina cómo se activa la eliminación forzada cuando falla un nodo.HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable
se ha establecido en 20. Es el tiempo de espera para forzar la eliminación de un pod después de que el nodo en el que se está ejecutando se marque como no accesible.
Crea el recurso. El recurso
HighAvailabilityApplication
identifica un StatefulSet con un espacio de nombres y un nombre coincidentes.kubectl apply -f stateful-ha-example-resource.yaml
Instalar un StatefulSet
Instala un StatefulSet. Por ejemplo, puedes instalar un StatefulSet de PostgreSQL con Helm (Helm viene preinstalado en Cloud Shell):
helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
--namespace=APP_NAMESPACE \
--set fullnameOverride=APP_NAME
El recurso HighAvailabilityApplication
modifica automáticamente el StorageClass de StatefulSet a standard-rwo-regional
, que usa Persistent Disk regional.
Inspecciona el recurso HighAvailabilityApplication
Ejecuta el siguiente comando para verificar que la aplicación de ejemplo tiene habilitada la conmutación por error automática:
kubectl describe highavailabilityapplication APP_NAME
La salida debería ser similar a la siguiente:
Status:
Conditions:
Last Transition Time: 2023-08-09T23:59:52Z
Message: Application is protected
Observed Generation: 1
Reason: ApplicationProtected
Status: True
Type: Protected
Usar discos persistentes
Si utilizas un disco persistente y un objeto PersistentVolume definido de forma estática, configura el objeto PersistentVolume con force-attach: true
en .spec.csi.volumeAttributes
. Por ejemplo:
apiVersion: v1
kind: PersistentVolume
metadata:
name: PV_NAME
spec:
storageClassName: "STORAGE_CLASS_NAME"
capacity:
storage: DISK_SIZE
accessModes:
- ReadWriteOnce
claimRef:
name: PV_CLAIM_NAME
namespace: default
csi:
driver: pd.csi.storage.gke.io
volumeHandle: DISK_ID
fsType: FS_TYPE
volumeAttributes:
force-attach: true