Prevenzione di deviazioni dalla configurazione

Config Sync offre due modi per gestire la deriva:

  • Utilizza la funzionalità di autoriparazione integrata di Config Sync (consigliata, non è necessaria alcuna configurazione): Config Sync rileva e ripristina automaticamente la deriva. Non puoi disattivare l'autoriparazione di Config Sync. L'autoriparazione ha un impatto minimo sulle prestazioni.
  • Attiva la funzionalità di prevenzione della deriva (questa pagina): la prevenzione della deriva utilizza un webhook di ammissione per bloccare le modifiche in conflitto. Questa funzionalità può causare un elevato utilizzo della memoria ed errori di esaurimento della memoria, soprattutto nei cluster con molte CustomResourceDefinitions (CRD).

L'webhook di controllo degli accessi richiede a Config Sync di caricare lo schema OpenAPI di Kubernetes per convalidare le richieste. Nei cluster con molte risorse o CRD, questa elaborazione dello schema può superare i limiti di memoria, causando errori dei componenti. Per la maggior parte dei casi d'uso, la correzione automatica integrata di Config Sync fornisce la protezione dalla deriva senza i rischi per la stabilità del webhook.

Se abilitata, la prevenzione della deriva protegge gli oggetti RootSync per impostazione predefinita. Puoi configurare la funzionalità per proteggere gli oggetti RepoSync. Per utilizzare la prevenzione della deriva, devi abilitare le API RootSync e RepoSync.

Prima di iniziare

Se hai già installato Google Cloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update.

Abilita la prevenzione della deriva

Puoi attivare la prevenzione della deriva utilizzando gcloud CLI. Non puoi attivare la prevenzione della deriva nella console Google Cloud .

Per attivare la prevenzione della deriva, completa i seguenti passaggi:

  1. Aggiorna il manifest di specifica dell'applicazione per impostare il campo spec.configSync.preventDrift su true:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        ... existing content ...
        preventDrift: true
    
  2. Applica il manifest aggiornato:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Sostituisci quanto segue:

    • MEMBERSHIP_NAME: il nome dell'appartenenza al parco risorse che hai scelto quando hai registrato il cluster. Recupera il nome con il comando gcloud container fleet memberships list.
    • MANIFEST_NAME: il nome del file manifest delle specifiche di applicazione, di solito apply-spec.yaml.
    • PROJECT_ID: il tuo ID progetto.
  3. Attendi la creazione dell'oggetto ValidateWebhookConfiguration di Config Sync da parte dell'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
    
  4. Esegui il commit di una nuova modifica all'origine attendibile da sincronizzare in modo che il deployment root-reconciler possa aggiungere webhook all'oggetto ValidatingWebhookConfiguration di Config Sync. In alternativa, puoi eliminare l'root-reconcilier Deployment per attivare una riconciliazione. Il nuovo deployment root-reconciler aggiornerebbe l'oggetto ValidatingWebhookConfiguration di Config Sync.

  5. Attendi che il server webhook sia pronto. Il log di deployment del webhook di ammissione di 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 della deriva

Quando disattivi la prevenzione della deriva, Config Sync elimina tutte le risorse webhook di ammissione di Config Sync. Poiché l'oggetto Config Sync ValidatingWebhookConfiguration non esiste più, i riconciliatori Config Sync non generano più le configurazioni webhook per le risorse gestite.

Per disattivare la prevenzione della deriva, completa i seguenti passaggi:

  1. Aggiorna il manifest di specifica dell'applicazione per impostare il campo spec.configSync.preventDrift su false:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: false
        ... existing content ...
        preventDrift: false
    
  2. Applica il manifest aggiornato:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Sostituisci quanto segue:

    • MEMBERSHIP_NAME: il nome dell'appartenenza al parco risorse che hai scelto quando hai registrato il cluster. Recupera il nome con il comando gcloud container fleet memberships list.
    • MANIFEST_NAME: il nome del file manifest delle specifiche di applicazione, di solito apply-spec.yaml.
    • PROJECT_ID: il tuo ID progetto.

Abilita il webhook di controllo degli accessi nelle origini con ambito spazio dei nomi

Le origini attendibili con ambito a livello di spazio dei nomi non sono completamente protette dal 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 nei log dei riconciliatori dello spazio dei nomi simile al seguente esempio:

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 attendibile con ambito spazio dei nomi. Tuttavia, se vuoi utilizzare il webhook, concedi l'autorizzazione al riconciliatore per ogni origine attendibile con ambito spazio dei nomi dopo aver configurato la sincronizzazione da più di un'origine attendibile. Potresti non dover eseguire questi passaggi se esiste già un RoleBinding per ns-reconciler-NAMESPACE con le autorizzazioni di ClusterRole cluster-admin.

  1. Nella Single Source of Truth radice, dichiara una nuova configurazione ClusterRole che conceda l'autorizzazione al webhook di ammissione di Config Sync. Questo ClusterRole deve essere definito una sola 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 spazio dei nomi in cui è necessario concedere l'autorizzazione del webhook di controllo dell'ammissione, dichiara una configurazione ClusterRoleBinding per concedere l'accesso al webhook di controllo dell'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 nell'origine di riferimento principale, ad esempio se la sincronizzazione avviene 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 ClusterRole e ClusterRoleBinding:

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

Passaggi successivi