Evitar desvios na configuração

O Config Sync reduz o risco de "operações de sombra" com a detecção de deslocamento. Quando alterações não verificadas são enviadas para clusters ativos, o Config Sync detecta e corrige qualquer deslocamento da fonte de verdade no Git. Além disso, o Config Sync fornece um webhook de admissão que rejeita alterações conflitantes de serem enviadas a clusters ativos. Esse webhook oferece um melhor feedback quando são feitas alterações manuais, em vez de permitir e corrigir a mudança silenciosamente. Além disso, esse webhook de admissão impede a modificação manual dos metadados e das anotações do Config Sync, o que causaria erros na configuração dos webhooks ou dos reconciliadores de admissão. Por padrão, o webhook protege apenas o repositório raiz. No entanto, é possível ativar o webhook de admissão em repositórios de namespace.

Quando o webhook de admissão do Config Sync estiver desativado, o Config Sync não rejeitará deslocamentos de configuração e alterações nos metadados do Config Sync, mas ainda detectará e corrigirá esses deslocamentos.

Para usar esse recurso, você precisa ativar as APIs RootSync e RepoSync.

Ativar a prevenção de deslocamento

Conclua as etapas a seguir para ativar a prevenção de deslocamento:

  1. Defina o campo preventDrift no arquivo de configuração como true e aplique o arquivo de configuração.

    gcloud

    Ative a prevenção de deslocamento usando a CLI gcloud se você tiver instalado o Config Sync usando o Console do Google Cloud ou a CLI gcloud. Atualize a CLI gcloud para a versão mais recente. Defina o campo spec.configSync.preventDrift do arquivo de configuração da gcloud como true e aplique o arquivo de configuração da gcloud.

    kubectl

    Ative a prevenção de deslocamento usando kubectl se tiver instalado o Config Sync manualmente usando kubectl. Defina o campo spec.preventDrift do objeto ConfigManagement como true e aplique o objeto ConfigManagement.

  2. Aguarde até que o objeto ValidateWebhookConfiguration do Config Sync seja criado pelo Config Management Operator.

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    O resultado será semelhante a:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. Confirme uma nova alteração no repositório do Git para ser sincronizada para que a implantação root-reconciler possa adicionar webhooks ao objeto ValidatingWebhookConfiguration do Config Sync. Uma alternativa é excluir a Implantação root-reconcilier para acionar uma reconciliação. A nova Implantação root-reconciler atualizará o objeto ValidatingWebhookConfiguration do Config Sync.

  4. Aguarde até que o servidor do webhook esteja pronto. O registro de implantação do webhook de admissão do Config Sync precisa incluir serving webhook server. Isso pode levar alguns minutos.

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    O resultado será semelhante a:

    I1201 18:05:41.805531       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    I1201 18:07:04.626199       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    

Desativar a prevenção de deslocamento

gcloud

Desative a prevenção de desvio usando a CLI gcloud se você tiver instalado o Config Sync usando o Console do Google Cloud ou a CLI gcloud. Atualize a CLI gcloud para a versão mais recente. Defina o campo spec.configSync.preventDrift do arquivo de configuração da gcloud como false ou remova o campo e, em seguida, aplique o arquivo de configuração da gcloud.

kubectl

Desative a prevenção de desvio usando kubectl se tiver instalado o Config Sync manualmente usando kubectl. Defina o campo spec.preventDrift do objeto ConfigManagement como false ou remova o campo e, em seguida, aplique o objeto ConfigManagement.

Isso excluirá todos os recursos de webhook de admissão do Config Sync. Como o objeto ValidatingWebhookConfiguration do Config Syncnão existe mais, os reconciliadores do Config Sync não geram mais as configurações do webhook para recursos gerenciados.

Ativar o webhook de admissão em repositórios de namespace

Os repositórios de namespace não são totalmente protegidos pelo webhook. O reconciliador do Config Sync para cada repositório de namespace não tem permissão para ler ou atualizar os objetos ValidatingWebhookConfiguration no nível do cluster.

Essa falta de permissão resulta em um erro nos registros de reconciliadores do namespace, semelhante ao exemplo a seguir:

Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope

Esse erro pode ser ignorado se você não quiser usar a proteção de webhook para seu repositório de namespace. No entanto, se você quiser usar o webhook, conceda a seguinte permissão ao reconciliaçãor para cada repositório de namespace depois de configurar a sincronização em repositórios de namespace:

  1. No repositório raiz, declare uma nova configuração do ClusterRole que conceda permissão ao webhook de admissão do Config Sync. Este ClusterRole só precisa ser definido uma vez por cluster:

    # ROOT_REPO/cluster-roles/webhook-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: admission-webhook-role
    rules:
    - apiGroups: ["admissionregistration.k8s.io"]
      resources: ["validatingwebhookconfigurations"]
      resourceNames: ["admission-webhook.configsync.gke.io"]
      verbs: ["get", "update"]
    
  2. Para cada repositório de namespace em que a permissão do webhook de admissão precise ser concedida, declare uma configuração ClusterRoleBinding para conceder acesso ao webhook de admissão:

    # ROOT_REPO/NAMESPACE/sync-webhook-rolebinding.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-webhook
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: admission-webhook-role
      apiGroup: rbac.authorization.k8s.io
    

    Substitua NAMESPACE pelo namespace em que você criou seu repositório de namespace.

  3. Confirme antes as mudanças no repositório:

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. Para verificar, use kubectl get para garantir que o ClusterRole e o ClusterRoleBinding foram criados:

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook