Marcio Cunha

Kubernetes instável? Como ajustar os liveness probes

Entenda como configurar liveness probes de forma correta no Kubernetes para evitar reinicializações em cascata, falsos positivos e quedas em pods de alta carga.

Marcio Cunha•6 min
Também disponível em:EnglishEspañol
Resumo
  • Configurar liveness probes agressivos demais derruba aplicações sob alta carga por falsos positivos.
  • A separação estrita entre liveness e readiness impede que tráfego seja enviado a pods sobrecarregados.
  • Ajustar tempos de inicialização com initialDelaySeconds protege containers lentos contra loops de reboot.
  • O uso correto de failureThreshold e periodSeconds garante resiliência contra picos momentâneos de CPU.
  • Monitorar o consumo real de recursos complementa o ajuste de sondas de saúde em ambientes produtivos.

O perigo invisível das sondas de saúde agressivas

Gerenciar aplicações em ambientes distribuídos exige que a plataforma saiba exatamente quando um programa travou e precisa ser reiniciado. No ecossistema de orquestração de containers, essa verificação é feita por mecanismos automáticos conhecidos como sondas de saúde. Na prática, isso significa que o sistema envia pings periódicos para checar se a aplicação continua viva e respondendo a comandos básicos. No entanto, configurar esses limites de forma descuidada transforma o orquestrador em um carrasco implacável, destruindo instâncias perfeitamente saudáveis apenas porque sofreram um breve engasgo de processamento.

Quando uma aplicação enfrenta um pico repentino de acessos, o consumo de recursos dispara e o tempo de resposta aumenta. Se o limite configurado para a resposta dessa verificação for rigoroso demais, o sistema interpretará a lentidão como uma falha catastrófica. Como resultado, o container é terminado e recriado imediatamente, o que consome ainda mais recursos da máquina e piora o cenário. Esse comportamento gera um ciclo vicioso de quedas em cascata, onde a tentativa de corrigir o problema acaba agravando a instabilidade geral do cluster.

Para entender melhor como evitar esse tipo de colapso operacional, vale a pena correlacionar o comportamento de sondas com estratégias de resiliência. Em cenários onde a estabilidade é colocada à prova, técnicas avançadas ajudam a mapear falhas, conforme discutimos ao analisar como testar a resiliência em um servidor instável usando Chaos Engineering. O segredo para dominar o Kubernetes reside em compreender o papel exato de cada tipo de mecanismo de verificação integrado à infraestrutura.

Entendendo a diferença entre liveness e readiness

O maior erro cometido por equipes de engenharia ao estruturar arquivos de configuração é misturar as responsabilidades das sondas de vida e de prontidão. A sonda de vida serve exclusivamente para detectar se o processo interno travou em um estado irrecuperável, como um deadlock de threads onde o código entra em um loop infinito. Se ela falhar repetidas vezes, a única saída é reiniciar o processo do zero. Já a sonda de prontidão indica se o container está apto a receber tráfego externo, funcionando como um filtro que isola instâncias ocupadas ou em fase inicial de aquecimento.

Na prática, se uma aplicação está ocupada processando uma consulta pesada ao banco de dados e demora um segundo a mais para responder, ela não está travada; ela está apenas trabalhando. Se a verificação de vida estiver apontando para esse endpoint pesado, o orquestrador vai matar o processo achando que ele morreu. Por outro lado, se essa mesma verificação for direcionada para uma rota leve e isolada, como um endpoint interno que apenas retorna um código de sucesso simples, evitam-se alarmes falsos e mantém-se a integridade operacional intacta.

Essa separação de papéis é um pilar fundamental para garantir que o sistema sobreviva a rajadas de tráfego sem colapsar. Quando projetamos arquiteturas resilientes, precisamos garantir que falhas locais não se propaguem por toda a malha de serviços. Para aprofundar esses conceitos, vale a pena examinar boas práticas sobre como desenhar alta resiliência e evitar que sistemas fiquem fora do ar diante de falhas parciais.

