Arrêter et reprendre la synchronisation des configurations

Dans certains cas, vous devrez peut-être rapidement arrêter la synchronisation des configurations de votre dépôt dans Config Sync. Par exemple, si une personne effectue dans le dépôt un commit d'une configuration valide d'un point de vue syntaxique mais incorrecte, vous souhaiterez certainement limiter ses effets sur vos clusters en cours d'exécution le temps que la configuration soit supprimée ou corrigée.

Prérequis

L'utilisateur exécutant les commandes décrites dans cette rubrique doit disposer des autorisations Kubernetes RBAC suivantes dans les espaces de noms kube-system (obligatoire uniquement pour les versions antérieures à 1.9.0) et config-management-system sur tous les clusters pour lesquels vous souhaitez arrêter la synchronisation :

- apiGroups: ["extensions"]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "update"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "watch"]

Espace de noms config-management-operator

L'opérateur config-management-operator se trouve dans l'espace de noms kube-system pour les versions d'Anthos Config Management antérieures à la version 1.9.0. Dans Anthos Config Management 1.9.0, config-management-operator a été déplacé dans l'espace de noms config-management-system. Avant d'exécuter l'une des commandes suivantes, définissez une variable d'environnement pour indiquer l'espace de noms spécifique à la version.

Pour Anthos Config Management versions 1.9.0 ou ultérieures :

export OPERATOR_NAMESPACE=config-management-system

Pour les versions antérieures à 1.9.0 :

export OPERATOR_NAMESPACE=kube-system

Arrêter et reprendre la synchronisation à partir de dépôts uniques

Cette section concerne les dépôts uniques. Elle explique comment arrêter la synchronisation rapidement et comment reprendre la synchronisation une fois le problème résolu. Pour savoir comment arrêter la synchronisation de plusieurs dépôts, consultez la section Arrêter et reprendre la synchronisation à partir de plusieurs dépôts.

Arrêter la synchronisation

Pour arrêter la synchronisation, exécutez les commandes ci-dessous. Nous les présentons ici sous la forme d'une seule commande pour plus de commodité, mais vous pouvez également les exécuter séparément :

kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
&& kubectl scale -n config-management-system deployment --replicas=0 --all \
&& kubectl wait -n config-management-system --for=delete pods --all

Les commandes effectuent les actions suivantes, dans l'ordre. Si une commande échoue, les autres commandes ne s'exécutent pas.

  1. Réduit le nombre de replicas du déploiement de l'opérateur Config Management à 0.
  2. Réduit le nombre de replicas de tous les pods exécutés dans l'espace de noms config-management-system à 0. L'ensemble exact de pods concernés varie selon la version du produit.

Tous les déploiements sont toujours dans le cluster, mais aucune instance dupliquée de l'opérateur ni aucun des processus responsables de la synchronisation n'est disponible. Les configurations ne sont donc pas synchronisées à partir du dépôt.

Arrêter la synchronisation sur tous les clusters enregistrés

Si vous devez arrêter la synchronisation sur tous les clusters enregistrés dans un même projet Google Cloud plutôt que de procéder cluster par cluster, vous pouvez créer un script utilisant la commande nomos status pour obtenir la liste de tous les clusters enregistrés. Le script crée ensuite un contexte kubectl pour chaque cluster à l'aide de la commande gcloud container clusters get-credentials et exécute les commandes ci-dessus sur chacun d'eux. Voici un exemple simple d'un tel script :

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
  && kubectl scale -n config-management-system deployment --replicas=0 --all \
  && kubectl wait -n config-management-system --for=delete pods --all

done

Reprendre la synchronisation

Pour reprendre la synchronisation, exécutez la commande suivante :

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

Cette commande effectue le scaling du déploiement de l'opérateur pour qu'il dispose d'une instance dupliquée. L'opérateur remarque ensuite que les pods de l'espace de noms config-management-system sont déployés de manière incorrecte et les adaptent au bon nombre d'instances dupliquées.

Reprendre la synchronisation sur tous les clusters enregistrés

Si vous devez reprendre la synchronisation sur tous les clusters enregistrés dans un même projet Google Cloud plutôt que de procéder cluster par cluster, vous pouvez créer un script utilisant la commande nomos status pour obtenir la liste de tous les clusters enregistrés. Le script crée ensuite un contexte kubectl pour chaque cluster à l'aide de la commande gcloud container clusters get-credentials et exécute la commande ci-dessus sur chacun d'eux. Voici un exemple simple d'un tel script :

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

