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. Para mais informações, consulte Gerenciamento declarativo de objetos do Kubernetes usando arquivos de configuração.

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

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 alterações em um cluster do GKE normalmente são executadas em segundos. No entanto, o tempo de criação de recursos do Google Cloud pode variar com base no tipo de recurso. Por exemplo, uma única PubSubTopic leva segundos para ser criada. Os recursos do Google Cloud não alcançam a consistência até que sejam 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 de 10 minutos por padrão. Quando há um erro na reconciliação, o Config Connector tenta novamente com espera exponencial em que a espera máxima é de dois minutos. É possível visualizar 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 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 deixará de iniciar reconciliações para o recurso quando ele atingir o status UpToDate.

Por exemplo, se você quiser que o Config Connector reconcilie um recurso com menos frequência para evitar atingir os problemas de cota da API do Google Cloud, 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 os deslocamentos antes disso, defina a anotação com um valor pequeno.

É possível anotar todos os recursos de um tipo específico que compartilha 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.

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

Algumas APIs expõem campos não legíveis, mas mutáveis (por exemplo, a senha de um usuário do SQL). Devido à incapacidade de 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 reconciliadas sem serem excluídos e recriados em seguida.

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]