Prevenzione di deviazioni dalla configurazione

Config Sync riduce il rischio di "operazioni in ombra" tramite l'auto-riparazione automatica, la nuova sincronizzazione periodica e la prevenzione della deriva facoltativa. Quando Config Sync rileva un allontanamento tra il cluster e la fonte attendibile, può essere consentito e annullato rapidamente o rifiutato completamente.

La riparazione automatica controlla le risorse gestite, rileva la deviazione dall'origine della verità e la ripristina. La riparazione automatica è sempre attivata.

La sincronizzazione periodica viene eseguita automaticamente un'ora dopo l'ultima sincronizzazione riuscita, anche se non sono state apportate modifiche all'origine attendibile. La risincronizzazione periodica è sempre attivata.

Sebbene la correzione automatica e le ri-sincronizzazioni periodiche contribuiscano a correggere lo scostamento, la prevenzione dello scostamento intercetta le richieste di modifica degli oggetti gestiti e convalida se la modifica deve essere consentita. Se la modifica non corrisponde all'origine della verità, viene rifiutata. La prevenzione dello slittamento è disattivata per impostazione predefinita. Se abilitata, la prevenzione della deriva protegge gli oggetti RootSync per impostazione predefinita e può essere configurata anche per proteggere gli oggetti RepoSync.

Per utilizzare la prevenzione dello slittamento, devi attivare le API RootSync e RepoSync.

Attiva la prevenzione della deriva

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

    gcloud

    Attiva la prevenzione dello scostamento utilizzando l'interfaccia a riga di comando gcloud CLI se hai installato Config Sync utilizzando la console Google Cloud o l'interfaccia a riga di comando gcloud CLI. Assicurati di aggiornare la CLI gcloud alla versione più recente. Imposta il campo spec.configSync.preventDrift del file di configurazione gcloud su true, quindi applica il file di configurazione gcloud.

    kubectl (1.19.2 o versioni precedenti)

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

  2. Attendi che l'oggetto ValidateWebhookConfiguration di Config Sync venga 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 alla fonte attendibile da sincronizzare in modo che il deploymentroot-reconciler possa aggiungere webhook all'oggetto Config Sync ValidatingWebhookConfiguration. Un'alternativa è eliminare il deploymentroot-reconcilier per attivare una riconciliazione. Il nuovo deployment root-reconciler aggiornerebbe l'oggetto ValidatingWebhookConfiguration di Config Sync.

  4. Attendi che il server webhook sia pronto. Il log di deployment del webhook di ammissione Config Sync deve includere serving webhook server. L'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
    

Disattivare la prevenzione delle deviazioni

gcloud

Disattiva la prevenzione dello scostamento utilizzando l'interfaccia a riga di comando gcloud CLI se hai installato Config Sync utilizzando la console Google Cloud o gcloud CLI. Assicurati di aggiornare la CLI gcloud alla versione più recente. Imposta il campo spec.configSync.preventDrift del file di configurazione gcloud su false o rimuovilo, quindi applica il file di configurazione gcloud.

kubectl (1.19.2 o versioni precedenti)

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

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

Attivare il webhook di ammissione nelle origini basate sullo spazio dei nomi

Le fonti attendibili basate sullo spazio dei nomi non sono completamente protette dall'webhook. Il riconciliatore 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 genera un errore per i log dei riconciliatori dello spazio 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 verità assoluta basata sullo spazio dei nomi. Tuttavia, se vuoi utilizzare il webhook, concedi all'agente di riconciliazione l'autorizzazione per ogni origine di riferimento basata sullo spazio dei nomi dopo aver configurato la sincronizzazione da più di un'origine di riferimento. Potresti non dover eseguire questi passaggi se esiste già un RoleBinding per ns-reconciler-NAMESPACE con autorizzazioni ClusterRole cluster-admin.

  1. Nella fonte attendibile principale, dichiara una nuova configurazione ClusterRole che concede l'autorizzazione all'webhook di ammissione di 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 basata sullo spazio dei nomi in cui è necessario concedere l'autorizzazione per il 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 basata sullo spazio dei nomi.

  3. Esegui il commit delle modifiche alla fonte di riferimento principale, ad esempio se esegui la 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 ClusterRole e ClusterRoleBinding siano stati creati:

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

Disattivare la prevenzione dello scostamento per le risorse abbandonate

Quando elimini un oggetto RootSync o RepoSync, per impostazione predefinita Config Sync non modifica le risorse gestite in precedenza da quell'oggetto RootSync o RepoSync. Ciò può lasciare diverse etichette e annotazioni che Config Sync utilizza per monitorare questi oggetti della risorsa. Se la protezione antideviazione è attivata, le modifiche apportate alle risorse gestite in precedenza potrebbero essere rifiutate.

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

Se vuoi conservare queste risorse gestite, annulla la gestione prima di eliminare gli oggetti RootSync o RepoSync impostando l'annotazione configmanagement.gke.io/managed su disabled su ogni risorsa gestita dichiarata nella verità. In questo modo, Config Sync rimuoverà le proprie etichette e annotazioni dalle risorse gestite, senza eliminarle. 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. Config Sync eliminerà gli oggetti gestiti dal cluster. Al termine della sincronizzazione, puoi rimuovere l'oggetto RootSync o RepoSync.
  • Attiva la propagazione dell'eliminazione sull'oggetto RootSync o RepoSync prima di eliminarlo. Successivamente, Config Sync eliminerà gli oggetti gestiti dal cluster.

Se l'oggetto RootSync o RepoSync viene eliminato prima di annullare la gestione o eliminare le risorse gestite, puoi ricreare l'oggetto RootSync o RepoSync, che adotterà le risorse del cluster corrispondenti all'origine attendibile. Dopodiché puoi gestire o eliminare le risorse, attendere la sincronizzazione delle modifiche ed eliminare di nuovo l'oggetto RootSync o RepoSync.

Passaggi successivi