Arrêter et reprendre la synchronisation à partir de plusieurs dépôts

Cette section concerne plusieurs dépôts. Elle explique comment arrêter temporairement la synchronisation et comment la reprendre à partir de plusieurs dépôts. Vous devrez peut-être effectuer cette opération si une configuration incorrecte est validée par erreur dans votre dépôt. Pour savoir comment arrêter la synchronisation pour des dépôts uniques, consultez la section Arrêter et reprendre la synchronisation à partir de dépôts uniques.

Seul un administrateur central peut arrêter la synchronisation dans le dépôt racine.

La possibilité d'arrêter la synchronisation dans les dépôts d'espaces de noms dépend de la méthode de configuration utilisée pour ceux-ci.

  • Si la méthode Contrôler les dépôts d'espaces de noms dans le dépôt racine a été utilisée, un administrateur central est le seul à pouvoir arrêter et reprendre la synchronisation.

  • Si la méthode Contrôler les dépôts d'espaces de noms avec l'API Kubernetes a été utilisée, les opérateurs d'application peuvent arrêter et reprendre la synchronisation à partir des dépôts d'espaces de noms sur lesquels ils travaillent.

Arrêter la synchronisation

Les sections suivantes expliquent comment arrêter la synchronisation du dépôt racine et des dépôts d'espaces de noms. Pour empêcher le gestionnaire de rapprochement d'annuler la modification, vous devez d'abord arrêter le gestionnaire de rapprochement en exécutant les commandes suivantes :

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
&& kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager

Les commandes effectuent les actions suivantes, dans l'ordre. Si une commande échoue, les autres commandes ne s'exécutent pas.

  1. Réduit le nombre de replicas du déploiement de l'opérateur Config Management à 0.
  2. Réduit le nombre de replicas du déploiement du gestionnaire de rapprochement à 0.

Arrêter la synchronisation à partir du dépôt racine

Pour arrêter la synchronisation à partir du dépôt racine, un administrateur central peut exécuter la commande suivante :

kubectl -n config-management-system scale deployment root-reconciler --replicas=0

Cette commande réduit à 0 le nombre de replicas dans le déploiement de root-reconciler.

Arrêter la synchronisation à partir des dépôts d'espaces de noms

Sélectionnez l'onglet Méthode du dépôt racine ou Méthode de l'API Kubernetes pour afficher les instructions correspondantes.

Méthode du dépôt racine

Si la méthode Contrôler les dépôts d'espaces de noms dans le dépôt racine a été utilisée, les administrateurs centraux peuvent effectuer les commandes suivantes pour arrêter la synchronisation à partir du dépôt d'un espace de noms :

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=0

Cette commande réduit à 0 le nombre d'instances dupliquées du déploiement ns-reconciler-NAMESPACE.

Méthode de l'API Kubernetes

Si la méthode Contrôler les dépôts d'espaces de noms avec l'API Kubernetes a été utilisée, les opérateurs d'application peuvent arrêter la synchronisation en exécutant les commandes suivantes :

  1. Récupérez la configuration RepoSync et enregistrez-la pour l'utiliser plus tard lorsque vous souhaiterez reprendre la synchronisation :

    kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
    

    Remplacez NAMESPACE par l'espace de noms de votre objet RepoSync.

  2. Supprimez la configuration RepoSync :

    kubectl -n NAMESPACE delete reposyncs repo-sync
    

    Cette commande déclenche le gestionnaire de rapprochement pour supprimer le rapprochement de l'espace de noms (ns-reconciler-NAMESPACE) de NAMESPACE et arrête la synchronisation.

Empêcher le webhook d'admission de bloquer les dérives (facultatif)

Pour empêcher Config Sync d'effectuer une protection contre les dérives, après avoir arrêté les rapprochements, vous pouvez arrêter le webhook d'admission en exécutant la commande suivante :

kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

Cette étape est facultative et n'est requise que lorsque vous devez apporter des modifications incompatibles aux ressources gérées du cluster. Cela nécessite d'abord d'arrêter le rapprochement racine. Dans le cas contraire, le rapprochement racine tente de générer les configurations du webhook après la suppression.

Arrêter la synchronisation à partir de tous les dépôts

