Prévenir les écarts de configuration

Config Sync offre deux façons de gérer les dérives :

  • Utiliser l'autoréparation intégrée de Config Sync (recommandé, aucune configuration n'est requise) Config Sync détecte et annule automatiquement les dérives. Vous ne pouvez pas désactiver l'autoréparation de Config Sync. L'autoréparation a un impact minimal sur les performances.
  • Activer la fonctionnalité de prévention des dérives (sur cette page) : la prévention des dérives utilise un webhook d'admission pour bloquer les modifications conflictuelles. Cette fonctionnalité peut entraîner une utilisation élevée de la mémoire et des erreurs de mémoire insuffisante (OOM), en particulier dans les clusters comportant de nombreuses définitions de ressources personnalisées (CRD).

Le webhook d'admission nécessite que Config Sync charge le schéma OpenAPI Kubernetes pour valider les requêtes. Dans les clusters comportant de nombreuses ressources ou CRD, le traitement de ce schéma peut dépasser les limites de mémoire, ce qui entraîne des défaillances de composants. Dans la plupart des cas d'utilisation, l'autoréparation intégrée de Config Sync assure la protection contre les dérives sans les risques de stabilité du webhook.

Lorsqu'elle est activée, la prévention des dérives protège les objets RootSync par défaut. Vous pouvez configurer la fonctionnalité pour protéger les objets RepoSync. Pour utiliser la prévention des dérives, vous devez activer les RootSync et RepoSync API.

Avant de commencer

Si vous avez déjà installé la Google Cloud CLI, obtenez la dernière version en exécutant la commande gcloud components update.

Activer la protection contre les dérives

Vous pouvez activer la protection contre les dérives à l'aide de la gcloud CLI. Vous ne pouvez pas activer la protection contre les dérives dans la Cloud de Confiance console.

Pour activer la protection contre les dérives, procédez comme suit :

  1. Mettez à jour le fichier manifeste de votre spécification d'application pour définir le champ spec.configSync.preventDrift sur true :

    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        ... existing content ...
        preventDrift: true
    
  2. Appliquez le fichier manifeste mis à jour :

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Remplacez les éléments suivants :

    • MEMBERSHIP_NAME: nom d'appartenance de parc que vous avez choisi lors de l'enregistrement de votre cluster. Obtenez le nom avec la commande gcloud container fleet memberships list.
    • MANIFEST_NAME : nom du fichier manifeste de votre spécification d'application, généralement apply-spec.yaml.
    • PROJECT_ID : ID du projet.
  3. Attendez que l'objet Config Sync ValidateWebhookConfiguration soit créé par Config Management Operator :

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  4. Validez une nouvelle modification dans la source de vérité à synchroniser afin que le déploiement root-reconciler puisse ajouter des webhooks dans l'objet Config Sync "ValidatingWebhookConfiguration". Vous pouvez également supprimer le déploiement root-reconcilier pour déclencher un rapprochement. Le nouvel objet de déploiement root-reconciler mettra à jour l'objet Config Sync "ValidatingWebhookConfiguration".

  5. Attendez que le serveur de webhook soit prêt. Le journal de déploiement du webhook d'admission Config Sync doit inclure serving webhook server. Cette opération peut prendre plusieurs minutes.

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    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
    

Désactiver la protection contre les dérives

Lorsque vous désactivez la protection contre les dérives, Config Sync supprime toutes les ressources de webhook d'admission Config Sync. Étant donné que l'objet Config Sync ValidatingWebhookConfiguration n'existe plus, les rapprochements Config Sync ne génèrent plus les configurations du webhook pour les ressources gérées.

Pour désactiver la protection contre les dérives, procédez comme suit :

  1. Mettez à jour le fichier manifeste de votre spécification d'application pour définir le champ spec.configSync.preventDrift sur false :

    applySpecVersion: 1
    spec:
      configSync:
        enabled: false
        ... existing content ...
        preventDrift: false
    
  2. Appliquez le fichier manifeste mis à jour :

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Remplacez les éléments suivants :

    • MEMBERSHIP_NAME: nom d'appartenance de parc que vous avez choisi lors de l'enregistrement de votre cluster. Obtenez le nom avec la commande gcloud container fleet memberships list.
    • MANIFEST_NAME : nom du fichier manifeste de votre spécification d'application, généralement apply-spec.yaml.
    • PROJECT_ID : ID du projet.

Activer le webhook d'admission dans les sources à l'échelle d'un espace de noms

Les sources de vérité à l'échelle d'un espace de noms ne sont pas entièrement protégées par le webhook. Le rapprochement Config Sync pour chaque source d'espaces de noms ne dispose pas des autorisations nécessaires pour lire ou mettre à jour les objets ValidatingWebhookConfiguration au niveau du cluster.

Cette absence d'autorisation génère une erreur dans les journaux des rapprochements d'espaces de noms comme dans cet exemple :

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

Vous pouvez ignorer cette erreur si vous ne souhaitez pas utiliser la protection de webhook pour votre source de vérité à l'échelle d'un espace de noms. Toutefois, si vous souhaitez utiliser le webhook, accordez l'autorisation au rapprochement pour chaque source de vérité à l'échelle d'un espace de noms après avoir configuré la synchronisation à partir de plusieurs sources de vérité. Vous n'aurez peut-être pas besoin d'effectuer ces étapes si un objet RoleBinding pour ns-reconciler-NAMESPACE existe déjà avec les autorisations cluster-admin ClusterRole.

  1. Dans la source de vérité racine, déclarez une nouvelle configuration d'objet ClusterRole qui accorde une autorisation au webhook d'admission Config Sync. Cet objet ClusterRole n'a besoin d'être défini qu'une seule fois par 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"]
    
  2. Pour chaque source à l'échelle d'un espace de noms pour laquelle l'autorisation de webhook d'admission doit être accordée, déclarez une configuration ClusterRoleBinding pour accorder l'accès au webhook d'admission :

    # 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.io
    

    Remplacez NAMESPACE par l'espace de noms dans lequel vous avez créé votre source à l'échelle d'un espace de noms.

  3. Validez les modifications dans la source de vérité racine, par exemple en cas de synchronisation à partir d'un dépôt Git :

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. Pour vérifier, utilisez kubectl get pour vous assurer que les objets ClusterRole et ClusterRoleBinding ont été créés :

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook
    

Étape suivante