Prevenzione di deviazioni dalla configurazione

Config Sync riduce il rischio di "operazioni shadow" tramite la riparazione automatica automatica, la risincronizzazione periodica e la prevenzione facoltativa delle deviazioni. Quando Config Sync rileva deviazioni tra il cluster e la fonte attendibile, può essere consentito e ripristinato rapidamente o rifiutato completamente.

La riparazione automatica monitora le risorse gestite, rileva le deviazioni dalla fonte della verità e annullale. La riparazione automatica è sempre abilitata.

La nuova sincronizzazione periodica viene sincronizzata automaticamente un'ora dopo l'ultima sincronizzazione riuscita, anche se non sono state apportate modifiche alla fonte dei dati. La risincronizzazione periodica è sempre attiva.

Sebbene la riparazione automatica e le ripetizioni periodiche aiutino a risolvere le deviazioni, la funzionalità di prevenzione delle deviazioni intercetta le richieste di modifica degli oggetti gestiti e convalida se la modifica deve essere consentita. Se la modifica non corrisponde alla fonte attendibile, viene rifiutata. La prevenzione delle deviazioni è disattivata per impostazione predefinita. Se abilitata, la prevenzione delle deviazioni protegge gli oggetti RootSync per impostazione predefinita e può anche essere configurata per proteggere gli oggetti RepoSync.

Per utilizzare la prevenzione delle deviazioni, devi abilitare le API RootSync e RepoSync.

Attiva la prevenzione delle deviazioni

  1. Imposta il campo preventDrift nel file di configurazione su true e applica il file di configurazione:

    gcloud

    Abilita la prevenzione delle deviazioni mediante gcloud CLI se hai installato Config Sync utilizzando la console Google Cloud o gcloud CLI. Assicurati di aggiornare gcloud CLI alla versione più recente. Imposta il campo spec.configSync.preventDrift del file gcloud config su true, quindi applica il file gcloud config.

    kubectl

    Abilita la prevenzione delle deviazioni utilizzando kubectl se hai installato manualmente Config Sync utilizzando kubectl. Imposta il campo spec.preventDrift dell'oggetto ConfigManagement su true, quindi applica l'oggetto ConfigManagement.

  2. Attendi finché l'oggetto ValidateWebhookConfiguration di Config Sync non viene creato dall'operatore ConfigManagement:

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

    Dovresti vedere un output simile al seguente esempio:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. Esegui il commit di una nuova modifica all'origine attendibile da sincronizzare in modo che il deployment root-reconciler possa aggiungere webhook nell'oggetto Config Sync ValidatingWebhookConfiguration. In alternativa, elimina il deployment root-reconcilier per attivare una riconciliazione. Il nuovo deployment root-reconciler aggiornerà l'oggetto Config Sync ValidatingWebhookConfiguration.

  4. Attendi finché il server webhook non è pronto. Il log di deployment del webhook di ammissione di Config Sync deve includere serving webhook server. Questa operazione può richiedere diversi minuti.

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

    Dovresti vedere un output simile al seguente esempio:

    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
    

Disattiva la prevenzione delle deviazioni

gcloud

Disabilita la prevenzione delle deviazioni utilizzando gcloud CLI se hai installato Config Sync utilizzando la console Google Cloud o gcloud CLI. Assicurati di aggiornare gcloud CLI alla versione più recente. Imposta il campo spec.configSync.preventDrift del file gcloud config su false o rimuovi il campo, quindi applica il file gcloud config.

kubectl

Disattiva la prevenzione delle deviazioni utilizzando kubectl se hai installato manualmente Config Sync con kubectl. Imposta il campo spec.preventDrift dell'oggetto ConfigManagement su false oppure rimuovi il campo e applica l'oggetto ConfigManagement.

Vengono eliminate tutte le risorse webhook di ammissione Config Sync. Poiché l'oggetto ValidatingWebhookConfiguration di Config Sync non esiste più, i riconciliatori di Config Sync non generano più configurazioni webhook per le risorse gestite.

Abilita il webhook di ammissione nelle origini con ambito dello spazio dei nomi

