Aumentar la disponibilidad de aplicaciones con reconocimiento del estado con el operador de alta disponibilidad con reconocimiento del estado

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:

  1. Habilita el complemento StatefulHA.
  2. Instala un recurso HighAvailabilityApplication.
  3. Instala un StatefulSet.
  4. 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.

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:

  1. 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 como true. De esta forma, se aplica el almacenamiento regional.
    • HighAvailabilityApplication.spec.policy.failoverSettings está configurado en AfterNodeUnreachable. 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.
  2. 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