Stratégie de rapprochement

Avec la configuration déclarative, vous définissez l'état souhaité du système. Le système fonctionne alors en permanence pour demeurer le plus proche possible de cet état. Pour en savoir plus, consultez Gestion déclarative des objets Kubernetes à l'aide de fichiers de configuration.

À l'aide de Config Connector, vous pouvez créer et mettre à jour des ressources dans n'importe quel ordre, quelles que soient les relations de dépendance. GKE fait évoluer votre configuration déclarée vers une cohérence à terme avec l'état souhaité.

Par exemple, si vous créez un PubSubSubscription avant le PubSubTopic correspondant, Config Connector attend que le sujet soit créé avant de créer l'abonnement associé.

La durée de votre installation de Config Connector varie selon le nombre et les types de ressources qu'elle gère. Les modifications apportées à un cluster GKE sont généralement exécutées en quelques secondes. Toutefois, le temps nécessaire pour créer des ressourcesGoogle Cloud peut varier en fonction du type de ressource. Par exemple, la création d'un seul PubSubTopic ne prend que quelques secondes. Google CloudLes ressources n'atteignent pas la cohérence tant qu'elles ne sont pas créées. Par exemple, lors de la création d'un SQLInstance et d'un SQLDatabase, le système est incohérent pendant quelques minutes, le temps que la base de données soit créée.

GKE et Config Connector rapprochent chaque ressource à chaque mise à jour ou après une période de gigue avec une moyenne basée sur l'intervalle par défaut préconfiguré. Vous trouverez l'intervalle par défaut dans"Intervalle de rapprochement moyen par défaut de Config Connector en secondes" sur la page de référence de chaque ressource. Pour obtenir des liens vers chaque ressource, consultez la présentation des ressources. En cas d'erreur de rapprochement, Config Connector effectue une nouvelle tentative avec un intervalle exponentiel entre les tentatives, l'intervalle maximal étant de deux minutes. Pour les ressources gérées par des contrôleurs directs, vous pouvez configurer ce maximum à l'aide de l'annotation cnrm.cloud.google.com/backoff-max-delay-in-seconds. Vous pouvez afficher les erreurs dans les événements d'une ressource donnée.

Configurer l'intervalle de rapprochement

À partir de Config Connector 1.102, vous pouvez configurer l'intervalle de rapprochement moyen pour les ressources gérées par Config Connector avec l'annotation cnrm.cloud.google.com/reconcile-interval-in-seconds. La valeur de l'annotation remplace la valeur par défaut de "Intervalle de rapprochement moyen par défaut de Config Connector en secondes" de la page de documentation de référence sur les ressources. La valeur de l'annotation doit être un entier non négatif représentant la durée en secondes. Si la valeur est définie sur 0, Config Connector cesse de lancer des rapprochements pour la ressource une fois qu'elle atteint l'état UpToDate. Cette annotation contrôle le rapprochement périodique une fois que la ressource a atteint l'état UpToDate. L'annotation n'affecte pas les intervalles de nouvelle tentative en cas d'échec du rapprochement. Pour en savoir plus, consultez Configurer l'intervalle exponentiel entre les tentatives pour les erreurs de rapprochement.

Par exemple, si vous souhaitez que Config Connector rapproche une ressource moins fréquemment pour éviter de rencontrer des problèmes de quota d'API sous-jacents Google Cloud, vous pouvez définir la valeur de l'intervalle de rapprochement moyen sur une heure.

cnrm.cloud.google.com/reconcile-interval-in-seconds: "3600"

Si vous souhaitez que Config Connector rapproche une ressource plus fréquemment pour corriger les dérives plus rapidement, vous pouvez définir l'annotation avec une valeur faible.

Vous pouvez annoter toutes les ressources d'un type particulier qui partagent le même GVK (Group Version Kind) à l'aide du script suivant :

#!/bin/bash

KIND=RESOURCE_KIND
NAMESPACE=RESOURCE_NAMESPACE
ANNOTATION_KEY="cnrm.cloud.google.com/reconcile-interval-in-seconds"
ANNOTATION_VALUE=RECONCILE_INTERVAL

kubectl annotate --overwrite --all ${KIND} ${ANNOTATION_KEY}=${ANNOTATION_VALUE} -n ${NAMESPACE}
echo "Annotation added to all ${KIND} RESOURCE"