Le origini attendibili basate sullo spazio dei nomi non sono completamente protette dal webhook. Il riconciliazione di Config Sync per ogni origine dello spazio dei nomi non dispone dell'autorizzazione per leggere o aggiornare gli oggetti ValidatingWebhookConfiguration a livello di cluster.

Questa mancanza di autorizzazione comporta un errore per i log dei riconciliatori degli spazi dei nomi simile all'esempio seguente:

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

Puoi ignorare questo errore se non vuoi utilizzare la protezione webhook per la tua origine dati basata sullo spazio dei nomi. Tuttavia, se vuoi utilizzare il webhook, concedi l'autorizzazione al riconciliazione per ogni origine attendibile basata sullo spazio dei nomi dopo aver configurato la sincronizzazione da più fonti attendibili. Potresti non dover eseguire questi passaggi se esiste già un RoleBinding per ns-reconciler-NAMESPACE con le autorizzazioni ClusterRole cluster-admin.

  1. Nella fonte attendibile principale, dichiara una nuova configurazione ClusterRole che concede l'autorizzazione al webhook di ammissione Config Sync. Questo ClusterRole deve essere definito solo una volta per cluster:

    # ROOT_SOURCE/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. Per ogni origine con ambito dello spazio dei nomi in cui deve essere concessa l'autorizzazione webhook di ammissione, dichiara una configurazione ClusterRoleBinding per concedere l'accesso al webhook di ammissione:

    # ROOT_SOURCE/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
    

    Sostituisci NAMESPACE con lo spazio dei nomi in cui hai creato l'origine con ambito dello spazio dei nomi.

  3. Esegui il commit delle modifiche nella fonte attendibile principale, ad esempio in caso di sincronizzazione da un repository Git:

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. Per verificare, utilizza kubectl get per assicurarti che siano stati creati i ruoli ClusterRole e ClusterRoleBinding:

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

Disattiva la prevenzione delle deviazioni per le risorse abbandonate

Quando elimini un oggetto RootSync o RepoSync, per impostazione predefinita Config Sync non modifica le risorse gestite in precedenza dall'oggetto RootSync o RepoSync. Ciò può lasciare diversi etichette e annotazioni utilizzate da Config Sync per monitorare questi oggetti delle risorse. Se la protezione dalle deviazioni è abilitata, ciò può causare il rifiuto di eventuali modifiche alle risorse gestite in precedenza.

Se non hai utilizzato la propagazione dell'eliminazione, gli oggetti delle risorse lasciati invariati potrebbero comunque conservare le etichette e le annotazioni aggiunte da Config Sync.

Se vuoi conservare queste risorse gestite, annulla la gestione di queste risorse prima di eliminare gli oggetti RootSync o RepoSync impostando l'annotazione configmanagement.gke.io/managed su disabled per ogni risorsa gestita dichiarata nella fonte di riferimento. Questo indica a Config Sync di rimuovere etichette e annotazioni dalle risorse gestite, senza eliminare queste risorse. Al termine della sincronizzazione, puoi rimuovere l'oggetto RootSync o RepoSync.

Se vuoi eliminare queste risorse gestite, hai due opzioni:

  • Elimina le risorse gestite dalla fonte attendibile. Quindi, Config Sync eliminerà gli oggetti gestiti dal cluster. Al termine della sincronizzazione, puoi rimuovere l'oggetto RootSync o RepoSync.
  • Abilita la propagazione dell'eliminazione nell'oggetto RootSync o RepoSync prima di eliminarlo. Quindi, Config Sync eliminerà gli oggetti gestiti dal cluster.

Se l'oggetto RootSync o RepoSync viene eliminato prima di annullare la gestione o eliminare le relative risorse gestite, puoi ricreare l'oggetto RootSync o RepoSync in modo che adotti sul cluster le risorse che corrispondono alla fonte attendibile. Successivamente, puoi annullare la gestione delle risorse o eliminarle, attendere la sincronizzazione delle modifiche ed eliminare di nuovo l'oggetto RootSync o RepoSync.

Passaggi successivi