Sondas do Kubernetes: quando esperar, encaminhar tráfego ou reiniciar
As sondas de inicialização, prontidão e vitalidade respondem a perguntas operacionais diferentes. Utilize uma matriz de decisão, contratos explícitos de endpoints e um plano proposto de testes de falhas em pré-produção para escolher quando uma aplicação deve esperar, sair da rotação de tráfego ou reiniciar.
Um processo de API hipotético está em execução, mas a inicialização ainda não terminou. Mais tarde, a sua base de dados fica indisponível. Noutro dia, um bloqueio mútuo local impede a conclusão dos pedidos. Cada uma destas situações pode causar uma falha numa verificação de saúde. Não devem provocar automaticamente a mesma resposta.
Decida o que ajudaria. Dar mais tempo para a inicialização? Retirar esta instância do tráfego? Reiniciar o seu contentor? O Kubernetes atribui uma semântica de sondas diferente a cada uma destas opções, como explica a documentação oficial sobre sondas.
Um bom desenho de sondas começa por uma justificação da recuperação. Este guia aborda uma aplicação HTTP convencional num Deployment, atrás de um Service normal. O acesso direto a Pods, os processos de trabalho, as configurações especializadas de Service e o encaminhamento personalizado precisam de uma análise separada. A configuração é ilustrativa e não foi executada.
Prontidão, vitalidade e inicialização no Kubernetes: três decisões diferentes
A sonda determina o que o Kubernetes faz com o sinal do endpoint. Consulte o comportamento das sondas do Kubernetes antes de escolher a verificação.
| Sonda | Pergunta | Consequência da falha ao atingir o limiar configurado | Evidência adequada |
|---|---|---|---|
| Inicialização | A inicialização terminou? | Terminação do contentor, seguida da aplicação da política de reinício | Inicialização local necessária concluída |
| Prontidão | Esta instância deve receber este tráfego? | O contentor deixa de estar pronto, afetando a prontidão do Pod e o tráfego dos Services correspondentes | Capacidade de servir os pedidos abrangidos |
| Vitalidade | A recuperação local por reinício é adequada? | Terminação do contentor, seguida da aplicação da política de reinício | Uma falha local que o reinício pode resolver |
A sonda de inicialização protege a inicialização
Uma sonda de inicialização suspende as verificações de vitalidade e prontidão até ter sucesso. Assim, a inicialização tem a sua própria margem de tempo sem enfraquecer as verificações contínuas. Continua a existir um limite: falhas repetidas na inicialização terminam o contentor. As orientações de configuração da inicialização descrevem esta espera limitada.
A prontidão controla a elegibilidade para receber tráfego
Uma falha de prontidão não reinicia nada por si só. Altera a prontidão e a elegibilidade para receber tráfego dos Services correspondentes. A prontidão do Pod também exige que os outros contentores e quaisquer condições adicionais de prontidão configuradas estejam satisfeitos, como explica a documentação sobre o ciclo de vida dos Pods. O trabalho em segundo plano não para só porque a instância deixa de estar pronta, e uma verificação falhada não prova que todas as rotas estejam inutilizáveis. Consulte a documentação sobre sondas para conhecer a consequência para o Service; o encerramento precisa de um contrato separado.
A vitalidade pergunta se reiniciar pode ajudar
Ao atingir o limiar de falha, a sonda de vitalidade desencadeia a terminação do contentor específico, sem substituir o Pod inteiro. A política de reinício determina o que acontece a seguir, incluindo a espera progressiva descrita na documentação sobre o ciclo de vida dos Pods. Um processo em execução pode estar bloqueado. Um processo à espera de um serviço externo indisponível pode não ter nenhum problema local.
O modelo Esperar, Encaminhar, Reiniciar para decisões sobre sondas
Esperar, Encaminhar, Reiniciar é uma ferramenta de apoio à decisão editorial original da Optijara, não uma funcionalidade do Kubernetes, uma norma da indústria ou um método verificado com clientes. Utilize-a para avaliar a justificação da recuperação antes de implementar uma verificação de saúde.
Associe a falha a uma ação
Todos os cenários abaixo são hipotéticos. Teste as condições de aceitação na carga de trabalho real.
| Condição de falha | Sinal útil | Ação da sonda | Recuperação esperada | Evidência de aceitação |
|---|---|---|---|---|
| Inicialização incompleta | Estado da inicialização local | Esperar durante a margem limitada de inicialização | A inicialização termina | Os pedidos só começam depois de a verificação de prontidão ter sucesso |
| Dependência essencial dos pedidos indisponível | Estado da dependência no âmbito definido | Considerar uma falha de prontidão, sem provocar automaticamente uma falha de vitalidade | A dependência recupera | As rotas necessárias recuperam sem reinícios inexplicados |
| Bloqueio mútuo local | Sinal de progresso associado ao percurso de atendimento dos pedidos | Considerar uma falha de vitalidade | O reinício restabelece o progresso local | O processo de substituição serve pedidos |
| Telemetria opcional indisponível | Falha específica de uma funcionalidade | Manter as rotas úteis elegíveis | A telemetria recupera separadamente | As rotas principais continuam utilizáveis |
As dependências partilhadas complicam a decisão de encaminhamento. Se todas as réplicas verificarem o mesmo serviço de retaguarda indisponível, retirar uma instância pode acabar por retirar todas. A análise prática de Colin Breck examina este problema do domínio de falha. Reiniciar as réplicas não pode, por si só, reparar a dependência que partilham.
Registe a evidência e a responsabilidade pela recuperação
Registe junto da configuração o que continua útil, o que o reinício alteraria e quem é responsável pela recuperação. Este JSON é um registo de planeamento, não uma política executável.
{
"framework": "wait-route-restart",
"wait": "bounded-initialization-allowance",
"route": "scoped-request-usefulness",
"restart": "tested-local-recovery-mechanism",
"acceptance": "observed-state-and-real-requests"
}Omitir a sonda de vitalidade pode ser razoável quando não existe um sinal de reinício justificado. O Kubernetes documenta essa opção. A objeção merece igual atenção: retirar uma instância por falta de prontidão pode, por si só, deixar uma instância bloqueada indisponível indefinidamente. A análise de Breck mostra por que razão esse desenho continua a precisar de alguém ou de algum mecanismo responsável por restabelecer o progresso.
Verificações de dependências na prontidão sem retirar capacidade útil
Separe as dependências essenciais das funcionalidades opcionais
As orientações oficiais permitem verificações de prontidão para dependências estritamente necessárias de serviços de retaguarda. Henning Jacobs alerta para as verificações de dependências partilhadas, enquanto Breck examina pedidos com dependências diferentes. Pergunte o que se consegue ao retirar a instância.
Considere uma API hipotética que precisa da sua base de dados para todos os pedidos autorizados. Marcar a instância como não pronta pode descrever corretamente a sua capacidade. Noutra API hipotética, as rotas de leitura funcionam apesar de uma falha na telemetria. Retirar a instância descartaria capacidade útil. O funcionamento degradado tem de continuar a respeitar a autorização e os outros requisitos de segurança.
Quando as rotas dependem de serviços diferentes, considere o tratamento de falhas por rota ou cargas de trabalho separadas com contratos de prontidão distintos. A fronteira de falha tem de justificar os custos adicionais de implantação e manutenção.
Limite as verificações e preserve o funcionamento degradado
Defina limites de tempo para as verificações de dependências e especifique o que acontece quando o tempo limite é excedido. O estado de saúde em cache precisa de uma idade máxima e de uma regra para resultados desconhecidos ou desatualizados. Uma verificação bem-sucedida ontem não é evidência de que o serviço pode aceitar pedidos agora.
A prontidão pode oscilar. O Kubernetes oferece limiares de sucessos e falhas consecutivos, cuja semântica está descrita no guia de configuração. Escolha esses limiares com base no comportamento observado. Qualquer suavização adicional no código da aplicação também precisa de testes.
Mantenha as falhas de dependências fora da verificação de vitalidade, a menos que os testes expliquem como um reinício local as repara. Os artigos dos profissionais incluem exemplos históricos de controladores; valide o percurso de entrada instalado em vez de presumir que esses exemplos descrevem o seu comportamento atual.
Uma configuração ilustrativa de sondas HTTP e um contrato de endpoints
Atribua significados separados à inicialização, à prontidão e à vitalidade
Este fragmento pertence à especificação de um contentor. Não é um Deployment completo e executável. Pressupõe uma aplicação à escuta na porta 8080 com os endpoints apresentados. Os valores de tempo são exemplos sem avaliação de desempenho, não recomendações de ajuste.
ports:
- name: http
containerPort: 8080
startupProbe:
httpGet:
path: /startupz
port: http
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 24
successThreshold: 1
readinessProbe:
httpGet:
path: /readyz
port: http
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
successThreshold: 2
livenessProbe:
httpGet:
path: /livez
port: http
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
successThreshold: 1Segundo este contrato proposto, /startupz comunica a conclusão da inicialização. /readyz comunica se a instância deve receber o tráfego abrangido pelo seu contrato. /livez deteta uma condição local que o reinício pode resolver. Os caminhos separados tornam este exemplo mais fácil de rever; o Kubernetes não exige URLs separados.
As sondas HTTP verificam o estado da resposta, não o sucesso de uma operação de negócio. O guia oficial de configuração define os códigos de estado de sucesso como 200 a 399. O tratamento de redirecionamentos tem exceções que merecem análise: o kubelet segue redirecionamentos para o mesmo anfitrião, mas um redirecionamento para um anfitrião diferente ou 11 ou mais redirecionamentos são tratados como sucesso com um evento ProbeWarning. Prefira uma resposta explícita de saúde a um redirecionamento para uma página de início de sessão. Mantenha os corpos das respostas pequenos e exclua segredos ou detalhes sensíveis sobre dependências.
Escolha os tempos com base em evidência da carga de trabalho
periodSeconds define a frequência das sondas. timeoutSeconds limita a duração de uma sonda individual. failureThreshold conta as falhas consecutivas, enquanto successThreshold conta os sucessos consecutivos após uma falha. Este último tem de ser 1 para as sondas de inicialização e vitalidade. A verificação de prontidão pode ser executada com maior frequência enquanto o contentor não estiver pronto. Estas são semânticas documentadas dos campos, não uma receita de ajuste.
Meça a inicialização nas condições de arranque que pretende suportar, incluindo arranques a frio relevantes. Reveja também o período de tolerância para a terminação. O kubelet respeita o período aplicável durante a terminação desencadeada por uma sonda; o período de tolerância definido ao nível da sonda está disponível para inicialização e vitalidade, mas não para prontidão. Consulte a documentação sobre sondas.
Multiplicar limiares não produz um prazo exato de recuperação. O agendamento, os tempos limite, o encerramento, a espera progressiva entre reinícios e a inicialização também afetam o tempo decorrido. Um guia executável precisaria de um ambiente de teste completo com versões fixadas e resultados de execução guardados. Este fragmento não foi executado num cluster.
Um guia para pré-produção: testar falhas, analisar a evidência e depois implementar
Registe a situação de referência e teste uma falha de cada vez
Estes são testes propostos, não resultados experimentais. Antes do primeiro teste:
- Faça um inventário do comportamento dos endpoints, das predefinições de saúde do framework e dos pressupostos de encaminhamento.
- Guarde a configuração atual das sondas e a evidência de referência dos pedidos, da prontidão e dos reinícios.
- Atribua uma ação esperada e um responsável pela recuperação a cada falha.
- Provoque uma falha de cada vez numa carga de trabalho isolada em pré-produção.
- Compare as observações com o contrato antes de aprovar uma implementação de alcance limitado.
- Guarde a configuração da aplicação revista e o procedimento de reversão da implantação.
Utilize uma aplicação descartável para bloqueios deliberados. Não introduza bloqueios mútuos em serviços de produção partilhados.
| Teste proposto | Prontidão e reinícios esperados | Resultado dos pedidos úteis | Gatilho de recuperação | Evidência a guardar |
|---|---|---|---|---|
| Inicialização atrasada dentro da margem | Não pronta até as sondas de inicialização e prontidão terem sucesso; sem reinício desencadeado por sondas | Sem tráfego prematuro do Service | A inicialização termina | Registos de inicialização, condições, pedidos |
| Indisponibilidade de uma dependência essencial | Não pronta conforme definido no contrato; sem reinício automático por vitalidade | As operações necessárias falham explicitamente | Dependência restabelecida | Estado da dependência, eventos, contagens de reinícios |
| Indisponibilidade de uma dependência opcional | As rotas úteis mantêm-se prontas; sem reinício desencadeado por sondas | As operações principais continuam disponíveis | Funcionalidade opcional restabelecida | Pedidos e erros específicos de cada rota |
| Recuperação da prontidão | A sonda tem sucesso após o número configurado de sucessos; a prontidão do Pod continua a exigir outras condições; sem necessidade de reinício | O percurso pretendido através do Service volta a funcionar | Contrato de prontidão restabelecido | Estado do EndpointSlice e cronologia dos pedidos |
| Bloqueio local controlado | A prontidão segue o seu contrato; terminação por vitalidade apenas quando justificada | O processo reiniciado retoma o trabalho útil | Reinício do processo local | Eventos das sondas, registos anteriores, pedidos |
Verifique tanto o estado do Kubernetes como os pedidos reais
Leia as condições do Pod e as contagens de reinícios dos contentores. Analise os eventos e os registos do contentor anterior, quando disponíveis, e depois relacione a prontidão dos EndpointSlices dos Services correspondentes com os pedidos através do Service ou do percurso de entrada pretendido. A documentação sobre sondas e a documentação sobre o ciclo de vida explicam as transições de estado. Uma configuração aceite, por si só, demonstra pouco sobre a recuperação.
As alterações nos EndpointSlices chegam aos mecanismos de observação e às caches dos clientes em momentos diferentes, como explica a documentação oficial sobre EndpointSlice. Esta também documenta uma exceção: publishNotReadyAddresses faz com que ready do endpoint seja verdadeiro independentemente da prontidão do Pod. Este guia pressupõe que essa opção está desativada. Teste o percurso de encaminhamento instalado e os pedidos de longa duração; não presuma que todos os controladores param imediatamente novos encaminhamentos ou que uma falha de prontidão fecha ligações já estabelecidas.
Para serviços de inferência, compare a evidência das sondas com a observabilidade da inferência de IA. Um processo saudável não comprova a latência das respostas, o sucesso dos pedidos ou a qualidade dos resultados. O guia de rastreamento GenAI com OpenTelemetry acrescenta contexto para chamadas a modelos e ferramentas. Complementa os testes das sondas.
Meça a recuperação, não apenas indicadores verdes.
| Medição | Método de recolha | Pergunta de aceitação |
|---|---|---|
| Comportamento da inicialização | Registar a hora das transições de inicialização e prontidão | A margem cobre as condições de arranque pretendidas? |
| Comportamento dos reinícios | Comparar contagens, eventos e registos anteriores | O reinício resolveu a falha local? |
| Elegibilidade para receber tráfego | Relacionar as condições do Pod com o estado do EndpointSlice | Apenas as instâncias previstas foram retiradas e recuperaram? |
| Comportamento visível para o utilizador | Testar rotas representativas através do encaminhamento real | Os pedidos úteis comportaram-se como o contrato especifica? |
| Recuperação e custo das verificações | Registar a cronologia da recuperação e o uso de recursos do mecanismo de saúde | A recuperação está explicada sem um custo excessivo de verificação? |
Defina a recuperação e a reversão antes da produção
Rejeite a alteração se forem retiradas réplicas não relacionadas, se os reinícios aumentarem sem recuperação, se as rotas úteis falharem ou se a recuperação continuar sem explicação. Defina critérios de aceitação para a carga de trabalho em vez de adotar limiares universais de latência ou disponibilidade.
A reversão tem de restabelecer o contrato de endpoints revisto e a configuração das sondas através do processo normal de implantação. Verifique depois a prontidão, o comportamento dos reinícios e os pedidos reais. Um comando de implantação bem-sucedido não comprova a recuperação.
Os erros das equipas e o que as sondas não podem garantir
Evite sinais de falha partilhados e reinícios injustificados
As verificações idênticas merecem análise quando as consequências das suas falhas são diferentes. Outros erros incluem verificar um serviço à escuta numa porta de gestão que revela pouco sobre o percurso de atendimento dos pedidos, ou definir limiares agressivos sem medir a inicialização. Jacobs aborda os pontos cegos das portas de gestão e os riscos dos reinícios.
Insistir em URLs diferentes também não é melhor como regra absoluta. O Kubernetes descreve configurações com um endpoint partilhado e limiares diferentes. Avalie o sinal e a sua consequência. O nome do endpoint não permite decidir se um reinício vai ajudar.
Trate as interrupções, o encerramento e o trabalho durável separadamente
Um PodDisruptionBudget limita as operações suportadas de remoção voluntária. Não coordena os reinícios de contentores desencadeados por sondas de vitalidade nem garante um nível mínimo de disponibilidade. A documentação oficial sobre interrupções define o seu âmbito. A discussão histórica da comunidade ajuda a explicar a confusão; não é uma especificação atual.
Retirar uma instância por falta de prontidão não proporciona terminação graciosa, escoamento de ligações ou encerramento dos processos de trabalho. A documentação sobre o ciclo de vida dos Pods trata a terminação separadamente. Essas responsabilidades precisam de desenhos e testes explícitos.
Reiniciar um contentor também não estabelece um estado de referência fiável das tarefas nem elimina escritas externas duplicadas. Para cargas de trabalho de agentes, analise o estado durável dos fluxos de trabalho e a recuperação em conjunto com a saúde dos contentores.
As sondas observam os sinais que escolheu. Não podem comprovar a correção completa da aplicação, a segurança ou a qualidade da inferência. Os mecanismos de resposta às verificações de saúde também consomem recursos, e o estado em cache pode ficar desatualizado. O guia operacional deve explicar estes limites e como reconhecer a recuperação.
Pontos principais
- 1Escolha a ação de recuperação antes de definir o sinal de saúde: esperar, encaminhar ou reiniciar.
- 2As sondas de inicialização bloqueiam as verificações de vitalidade e prontidão até terem sucesso, mas falhas repetidas na inicialização ainda podem terminar o contentor.
- 3A prontidão controla a elegibilidade para receber tráfego, não a recuperação dos processos nem o ciclo de vida dos processos de trabalho em segundo plano.
- 4Utilize verificações de vitalidade que desencadeiam reinícios apenas quando a evidência sustenta a recuperação local por reinício.
- 5As verificações de dependências partilhadas exigem uma análise das rotas úteis e do comportamento das falhas em todas as réplicas.
- 6Valide em conjunto o estado dos Pods, a prontidão dos EndpointSlices e os resultados dos pedidos reais em pré-produção.
- 7Trate os limites de interrupções, o encerramento gracioso, o estado durável e a correção da aplicação como responsabilidades separadas.
Conclusão
Antes de alterar as sondas em produção, escolha uma carga de trabalho representativa e percorra a matriz de pré-produção. Saiba explicar por que razão uma instância deve sair da rotação de tráfego e o que um reinício repararia. Guarde o contrato de endpoints com o responsável pela recuperação e a evidência de reversão. Para serviços de IA alojados no Kubernetes, a Optijara pode ajudar a rever esse raciocínio e a evidência dos testes de falhas no contexto da arquitetura mais ampla da aplicação.
Perguntas frequentes
Qual é a diferença entre as sondas de prontidão e de vitalidade do Kubernetes?
A prontidão controla a elegibilidade para receber tráfego dos Services correspondentes; uma falha não reinicia o contentor por si só. Uma falha de vitalidade ao atingir o seu limiar desencadeia a terminação do contentor, seguindo-se a aplicação da política de reinício. Nenhuma das verificações comprova a correção completa da aplicação. Consulte https://kubernetes.io/docs/concepts/workloads/pods/probes/
Quando devo utilizar uma sonda de inicialização em vez de um atraso maior na sonda de vitalidade?
Utilize a sonda de inicialização para ter uma margem de tempo separada e limitada para a inicialização. Esta bloqueia as verificações de prontidão e vitalidade até ter sucesso; falhas repetidas na inicialização ainda podem terminar o contentor. Escolha os tempos com base na inicialização observada, não num atraso universal. Consulte https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
Uma sonda de prontidão deve verificar a base de dados?
Apenas quando a disponibilidade da base de dados determina se a instância pode servir com segurança o tráfego abrangido pelo seu contrato. Verifique o comportamento numa indisponibilidade partilhada e as rotas que continuam úteis. A perda da base de dados não deve desencadear uma falha de vitalidade, a menos que o reinício local tenha uma finalidade de recuperação testada. Consulte https://kubernetes.io/docs/concepts/workloads/pods/probes/ e https://blog.colinbreck.com/kubernetes-liveness-and-readiness-probes-looking-for-more-feet/
Por que razão uma sonda de vitalidade pode causar um ciclo de reinícios?
Sem uma sonda de inicialização a proteger a inicialização, a verificação de vitalidade pode falhar antes de o arranque terminar. A sobrecarga ou uma indisponibilidade externa também podem fazer falhar uma verificação com um âmbito mal definido sem que um reinício repare a causa. Analise os eventos, as contagens de reinícios, os registos anteriores, os tempos e os pedidos reais. CrashLoopBackOff indica uma espera progressiva entre reinícios, não uma prova de falha causada por uma sonda. Consulte https://kubernetes.io/docs/concepts/workloads/pods/probes/ e https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
As falhas de prontidão ou os reinícios por vitalidade coordenam o encerramento e a proteção contra interrupções?
Não. A prontidão não para tarefas em segundo plano nem garante que as ligações existentes se fechem. O encerramento e a propagação das alterações de encaminhamento precisam de tratamento explícito. Os PodDisruptionBudgets limitam as remoções voluntárias suportadas, não os reinícios de contentores desencadeados por sondas de vitalidade. Consulte https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ e https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
Fontes
- https://kubernetes.io/docs/concepts/workloads/pods/probes/
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
- https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- https://srcco.de/posts/kubernetes-liveness-probes-are-dangerous.html
- https://blog.colinbreck.com/kubernetes-liveness-and-readiness-probes-looking-for-more-feet/
- https://github.com/kubernetes/website/issues/16607
- https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/
Escrito por
Hamza DiazHamza Diaz é o fundador da Optijara, onde cria agentes de IA práticos, sistemas de automação e fluxos de trabalho do Copilot para empresas de serviços. Ele escreve sobre operações de IA, estratégia de agentes e implementação no mundo real para equipes que querem sistemas úteis em vez de exagero.
