Resolver problemas de conflitos entre controladores

Nesta página, mostramos como resolver problemas de conflitos entre controladores. Esses conflitos consomem uma grande quantidade de recursos e podem prejudicar seu desempenho. Os conflitos também são conhecidos como contenção de recursos.

O Config Sync monitora os objetos aplicados no cluster e reverte as alterações feitas nos valores declarados na fonte da verdade. Se essas alterações forem feitas por outro controlador, o recurso poderá alternar entre os estados definidos pelos controladores concorrentes. Um sintoma desse comportamento é que os campos metadata.generation e metadata.resourceVersion aumentam rapidamente. Por isso, se um objeto gerenciado for atualizado mais de cinco vezes por minuto, o Config Sync detectará o conflito, registrará o deslocamento e informará o erro no status do objeto RootSync ou RepoSync.

O Config Sync tem uma lógica especial para detectar conflitos entre vários objetos RootSync e RepoSync. Para objetos RepoSync, se o reconciliador detectar que o objeto já é gerenciado por outro reconciliador, as atualizações seguintes serão ignoradas. Para objetos RootSync, o reconciliador tenta adotar qualquer objeto que esteja configurado para gerenciamento, a menos que seja gerenciado por outro objeto RootSync. Isso impede que os reconciliadores do Config Sync entrem em conflito entre si e informa erros no status de todos os objetos RootSync e RepoSync envolvidos.

Identificar conflitos entre controladores

É possível analisar os erros de conflito usando o comando nomos status ou verificando o campo de status no objeto RootSync ou RepoSync.

Se você não tiver a ferramenta de linha de comando nomos instalada, poderá analisar os registros do reconciliador RootSync executando o seguinte comando:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
    --container reconciler

Para filtrar reconciliadores RepoSync específicos, execute o seguinte comando:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
    --container reconciler

Substitua NAMESPACE pelo namespace em que você criou a fonte da verdade do namespace.

Se você vir KNV2005 nos resultados, haverá um conflito entre controladores.

A mensagem de erro a seguir é um exemplo do tipo de erro que pode aparecer nos registros:

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

Investigar conflitos entre controladores

Para encontrar mais informações sobre conflitos entre controladores, execute o comando a seguir para ver as atualizações do arquivo YAML do recurso:

 kubectl get RESOURCE OBJECT_NAME \
     --namespace NAMESPACE \
     --watch -o yaml

Substitua:

  • RESOURCE: o tipo de recurso que está gerando o conflito.
  • OBJECT_NAME: o nome do objeto que está gerando o conflito.
  • NAMESPACE: o namespace em que reside o recurso que está gerando o conflito.

Os resultados do registro especificam o recurso, o nome do objeto e o namespace que você precisa adicionar.

Esse comando retorna um fluxo do estado do recurso depois que as atualizações são aplicadas ao servidor da API. Use uma ferramenta de comparação de arquivos para comparar a saída.

Resolver conflitos entre controladores

Há várias maneiras de resolver conflitos entre controladores. Escolha a opção que funciona melhor para sua configuração do Config Sync:

  • Atualize o manifesto do recurso na fonte para que corresponda ao valor esperado pelo outro controlador.
  • Remova o campo em questão da fonte para que o outro controlador possa gerenciá-lo.
  • Desative ou desinstale o outro controlador.
  • Remova o recurso da fonte e gerencie-o manualmente ou com um controlador personalizado que tolere alterações específicas ou gerenciamento conjunto.
  • Se você for o proprietário do controlador que está causando a contenção de recursos e o campo que está sendo alterado não estiver na fonte da verdade, realize um patch no controlador em vez de atualizá-lo. Dessa forma, a alteração será permitida pelo Config Sync e não revertida.

Há também alguns recursos que devem pertencer a outros controladores (por exemplo, alguns operadores instalam ou mantêm CRDs). Esses outros controladores removem automaticamente todos os metadados específicos do Config Sync. Se outro componente no cluster do Kubernetes remover metadados do Config Sync, pare de gerenciar o recurso com o Config Sync. Para informações sobre como fazer isso, consulte Como parar de gerenciar um objeto gerenciado.

Alternativa: se você não quiser que o Config Sync reverta as alterações em objetos gerenciados no cluster, adicione a anotação client.lifecycle.config.k8s.io/mutation: ignore ao objeto em que você quer que o Config Sync ignore as mutações. Para informações sobre como fazer isso, consulte Ignorar mutações do objeto.

A seguir