Melhores Práticas para Operadores Kubernetes
Reconciliadores idempotentes, design orientado a nível e checklist de produção para operadores.
Busque em todas as páginas da documentação
Reconciliadores idempotentes, design orientado a nível e checklist de produção para operadores.
Estas regras transformam arestas afiadas recorrentes de operadores em hábitos de revisão, portões de CI e escolhas de empacotamento que mantêm os controladores seguros em escala.
envtest e operator-sdk bundle validate em CI em cada tag de release.client.IgnoreNotFound em objetos primários excluídos. Evite métricas de erro para corridas entre a exclusão e a reconciliação final.Status().Update para condições e prontidão. Nunca aplique patch em campos de status através de Update genérico no objeto completo.RequeueAfter para espera esperada. Reserve erros retornados para falhas genuínas que valem a pena alertar.Owns sem cola baseada apenas em rótulos.failurePolicy: Fail para validação crítica de segurança. Combine com pods de webhook HA e monitoramento de certificado.config/crd/bases sem sincronizar os tipos Go.kubectl get. Engenheiros de suporte devem ver a fase e a prontidão sem dumps YAML.Terminating sinalizam lógica de limpeza ausente.Owns dos filhos impulsionar as atualizações de prontidão.envtest ocultam falhas de decodificação de produção.envtest ou fake client. Bugs de exclusão são incidentes de produção.workqueue_retries_total precedem páginas de incidentes.ctrl.SetupSignalHandler. Libere leases prontamente em upgrades contínuos.AllNamespaces sem RBAC de cluster bloqueia a revisão de segurança.OwnNamespace em vez de listar Secrets em todo o cluster para plataformas SaaS.--leader-elect e limites de recursos no Deployment CSV. HA sem eleição duplica efeitos colaterais externos.operator-sdk bundle validate captura descritores de CRD possuídos ausentes.replaces e skips nos metadados CSV.Reconciliação idempotente, referências de proprietário em filhos, finalizadores para recursos externos, eleição de líder com 2 réplicas e cobertura de envtest para caminhos de criação/exclusão.
Use as seções A e D em cada alteração de controlador.
Reserve as seções OLM e multi-tenant para PRs de release e empacotamento.
A reconciliação orientada a nível lê a especificação atual e o estado do cluster a cada passagem.
Manipuladores de eventos que apenas anexam efeitos colaterais perdem desvios e resincronização periódica.
Quando a validação abrange múltiplos campos de spec ou depende de contexto apenas de admissão.
Limites simples de mínimo/máximo pertencem primeiro aos marcadores CRD.
Múltiplos reconciliadores ativos sem eleição de líder mutando o mesmo sistema externo, ou finalizadores nunca limpos após falha na limpeza.
Execute make test, verificação de diff de make manifests, validação de bundle e golangci-lint nos pacotes do controlador.
Bloqueie merges quando os marcadores RBAC mudarem sem YAML regenerado.
Apenas quando os clientes precisam explicitamente de instâncias de CR em todo o cluster e aceitam RBAC com escopo de cluster.
Caso contrário, OwnNamespace ou SingleNamespace reduzem o raio de explosão.
Métricas de workqueue do controller-runtime integradas mais um ou dois contadores de domínio (resultado da reconciliação, latência da API externa) por controlador.
Estados Ready, progressing, degraded e terminating com convenções de condição meta do Kubernetes e códigos reason claros.
Quando CRDs não relacionados têm domínios de falha independentes ou necessidades de RBAC diferentes.
Um único Manager é bom para um domínio de produto com caches compartilhados.
Versões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea,
go fix modernizers- verifique o patch na compilação), chi (latest - verifique na compilação), gin (latest - verifique na compilação), echo (latest - verifique na compilação), google.golang.org/grpc (latest - verifique na compilação), sigs.k8s.io/controller-runtime (latest - verifique na compilação), kubebuilder (latest - verifique na compilação), tinygo (latest - verifique os alvos de placa na compilação), wazero (latest - verifique na compilação) e golangci-lint (latest - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026