Resumo rápido: neste guia, você monta Redis altamente disponível no Kubernetes usando StatefulSet + Sentinel + HAProxy, com failover automático e endpoint estável para as aplicações.

Cenário real: o que quebra primeiro

Se você roda Redis em produção, cedo ou tarde vai acontecer:

A boa notícia: dá para reduzir esse caos com uma arquitetura simples e pragmática:

  1. Redis em StatefulSet (identidade e volume persistente por pod)
  2. Sentinel (detecta falha e promove réplica)
  3. HAProxy (entrega um endpoint estável e aponta para o master ativo)

Ou seja: a app continua falando com o mesmo host/porta, e o “quem é master” vira problema da infra — como deveria ser.


Arquitetura recomendada

Arquitetura Redis HA no Kubernetes

Por que StatefulSet e não Deployment?

Kubernetes já responde isso muito bem: StatefulSet foi feito para workloads com estado.

Você ganha:

Para Redis, isso é ouro. Em Deployment “com sorte funciona”; em StatefulSet “funciona por desenho”.


Sentinel: o cérebro do failover

Sentinel faz quatro coisas importantes:

Boas práticas:

Observação importante: Sentinel não transforma replicação assíncrona em mágica. Em falhas extremas ainda pode haver janela de perda de escrita.


HAProxy: endpoint único para suas aplicações

Nem todo cliente Redis é sentinel-aware. E mesmo quando é, muitas equipes preferem simplificar.

O HAProxy resolve isso com health check TCP avançado:

Assim ele envia tráfego somente para o master ativo.

Exemplo de backend HAProxy:

backend redis-primary
  mode tcp
  option tcp-check
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send info replication\r\n
  tcp-check expect string role:master
  default-server inter 1s fall 3 rise 2 on-marked-down shutdown-sessions
Health check HAProxy Redis master

Exemplo de esqueleto Kubernetes

1) Headless Service do Redis

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  clusterIP: None
  selector:
    app: redis
  ports:
    - name: redis
      port: 6379

2) StatefulSet do Redis

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:7
          ports:
            - containerPort: 6379
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi

3) ConfigMap do HAProxy

apiVersion: v1
kind: ConfigMap
metadata:
  name: haproxy-config
data:
  haproxy.cfg: |
    frontend redis-write
      bind *:6379
      mode tcp
      default_backend redis-primary

    backend redis-primary
      mode tcp
      option tcp-check
      tcp-check send PING\r\n
      tcp-check expect string +PONG
      tcp-check send info replication\r\n
      tcp-check expect string role:master
      default-server inter 1s fall 3 rise 2 on-marked-down shutdown-sessions

4) Criar ConfigMap via kubectl

kubectl create configmap haproxy-config \
  --from-file=haproxy.cfg=haproxy.cfg \
  -n default

Checklist de produção


Teste de failover

  1. Descubra o master atual.
  2. Derrube o pod master:
kubectl delete pod redis-0

Ajuste o pod conforme o master ativo no momento.

  1. Observe eleição/promoção via Sentinel.
  2. Valide HAProxy apontando para novo master.
  3. Verifique impacto real na aplicação (timeout/retry/erro).

Se isso falhar no teste, falharia às 3h da manhã. Melhor descobrir agora.


Erros comuns que quase todo mundo comete

  1. Rodar tudo no mesmo nó e chamar isso de HA.
  2. Ignorar DNS/headless service no StatefulSet.
  3. Sem autenticação no Redis “porque é rede interna”.
  4. Não testar failover e confiar na fé.
  5. HAProxy único virando ponto único de falha.

Conclusão

Se você quer Redis estável no Kubernetes, esse combo funciona muito bem:

É uma arquitetura prática, robusta e com manutenção relativamente simples. Não é “zero complexidade” — mas é o tipo de complexidade que compra tranquilidade operacional.


Referências

https://arystech.com/blog/setting-up-haproxy-with-redis-sentinel-for-high-availability-on-microk8s-kubernetes

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/

https://www.haproxy.com/blog/haproxy-advanced-redis-health-check

Créditos de imagens

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *