Aumente a disponibilidade de apps com estado com o Stateful HA Operator

O operador de alta disponibilidade (HA) com estado permite-lhe usar a integração incorporada do GKE com o disco persistente regional para automatizar e controlar a velocidade da comutação por falha do pod StatefulSet. Durante a comutação por falha, o operador processa automaticamente a deteção de falhas de nós, a desassociação de um volume de um nó com falhas e garante a associação segura do volume ao nó de comutação por falha.

Por que deve usar o operador de HA com estado

Uma arquitetura com estado comum para alcançar a alta disponibilidade usa discos persistentes regionais como a camada de armazenamento. Estes discos oferecem replicação síncrona de dados entre duas zonas numa região. Durante falhas de nós ou de rede zonal, esta arquitetura permite que as suas cargas de trabalho mudem para um sistema alternativo (anexando à força) réplicas ao armazenamento noutro nó numa zona diferente.

O operador de HA com estado permite-lhe fazer as seguintes otimizações:

  • Melhore o tempo de recuperação de aplicações com uma única réplica: se usar apenas uma réplica, pode usar o operador de HA com estado e substituir o armazenamento zonal pelo armazenamento regional quando a sua aplicação for aprovisionada, para aumentar a durabilidade e a disponibilidade dos dados em caso de falha de um nó.
  • Reduza os custos de rede entre zonas: a replicação de dados em várias zonas pode ser dispendiosa para aplicações de elevado débito. Pode usar o operador de HA com estado para executar a sua aplicação numa única zona, mantendo um caminho de comutação por falha para uma zona alternativa que se ajuste ao SLA da sua aplicação.

Limitações

  • O tipo de volume gcePersistentDisk não é suportado. Use um PersistentVolume que use o controlador CSI de disco persistente.
  • Com uma arquitetura de operador de HA com estado de réplica única, o GKE persiste os seus dados em duas zonas através do disco persistente regional, mas os dados só estão acessíveis enquanto a réplica da aplicação estiver em bom estado. Durante uma transferência de controlo, a sua aplicação fica temporariamente indisponível enquanto a réplica é reagendada para um novo nó em bom estado. Se a sua aplicação tiver um objetivo de tempo de recuperação (RTO) muito baixo, recomendamos que use uma abordagem com várias réplicas.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

Requisitos

  • Quando usa o operador de HA com estado, este configura automaticamente o StatefulSet associado para usar discos persistentes regionais. No entanto, é responsável por garantir que os pods estão configurados para usar estes discos e que são capazes de ser executados em todas as zonas associadas ao armazenamento subjacente.
  • Certifique-se de que a sua aplicação é executada em formatos de máquinas que o disco persistente regional suporta: E2, N1, N2, N2D.
  • Certifique-se de que o controlador CSI do Persistent Disk do Compute Engine está ativado. O controlador CSI do disco persistente está ativado por predefinição em novos clusters do Autopilot e Standard, e não pode ser desativado nem editado quando usa o Autopilot. Se precisar de adicionar manualmente o controlador CSI do disco persistente a partir do cluster, consulte o artigo Ativar o controlador CSI do disco persistente num cluster existente.
  • Se estiver a usar uma StorageClass personalizada, configure o controlador CSI do disco persistente com o aprovisionador pd.csi.storage.gke.io e estes parâmetros:
    • availability-class: regional-hard-failover
    • replication-type: regional-pd

Configure e use o operador de HA com estado

Siga estes passos para configurar o operador de HA com estado para as suas cargas de trabalho com estado:

  1. Ative o suplemento StatefulHA.
  2. Instale um recurso HighAvailabilityApplication.
  3. Instale um StatefulSet.
  4. Inspeccione o recurso HighAvailabilityApplication.

Ative o suplemento StatefulHA

Para usar o operador de HA com estado, o suplemento StatefulHA tem de estar ativado no seu cluster.

  • Clusters do Autopilot: o GKE ativa automaticamente o suplemento StatefulHA quando o cluster é criado. Se quiser usar o operador de HA com estado numa carga de trabalho existente, tem de ativar manualmente o controlador CSI do Persistent Disk do Compute Engine. Para mais informações, consulte o artigo Ative o controlador CSI de disco persistente num cluster existente.

  • Clusters padrão:

O GKE instala automaticamente uma StorageClass denominada standard-rwo-regional quando o suplemento está ativado.

Instale um recurso HighAvailabilityApplication

HighAvailabilityApplication é um recurso do Kubernetes que simplifica as definições do StatefulSet e aumenta a disponibilidade dos pods no GKE. O operador de HA com estado reconcilia os recursos HighAvailabilityApplication no GKE.

Na especificação HighAvailabilityApplication, tem de definir HighAvailabilityApplication.spec.resourceSelection.resourceKind como StatefulSet.

Para saber como configurar o recurso HighAvailability, consulte a HighAvailabilityApplication documentação de referência.

Veja o exemplo seguinte para o PostgreSQL:

  1. Guarde o seguinte manifesto num ficheiro com o nome 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
    

    Substitua o seguinte:

    • APP_NAME: o nome de uma aplicação no seu cluster que quer proteger. Este nome tem de ser partilhado pela HighAvailabilityApplication e pelo StatefulSet.
    • APP_NAMESPACE: o espaço de nomes da aplicação. Este espaço de nomes tem de ser partilhado pela HighAvailabilityApplication e pelo StatefulSet que estão a ser protegidos.

    Neste exemplo:

    • A definição de HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettings é true. Isto aplica o armazenamento regional.
    • A definição de HighAvailabilityApplication.spec.policy.failoverSettings é AfterNodeUnreachable. Isto determina como a eliminação forçada é acionada em caso de falha do nó.
    • HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable está definido como 20. Este é o limite de tempo para forçar a eliminação de um pod depois de o nó em que está a ser executado ser marcado como inacessível.
  2. Crie o recurso. O recurso HighAvailabilityApplication identifica um StatefulSet com um espaço de nomes e um nome correspondentes.

    kubectl apply -f stateful-ha-example-resource.yaml
    

Instale um StatefulSet

Instale um StatefulSet. Por exemplo, pode instalar um StatefulSet do PostgreSQL usando o Helm (o Helm vem pré-instalado com o Cloud Shell):

helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
  --namespace=APP_NAMESPACE \
  --set fullnameOverride=APP_NAME

O recurso HighAvailabilityApplication modifica automaticamente a StorageClass do StatefulSet para standard-rwo-regional, que usa o disco persistente regional.

Inspecione o recurso HighAvailabilityApplication

Execute o seguinte comando para verificar se a aplicação de exemplo tem a comutação por falha automatizada ativada:

kubectl describe highavailabilityapplication APP_NAME

O resultado deve ser semelhante ao seguinte:

Status:
Conditions:
  Last Transition Time:  2023-08-09T23:59:52Z
  Message:               Application is protected
  Observed Generation:   1
  Reason:                ApplicationProtected
  Status:                True
  Type:                  Protected

Use discos persistentes existentes

Se estiver a usar um disco persistente existente e um PersistentVolume definido estaticamente, configure o PersistentVolume com force-attach: true em .spec.csi.volumeAttributes. Por exemplo:

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