Résoudre les problèmes liés à Policy Controller

Cette page explique comment résoudre les problèmes liés à Policy Controller.

Conseils généraux

La section suivante fournit des conseils généraux pour résoudre les problèmes liés à Policy Controller.

Arrêter Policy Controller

Si Policy Controller pose problème dans votre cluster, vous pouvez arrêter Policy Controller pendant que vous recherchez la cause du problème.

Examiner les métriques

L'examen des métriques de Policy Controller peut vous aider à diagnostiquer les problèmes liés à Policy Controller.

Vérifier l'installation

Vous pouvez vérifier si Policy Controller et la bibliothèque de modèles de contraintes ont bien été installés.

Dissocier Policy Controller

Dans de rares cas, vous devrez peut-être dissocier Policy Controller de vos clusters. Cette opération désactive complètement la gestion de Policy Controller. Essayez d'arrêter temporairement Policy Controller pour voir si vous pouvez résoudre les problèmes avant d'utiliser la commande detach.

  1. Dissociez Policy Controller de votre parc :

    gcloud container fleet policycontroller detach
    
  2. Réassociez Policy Controller :

    gcloud container fleet policycontroller enable
    

Erreur lors de la création d'un modèle de contrainte

Si l'erreur porte la mention disallowed ref, vérifiez que vous avez activé les contraintes référentielles. Par exemple, si vous utilisez data.inventory dans un modèle de contrainte sans activer des contraintes référentielles au préalable, l'erreur ressemble à ceci :

admission webhook "validation.gatekeeper.sh" denied the request: check refs failed on module {templates["admission.k8s.gatekeeper.sh"]["MyTemplate"]}: disallowed ref data.inventory...

Contrainte non appliquée

La section suivante fournit des conseils de dépannage si vous pensez que vos contraintes ne sont pas appliquées.

Vérifier si votre contrainte est appliquée

Si vous craignez que votre contrainte ne soit pas appliquée, vous pouvez vérifier son spec.status et le modèle de contrainte. Pour vérifier l'état, exécutez la commande suivante :

kubectl describe CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Remplacez les éléments suivants :

  • CONSTRAINT_TEMPLATE_NAME : nom du modèle de contrainte que vous souhaitez vérifier. Exemple :K8sNoExternalServices
  • CONSTRAINT_NAME : Name de la contrainte que vous souhaitez vérifier.

    Si nécessaire, exécutez la commande kubectl get constraint pour vérifier les modèles de contrainte et les contraintes installés sur votre système.

Dans le résultat de la commande kubectl describe, notez les valeurs des champs metadata.generation et status.byPod.observedGeneration. Dans l'exemple suivant, ces valeurs sont en gras :

Name:         no-internet-services
Namespace:
API Version:  constraints.gatekeeper.sh/v1beta1
Kind:         K8sNoExternalServices
Metadata:
  Creation Timestamp:  2021-12-03T19:00:06Z
  Generation:          1
  Managed Fields:
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:config.k8s.io/owning-inventory:
          f:configmanagement.gke.io/cluster-name:
          f:configmanagement.gke.io/managed:
          f:configmanagement.gke.io/source-path:
          f:configmanagement.gke.io/token:
          f:configsync.gke.io/declared-fields:
          f:configsync.gke.io/git-context:
          f:configsync.gke.io/manager:
          f:configsync.gke.io/resource-id:
        f:labels:
          f:app.kubernetes.io/managed-by:
          f:configsync.gke.io/declared-version:
      f:spec:
        f:parameters:
          f:internalCIDRs:
    Manager:      configsync.gke.io
    Operation:    Apply
    Time:         2022-02-15T17:13:20Z
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
    Manager:         gatekeeper
    Operation:       Update
    Time:            2021-12-03T19:00:08Z
  Resource Version:  41460953
  UID:               ac80849d-a644-4c5c-8787-f73e90b2c988
Spec:
  Parameters:
    Internal CID Rs:
Status:
  Audit Timestamp:  2022-02-15T17:21:51Z
  By Pod:
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-audit-5d4d474f95-746x4
    Observed Generation:  1
    Operations:
      audit
      status
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-controller-manager-76d777ddb8-g24dh
    Observed Generation:  1
    Operations:
      webhook
  Total Violations:  0
Events:              <none>

Si vous voyez chaque pod Policy Controller avec une valeur observedGeneration égale à la valeur metadata.generation (comme dans l'exemple précédent), votre contrainte est probablement appliquée. Toutefois, si ces valeurs correspondent mais que vous rencontrez toujours des problèmes lors de l'application de votre contrainte, consultez la section suivante pour obtenir des conseils. Si vous remarquez que seules certaines valeurs correspondent ou que certains pods ne sont pas répertoriés, l'état de votre contrainte est inconnu. La contrainte peut être appliquée de manière incohérente entre les pods de Policy Controller ou pas du tout. Si aucune valeur ne correspond, la contrainte n'est pas appliquée.

Contrainte non appliquée, mais résultats d'audit signalés

Si la vérification observedGeneration décrite dans la section précédente a révélé des correspondances et qu'il existe des résultats d'audit indiquant des violations attendues pour la contrainte (pour les objets préexistants, pas pour les requêtes entrantes), mais que la contrainte n'est toujours pas appliquée, le problème est probablement lié au webhook. Le webhook rencontre peut-être l'un des problèmes suivants :

  • Le pod de webhook Policy Controller peut ne pas être opérationnel. Les techniques de débogage Kubernetes peuvent vous aider à résoudre les problèmes liés au pod de webhook.
  • Il peut y avoir un pare-feu entre le serveur d'API et le service de webhook. Reportez-vous à la documentation de votre fournisseur de pare-feu pour plus d'informations sur le paramétrage correct du pare-feu.

Contrainte référentielle non appliquée

Si votre contrainte est une contrainte référentielle, assurez-vous que les ressources nécessaires sont mises en cache. Pour en savoir plus sur la mise en cache des ressources, consultez la page Configurer Policy Controller pour les contraintes référentielles.

Vérifier la syntaxe du modèle de contrainte

Si vous avez défini votre propre modèle de contrainte et qu'il n'est pas appliqué, la syntaxe du modèle de contrainte contient peut-être une erreur.

Vous pouvez examiner le modèle à l'aide de la commande suivante :

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Remplacez CONSTRAINT_TEMPLATE_NAME par le nom du modèle que vous souhaitez examiner. Les erreurs doivent être signalées dans le champ status.

Étapes suivantes