Remplacez les éléments suivants :

  • RESOURCE_KIND : type de ressource que vous souhaitez annoter.
  • RESOURCE_NAMESPACE : espace de noms contenant les ressources que vous souhaitez annoter.
  • RECONCILE_INTERVAL : intervalle de rapprochement en secondes.

Vous pouvez définir l'intervalle de rapprochement sur 0 pour désactiver la correction de la dérive pour une ressource, mais cela ne désactive pas l'actionnement de la ressource. Si vous modifiez la ressource Spec, elle sera de nouveau rapprochée.

La définition de l'intervalle de rapprochement sur 0 est irréversible. Cela signifie que le fait de rétablir une valeur non nulle n'entraîne pas la réconciliation de la ressource par Config Connector.

Si vous souhaitez annuler l'intervalle de rapprochement de 0, vous disposez des options suivantes :

  • Modifiez la spécification de la ressource avec la valeur de l'intervalle de rapprochement pour activer de nouveaux rapprochements.
  • Abandonnez la ressource en définissant l'annotation cnrm.cloud.google.com/deletion-policy: "abandon", puis recréez-la avec une valeur d'intervalle de rapprochement différente de 0.

Configurer l'intervalle exponentiel entre les tentatives pour les erreurs de rapprochement

Lorsqu'une ressource ne parvient pas à se rapprocher, Config Connector relance le rapprochement en utilisant un intervalle exponentiel entre les tentatives. Le délai commence à 250 millisecondes et double après chaque tentative infructueuse (par exemple, 500 millisecondes, puis 1 seconde, puis 2 secondes), jusqu'à un maximum par défaut de 2 minutes.

L'annotation cnrm.cloud.google.com/reconcile-interval-in-seconds contrôle la correction périodique de la dérive une fois qu'une ressource atteint l'état UpToDate. Dans Config Connector version 1.160.0 et ultérieures, vous pouvez utiliser l'annotation cnrm.cloud.google.com/backoff-max-delay-in-seconds pour contrôler le comportement des nouvelles tentatives en cas d'échec du rapprochement. Définissez l'annotation sur l'une des valeurs suivantes :

  • Un entier positif ("1" ou plus) : définit le délai maximal, en secondes, entre les nouvelles tentatives. Par exemple, "600" limite l'intervalle entre les nouvelles tentatives à 10 minutes, et "3600" à 1 heure.
  • "0" : arrête les nouvelles tentatives automatiques après l'échec d'un rapprochement. La ressource reste dans un état d'échec jusqu'à ce qu'une modification déclenche le rapprochement, par exemple une mise à jour de spec, metadata.labels, metadata.annotations, d'une ressource référencée ou de Secret.

Par exemple, pour limiter les intervalles entre les nouvelles tentatives à 30 minutes et réduire la Google Cloud consommation de quota d'API sur les ressources défaillantes, ajoutez l'annotation suivante :

metadata:
  annotations:
    cnrm.cloud.google.com/backoff-max-delay-in-seconds: "1800"

Pour arrêter les nouvelles tentatives automatiques en cas d'erreur de rapprochement jusqu'à ce que vous mettiez à jour la ressource, ajoutez l'annotation suivante :

metadata:
  annotations:
    cnrm.cloud.google.com/backoff-max-delay-in-seconds: "0"

Les champs modifiables, mais illisibles, ne sont activés qu'en cas de modification

Certaines API exposent des champs qui ne sont pas lisibles, mais qui sont modifiables (par exemple, le mot de passe d'un utilisateur SQL). Comme il est impossible de voir si ces champs ont été modifiés, les champs modifiables mais illisibles ne sont mis à jour que lorsque la ressource personnalisée est modifiée.

Les ressources ne sont pas recréées lors de la modification de champs immuables

Certains champs d'une ressource sont immuables et ne peuvent pas être rapprochés sans supprimer, puis recréer la ressource cible.

Dans ce cas, Config Connector émet un événement Kubernetes "UpdatedFailed" pour la ressource au lieu d'effectuer cette recréation. Vous devez ensuite supprimer et recréer la ressource.

Exemple d'événement :

Warning  UpdateFailed  37m (x643 over 15d)    computeinstance-controller  Update call failed: the desired mutation for the following field(s) is invalid: [bootDisk.0.InitializeParams.0.Image networkInterface.0.NetworkIp]