Pour arrêter la synchronisation à partir de tous les dépôts, y compris le dépôt racine et les dépôts d'espaces de noms, exécutez les commandes suivantes :

kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler

Les commandes réduisent à zéro le nombre de replicas de tous les pods de rapprochement exécutés dans l'espace de noms config-management-system, et attendent jusqu'à ce que tous les pods de rapprochement soient supprimés.

Tous les déploiements sont toujours dans le cluster, mais aucune instance dupliquée de l'opérateur ni aucun des processus responsables de la synchronisation n'est disponible. Les configurations ne sont donc pas synchronisées à partir du dépôt.

Arrêter la synchronisation sur tous les clusters enregistrés

Si vous devez arrêter la synchronisation sur tous les clusters enregistrés dans un même projet Google Cloud plutôt que de procéder cluster par cluster, vous pouvez créer un script utilisant la commande nomos status pour obtenir la liste de tous les clusters enregistrés. Le script crée ensuite un contexte kubectl pour chaque cluster à l'aide de la commande gcloud container clusters get-credentials et exécute les commandes ci-dessus sur chacun d'eux. Voici un exemple simple d'un tel script :

#!/bin/bash

nomos status | grep SYNCED | awk {'print $1'} | while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
  && kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager \
  && kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler

done

Reprendre la synchronisation

Cette section explique comment reprendre la synchronisation du dépôt racine et des dépôts d'espaces de noms.

Reprendre la synchronisation à partir du dépôt racine

Pour reprendre la synchronisation à partir d'un dépôt racine, un administrateur central peut exécuter la commande suivante :

kubectl -n config-management-system scale deployment root-reconciler --replicas=1

Cette commande effectue le scaling du déploiement root-reconciler pour qu'il dispose d'une instance dupliquée.

Reprendre la synchronisation à partir d'un dépôt d'espaces de noms

Sélectionnez l'onglet Méthode du dépôt racine ou Méthode de l'API Kubernetes pour afficher les instructions correspondantes.

Méthode du dépôt racine

Si vous avez utilisé la méthode Contrôler les dépôts d'espaces de noms dans le dépôt racine, un administrateur central peut exécuter la commande suivante :

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

Cette commande effectue le scaling du déploiement "ns-reconciler-NAMESPACE" pour qu'il dispose d'une instance dupliquée.

Méthode de l'API Kubernetes

Si vous avez utilisé la méthode Contrôler les dépôts d'espaces de noms avec l'API Kubernetes, les opérateurs d'application peuvent reprendre la synchronisation en appliquant à nouveau repo-sync.yaml, qui contient la configuration RepoSync :

kubectl apply -f repo-sync.yaml

Cette commande déclenche le gestionnaire de rapprochement pour créer un processus de rapprochement des espaces de noms et un déploiement ns-reconciler-NAMESPACE.

Relancer le webhook d'admission

Après la reprise du rapprochement racine, les configurations de webhook sont générées automatiquement. Pour vérifier qu'elles ont bien été générées, exécutez la commande suivante :

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

Reprendre la synchronisation à partir de tous les dépôts

Pour reprendre la synchronisation à partir de tous les dépôts, exécutez la commande suivante :

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

Cette commande effectue le scaling du déploiement de l'opérateur pour qu'il dispose d'une instance dupliquée. L'opérateur remarque ensuite que le déploiement du gestionnaire de rapprochement n'est pas correctement mis à l'échelle et qu'il le met à l'échelle pour le nombre d'instances dupliquées approprié. Le gestionnaire de rapprochement procède finalement au scaling des rapprochements racine et d'espace de noms avec le nombre d'instances dupliquées correspondant.

  # scale the root-reconciler Deployment to 1 replica.
  kubectl -n config-management-system scale deployment root-reconciler --replicas=1

  # scale the ns-reconciler-NAMESPACE Deployment to 1 replica.
  kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

Reprendre la synchronisation sur tous les clusters enregistrés

Si vous devez reprendre la synchronisation sur tous les clusters enregistrés dans un même projet Google Cloud plutôt que de procéder cluster par cluster, vous pouvez créer un script utilisant la commande nomos status pour obtenir la liste de tous les clusters enregistrés. Le script crée ensuite un contexte kubectl pour chaque cluster à l'aide de la commande gcloud container clusters get-credentials et exécute la commande ci-dessus sur chacun d'eux. Voici un exemple simple d'un tel script :

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

Étape suivante