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).
Perché la prevenzione della deriva non è consigliata
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:
Aggiorna il manifest di specifica dell'applicazione per impostare il campo
spec.configSync.preventDriftsutrue:applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: trueApplica il manifest aggiornato:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDSostituisci quanto segue:
MEMBERSHIP_NAME: il nome dell'appartenenza al parco risorse che hai scelto quando hai registrato il cluster. Recupera il nome con il comandogcloud container fleet memberships list.MANIFEST_NAME: il nome del file manifest delle specifiche di applicazione, di solitoapply-spec.yaml.PROJECT_ID: il tuo ID progetto.
Attendi la creazione dell'oggetto
ValidateWebhookConfigurationdi Config Sync da parte dell'operatore ConfigManagement:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.ioDovresti vedere un output simile al seguente esempio:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15sEsegui il commit di una nuova modifica all'origine attendibile da sincronizzare in modo che il deployment
root-reconcilerpossa aggiungere webhook all'oggetto ValidatingWebhookConfiguration di Config Sync. In alternativa, puoi eliminare l'root-reconcilierDeployment per attivare una riconciliazione. Il nuovo deploymentroot-reconcileraggiornerebbe l'oggetto ValidatingWebhookConfiguration di Config Sync.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:
Aggiorna il manifest di specifica dell'applicazione per impostare il campo
spec.configSync.preventDriftsufalse:applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: falseApplica il manifest aggiornato:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDSostituisci quanto segue:
MEMBERSHIP_NAME: il nome dell'appartenenza al parco risorse che hai scelto quando hai registrato il cluster. Recupera il nome con il comandogcloud container fleet memberships list.MANIFEST_NAME: il nome del file manifest delle specifiche di applicazione, di solitoapply-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.
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"]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.ioSostituisci
NAMESPACEcon lo spazio dei nomi in cui hai creato l'origine con ambito dello spazio dei nomi.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 pushPer verificare, utilizza
kubectl getper assicurarti che siano stati creati ClusterRole e ClusterRoleBinding:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
Passaggi successivi
- Scopri come risolvere i problemi relativi al webhook.