Questa pagina spiega come risolvere i problemi relativi ai conflitti tra controller. Questi conflitti consumano una grande quantità di risorse e possono peggiorare il rendimento. I conflitti tra controller sono noti anche come contesa di risorse.
Config Sync monitora gli oggetti che applica al cluster e ripristina le modifiche apportate ai valori dichiarati nella fonte attendibile. Se queste modifiche vengono apportate da un altro controller, la risorsa potrebbe passare da uno stato all'altro in base alle preferenze dei controller in competizione. Un sintomo di questo comportamento è l'aumento rapido dei campi metadata.generation e metadata.resourceVersion. Per questo motivo, se un oggetto gestito viene aggiornato più di cinque volte al minuto, Config Sync rileva il conflitto, registra la deviazione e segnala l'errore nello stato dell'oggetto RootSync o RepoSync.
Config Sync ha una logica speciale per rilevare i conflitti tra più oggetti RootSync e RepoSync. Per gli oggetti RepoSync, se il riconciliatore rileva che l'oggetto è già gestito da un altro riconciliatore, gli aggiornamenti successivi vengono ignorati.
Per gli oggetti RootSync, il riconciliatore tenta di adottare qualsiasi oggetto configurato per la gestione, a meno che non sia gestito da un altro oggetto RootSync. In questo modo, i riconciliatori di Config Sync non entrano in conflitto tra loro e segnalano gli errori nello stato di tutti gli oggetti RootSync e RepoSync coinvolti.
Identificare i conflitti tra controller
Puoi esaminare gli errori di conflitto utilizzando il
nomos status comando o
controllando il campo dello stato nell'oggetto RootSync o RepoSync.
Se non hai installato lo strumento a riga di comando nomos, puoi esaminare i log del riconciliatore RootSync eseguendo il seguente comando:
kubectl logs -n config-management-system \
--selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
--container reconciler
Per filtrare riconciliatori RepoSync specifici, esegui il seguente comando:
kubectl logs -n config-management-system \
--selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
--container reconciler
Sostituisci NAMESPACE con lo spazio dei nomi in cui hai creato la fonte attendibile con ambito dello spazio dei nomi.
Se nei risultati viene visualizzato KNV2005, significa che si è verificato un conflitto tra controller.
Il seguente messaggio di errore è un esempio del tipo di errore che potresti visualizzare nei log:
KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.
Esaminare i conflitti tra controller
Per trovare ulteriori informazioni su un conflitto tra controller, monitora gli aggiornamenti del file YAML della risorsa eseguendo il seguente comando:
kubectl get RESOURCE OBJECT_NAME \
--namespace NAMESPACE \
--watch -o yaml
Sostituisci quanto segue:
RESOURCE: il tipo di risorsa in conflitto.OBJECT_NAME: il nome dell'oggetto in conflitto.NAMESPACE: lo spazio dei nomi in cui si trova la risorsa in conflitto.
I risultati dei log specificano la risorsa, il nome dell'oggetto e lo spazio dei nomi da aggiungere.
Questo comando restituisce uno stream dello stato della risorsa dopo l'applicazione degli aggiornamenti al server API. Utilizza uno strumento di confronto dei file per confrontare l'output.
Risolvere i conflitti tra controller
Esistono diversi modi per risolvere i conflitti tra controller. Scegli l'opzione più adatta alla tua configurazione di Config Sync:
- Aggiorna il manifest della risorsa nella fonte in modo che corrisponda al valore desiderato dall'altro controller.
- Rimuovi il campo in questione dalla fonte per consentire all'altro controller di gestirlo.
- Disattiva o disinstalla l'altro controller.
- Rimuovi la risorsa dalla fonte e gestiscila manualmente o con un controller personalizzato che tollera modifiche specifiche o la cogestione.
- Se sei il proprietario del controller che causa la contesa di risorse e il campo modificato non è nella fonte attendibile, aggiorna il controller in modo che esegua l'applicazione di patch anziché l'aggiornamento. In questo modo, la modifica verrà consentita da Config Sync e non verrà ripristinata.
Esistono anche alcune risorse che dovrebbero appartenere ad altri controller (ad esempio, alcuni operatori installano o gestiscono i CRD). Questi altri controller rimuovono automaticamente tutti i metadati specifici di Config Sync. Se un altro componente del cluster Kubernetes rimuove i metadati di Config Sync, interrompi la gestione della risorsa con Config Sync. Per informazioni su come eseguire questa operazione, consulta Interrompere la gestione di un oggetto gestito.
In alternativa, se non vuoi che Config Sync ripristini le modifiche agli oggetti gestiti nel cluster, puoi aggiungere l'annotazione client.lifecycle.config.k8s.io/mutation: ignore all'oggetto in cui vuoi che Config Sync ignori le mutazioni. Per informazioni su come eseguire questa operazione, consulta Ignorare le mutazioni degli oggetti.
Risolvere i conflitti tra controller per gli spazi dei nomi impliciti
Per impostazione predefinita, Config Sync crea uno spazio dei nomi implicito quando un oggetto con spazio dei nomi viene gestito da RootSync, ma lo spazio dei nomi stesso non esiste ancora. Se un altro controller tenta di acquisire la proprietà dello spazio dei nomi, potrebbe verificarsi un conflitto tra controller e Config Sync. Puoi verificare se uno spazio dei nomi è stato creato implicitamente se non è mai stato dichiarato nel repository radice e lo spazio dei nomi live ha l'annotazione di impedimento dell'eliminazione.
Esistono diversi modi per risolvere i conflitti relativi a uno spazio dei nomi implicito. Scegli l'opzione più adatta alla tua configurazione di Config Sync:
- Utilizza la strategia dello spazio dei nomi esplicito sull'oggetto RootSync. Questa strategia risolve il conflitto tra controller e impedisce a Config Sync di creare altri spazi dei nomi impliciti.
- Aggiungi lo spazio dei nomi al repository radice con l'annotazione di gestione disattivata. Questa annotazione indica a Config Sync di interrompere la gestione dello spazio dei nomi, ma consente comunque a Config Sync di creare spazi dei nomi impliciti.
Passaggi successivi
- Se continui a riscontrare problemi, verifica se il tuo problema è un problema noto.
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta Richiedere assistenza per ulteriore assistenza, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti Cloud.
- Ricevere assistenza dalla community ponendo domande su Stack Overflow. Se utilizzi kpt o Kustomize, utilizza il tag
kptokustomizeper cercare problemi simili. - Aprire bug o richieste di funzionalità utilizzando il tracker di problemi pubblico su GitHub.