Estratégia de reconciliação

Com a configuração declarativa, você define o estado pretendido do sistema. O sistema trabalha constantemente para permanecer o mais próximo possível desse estado. Consulte Gerenciamento declarativo de objetos do Kubernetes usando arquivos de configuração para mais informações.

Com o Config Connector, crie e atualize recursos em qualquer ordem, independentemente dos relacionamentos de dependência. O GKE move a configuração declarada em direção à consistência posterior com o estado desejado.

Por exemplo, se você criar um PubSubSubscription antes do PubSubTopic correspondente, o Config Connector aguardará até que o tópico seja criado antes de criar a assinatura associada.

A duração da instalação do Config Connector continua inconsistente e depende do número e dos tipos de recursos que ele gerencia. As mudanças em um cluster do GKE geralmente são executadas em segundos. No entanto, o tempo para criar recursos doGoogle Cloud pode variar de acordo com o tipo de recurso. Por exemplo, uma única PubSubTopic leva segundos para ser criada. Os recursos do Google Cloud não alcançam consistência até serem criados. Por exemplo, ao criar um SQLInstance e um SQLDatabase, o sistema fica inconsistente por um período de minutos enquanto o banco de dados é criado.

O GKE e o Config Connector reconciliam cada recurso com cada atualização ou após um período de instabilidade com uma média baseada no intervalo padrão pré-configurado. O intervalo padrão está em "Intervalo médio de reconciliação padrão do Config Connector em segundos" na página de referência de cada recurso. Para links de cada recurso, consulte a Visão geral de recursos. Quando há um erro na reconciliação, o Config Connector tenta novamente com espera exponencial, em que a espera máxima é de 2 minutos. Para recursos gerenciados por controladores diretos, é possível configurar esse máximo usando a anotação cnrm.cloud.google.com/backoff-max-delay-in-seconds. É possível ver os erros nos Eventos de um determinado recurso.

Como configurar o intervalo de reconciliação

A partir do Config Connector 1.102, é possível configurar o intervalo médio de reconciliação para recursos gerenciados pelo Config Connector com a anotação cnrm.cloud.google.com/reconcile-interval-in-seconds. O valor da anotação substitui o valor padrão de "Intervalo médio de reconciliação padrão do Config Connector em segundos" da página de referência de recursos. O valor da anotação precisa ser um número inteiro não negativo que representa o tempo em segundos. Se o valor for definido como 0, o Config Connector vai parar de iniciar reconciliações para o recurso quando ele atingir o status UpToDate. Essa anotação controla a reconciliação periódica depois que o recurso atinge o status UpToDate. A anotação não afeta os intervalos de nova tentativa quando a reconciliação falha. Para mais informações, consulte Como configurar a espera exponencial para erros de reconciliação.

Por exemplo, se você quiser que o Config Connector reconcilie um recurso com menos frequência para evitar problemas de Google Cloud cota da API, defina o valor médio do intervalo de reconciliação como 1 hora.

cnrm.cloud.google.com/reconcile-interval-in-seconds: "3600"

Se você quiser que o Config Connector reconcilie um recurso com mais frequência para corrigir desvios mais rapidamente, defina a anotação com um valor pequeno.

É possível anotar todos os recursos de um tipo específico que compartilham o mesmo tipo de versão de grupo (GVK, na sigla em inglês) com o seguinte script:

#!/bin/bash

KIND=RESOURCE_KIND
NAMESPACE=RESOURCE_NAMESPACE
ANNOTATION_KEY="cnrm.cloud.google.com/reconcile-interval-in-seconds"
ANNOTATION_VALUE=RECONCILE_INTERVAL

kubectl annotate --overwrite --all ${KIND} ${ANNOTATION_KEY}=${ANNOTATION_VALUE} -n ${NAMESPACE}
echo "Annotation added to all ${KIND} RESOURCE"

Substitua:

  • RESOURCE_KIND: o tipo de recurso que você quer anotar.
  • RESOURCE_NAMESPACE: o namespace que contém os recursos que você quer anotar.
  • RECONCILE_INTERVAL: o intervalo de reconciliação em segundos.

É possível definir o intervalo de reconciliação como 0 para desativar a correção do deslocamento de um recurso, mas isso não desativa a atuação do recurso. Se você fizer mudanças no recurso Spec, ele será reconciliado novamente.

Definir o intervalo de reconciliação como 0 é irreversível. Isso significa que mudar o valor de volta para um número diferente de zero não faz com que o Config Connector reconcilie o recurso novamente.

Se você quiser reverter o intervalo de reconciliação 0, use as seguintes opções:

  • Modifique a especificação do recurso com o valor do intervalo de reconciliação para ativar novas reconciliações.
  • Abandone o recurso definindo a anotação cnrm.cloud.google.com/deletion-policy: "abandon" e recrie o recurso com um valor de intervalo de reconciliação diferente de 0.

Como configurar a espera exponencial para erros de reconciliação

Quando um recurso não é reconciliado, o Config Connector tenta novamente usando a espera exponencial. O atraso começa em 250 milissegundos e dobra após cada tentativa com falha (por exemplo, 500 milissegundos, depois 1 segundo, depois 2 segundos), até um máximo padrão de 2 minutos.

A anotação cnrm.cloud.google.com/reconcile-interval-in-seconds controla a correção periódica do deslocamento depois que um recurso atinge o status UpToDate. No Config Connector versão 1.160.0 e mais recentes, é possível usar a anotação cnrm.cloud.google.com/backoff-max-delay-in-seconds para controlar o comportamento de nova tentativa quando a reconciliação falha. Defina a anotação como um dos seguintes valores:

  • Um número inteiro positivo ("1" ou maior): define o atraso máximo, em segundos, entre as novas tentativas. Por exemplo, "600" limita o intervalo de repetição a 10 minutos, e "3600" limita a 1 hora.
  • "0": interrompe as novas tentativas automáticas após uma reconciliação com falha. O recurso permanece em um estado de falha até que uma mudança acione a reconciliação, por exemplo, uma atualização para spec, metadata.labels, metadata.annotations, um recurso referenciado ou Secret.

Por exemplo, para limitar os intervalos de repetição em 30 minutos e reduzir o Google Cloud consumo de cota da API em recursos com falha, adicione a seguinte anotação:

metadata:
  annotations:
    cnrm.cloud.google.com/backoff-max-delay-in-seconds: "1800"

Para interromper as novas tentativas automáticas em erros de reconciliação até que você atualize o recurso, adicione a seguinte anotação:

metadata:
  annotations:
    cnrm.cloud.google.com/backoff-max-delay-in-seconds: "0"

Campos mutáveis (mas ilegíveis) são acionados somente quando há alterações

Algumas APIs expõem campos que não são legíveis, mas são mutáveis (por exemplo, a senha de um usuário do SQL). Como não é possível ver se esses campos foram modificados, os campos mutáveis, mas ilegíveis, são atualizados apenas quando o recurso personalizado é modificado.

Os recursos não são recriados ao modificar campos imutáveis

Alguns campos em um recurso são imutáveis e não podem ser reconciliados sem excluir e recriar o recurso de destino.

Nessas situações, o Config Connector emite um evento "UpdatedFailed" do Kubernetes para o recurso em vez de realizar essa recriação. Em seguida, exclua e recrie o recurso.

Evento de exemplo:

Warning  UpdateFailed  37m (x643 over 15d)    computeinstance-controller  Update call failed: the desired mutation for the following field(s) is invalid: [bootDisk.0.InitializeParams.0.Image networkInterface.0.NetworkIp]