Résoudre les problèmes de conflit de manettes

Cette page vous explique comment résoudre les problèmes liés aux conflits de contrôleurs. Ces conflits consomment beaucoup de ressources et peuvent nuire à vos performances. Ils sont également appelés conflits de ressources.

Config Sync surveille les objets qu'il applique au cluster et annule les modifications apportées aux valeurs déclarées dans la source de référence. Si ces modifications sont effectuées par un autre contrôleur, la ressource peut basculer entre les états souhaités par les contrôleurs concurrents. L'un des symptômes de ce comportement est que les champs metadata.generation et metadata.resourceVersion augmentent rapidement. Par conséquent, si un objet géré est mis à jour plus de cinq fois par minute, Config Sync détecte le conflit, consigne la dérive et signale l'erreur dans l'état d'objet RootSync ou RepoSync.

Config Sync dispose d'une logique spéciale pour détecter les conflits entre plusieurs objets RootSync et RepoSync. Pour les objets RepoSync, si le rapprochement détecte que l'objet est déjà géré par un autre rapprochement, les mises à jour ultérieures sont ignorées. Pour les objets RootSync, le rapprochement tente d'adopter tout objet qu'il est configuré pour gérer, sauf s'il est géré par un autre objet RootSync. Cela empêche les rapprochements Config Sync d'être en conflit entre eux et signale les erreurs dans l'état de tous les objets RootSync et RepoSync impliqués.

Identifier les conflits de contrôleurs

Vous pouvez examiner les erreurs de conflit à l'aide de la commande nomos status ou en vérifiant le champ d'état dans l'objet RootSync ou RepoSync.

Si l'outil de ligne de commande nomos n'est pas installé, vous pouvez consulter les journaux du rapprochement RootSync en exécutant la commande suivante :

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
    --container reconciler

Pour filtrer des rapprochements RepoSync spécifiques, exécutez la commande suivante :

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
    --container reconciler

Remplacez NAMESPACE par l'espace de noms dans lequel vous avez créé votre source de référence à l'échelle de l'espace de noms.

Si KNV2005 apparaît dans les résultats, cela signifie qu'il y a un conflit de contrôleur.

Le message d'erreur suivant est un exemple du type d'erreur susceptible de s'afficher dans vos journaux :

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

Examiner les conflits de contrôleurs

Pour en savoir plus sur les conflits de contrôleur, examinez les mises à jour du fichier YAML de la ressource en exécutant la commande suivante :

 kubectl get RESOURCE OBJECT_NAME \
     --namespace NAMESPACE \
     --watch -o yaml

Remplacez les éléments suivants :

  • RESOURCE : type de ressource faisant l'objet d'un conflit.
  • OBJECT_NAME : nom de l'objet faisant l'objet d'un conflit.
  • NAMESPACE : espace de noms dans lequel se trouve la ressource en conflit.

Les résultats du journal spécifient la ressource, le nom de l'objet et l'espace de noms à ajouter.

Cette commande renvoie un flux de l'état de la ressource après l'application des mises à jour au serveur d'API. Utilisez un outil de comparaison de fichiers pour comparer le résultat.

Résoudre les conflits de contrôleurs

Il existe plusieurs façons de résoudre les conflits de contrôleurs. Choisissez l'option la plus adaptée à votre configuration Config Sync :

  • Mettez à jour le fichier manifeste de ressources dans la source pour qu'il corresponde à la valeur souhaitée par l'autre contrôleur.
  • Supprimez le champ en question de la source pour permettre à l'autre contrôleur de le gérer.
  • Désactivez ou désinstallez l'autre contrôleur.
  • Supprimez la ressource de la source et gérez-la manuellement ou à l'aide d'un contrôleur personnalisé qui tolère des modifications ou une cogestion spécifiques.
  • Si vous êtes propriétaire du contrôleur qui entraîne un conflit de ressources et que le champ modifié ne figure pas dans la source de référence, mettez à jour votre contrôleur pour appliquer des correctifs plutôt qu'une mise à jour. De cette façon, la modification sera autorisée par Config Sync et ne sera pas annulée.

Certaines ressources doivent également appartenir à d'autres contrôleurs (par exemple, certains opérateurs installent ou gèrent des définitions de ressources personnalisées). Ces autres contrôleurs suppriment automatiquement toutes les métadonnées propres à Config Sync. Si un autre composant de votre cluster Kubernetes supprime les métadonnées Config Sync, arrêtez de gérer la ressource avec Config Sync. Pour savoir comment procéder, consultez la section Arrêter la gestion d'un objet géré.

Si vous ne souhaitez pas que Config Sync annule les modifications apportées aux objets gérés du cluster, vous pouvez ajouter l'annotation client.lifecycle.config.k8s.io/mutation: ignore à l'objet dans lequel vous souhaitez que Config Sync ignore les mutations. Pour savoir comment procéder, consultez la section Ignorer les mutations d'objet.

Étapes suivantes