Parâmetros vitais para evitar reinicializações em cascata

Ajustar os parâmetros de tempo e repetição exige cautela e análise do comportamento real da aplicação sob carga de produção. O primeiro parâmetro crítico é o atraso inicial, que define o tempo de espera antes que a primeira verificação seja executada. Aplicações pesadas que carregam frameworks complexos precisam de tempo para compilar rotas em memória ou aquecer caches internos. Sem esse atraso inicial adequado, o container será derrubado antes mesmo de terminar de inicializar, gerando um loop infinito de reboots.

Outros dois parâmetros cruciais são o período de checagem e o limiar de falhas consecutivas necessárias para decretar a morte do processo. O período define o intervalo de tempo entre uma verificação e outra, enquanto o limiar determina quantas falhas seguidas o sistema tolera antes de agir. Configurar verificações a cada dois segundos com tolerância de apenas uma falha é um convite ao desastre em ambientes de alta carga. O ideal é adotar intervalos maiores, como dez ou quinze segundos, e exigir ao menos três falhas consecutivas para confirmar que o problema é real.

Ajustar essas métricas com base no perfil de consumo da aplicação protege o cluster contra oscilações passageiras de rede ou CPU. O objetivo principal é dar margem para que o coletor de lixo da linguagem ou uma rota temporariamente lenta se recupere sozinha, sem intervenção drástica do orquestrador. Quando combinamos essa afinação com um pipeline de entrega contínua estável, o ciclo de vida dos containers torna-se previsível e imune a surpresas indesejadas em horários de pico.

Como estruturar um manifesto robusto na prática

Escrever um manifesto de deployment resiliente exige atenção cirúrgica aos blocos de configuração de saúde. Abaixo, apresentamos um exemplo prático de configuração equilibrada, utilizando rotas dedicadas e tempos seguros para evitar falsos positivos em ambientes produtivos.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-servico
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: app
        image: minha-api:v1.2
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 15
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
          failureThreshold: 2

Neste exemplo funcional, a sonda de vida aguarda trinta segundos para começar as checagens, testando um endpoint leve a cada quinze segundos e tolerando até três falhas antes de reiniciar o container. Isso garante que picos momentâneos de uso de processador não sejam interpretados como travamentos definitivos. A sonda de prontidão, por sua vez, age com mais agilidade para retirar pods lentos do balanceamento de carga sem destruí-los.

Manter essa estrutura alinhada com as necessidades reais da aplicação evita desperdício de infraestrutura e reduz chamados de alerta noturnos para a equipe de engenharia. É importante lembrar que qualquer alteração nesses parâmetros deve ser validada em ambientes de homologação que simulem o tráfego real de produção. Com testes consistentes e métricas ajustadas, o cluster ganha a maturidade necessária para operar de forma autônoma e segura. Para aprofundar esses conceitos na prática em produção, confira também nossa análise técnica sobre Deploy travado? Como usar feature flags no ArgoCD.

Considerações finais sobre a estabilidade de containers

Ajustar sondas de saúde em plataformas de orquestração de containers não é apenas uma tarefa de configuração burocrática, mas uma decisão arquitetural profunda. Quando entendemos que a lentidão sob alta carga não significa necessariamente falha de sistema, mudamos a forma como tratamos a resiliência operacional. O equilíbrio entre tolerar atrasos temporários e detectar travamentos reais protege o investimento em infraestrutura e garante uma experiência estável para o usuário final.

Revisar periodicamente esses limites e monitorar o comportamento dos pods sob estresse contínuo é o caminho definitivo para manter ambientes produtivos saudáveis e previsíveis. Com uma estratégia bem desenhada, a infraestrutura deixa de ser um fator de dor de cabeça e passa a sustentar o crescimento do negócio com total confiabilidade e autonomia.