Configurer la journalisation mutualisée


Cette page explique comment configurer la journalisation mutualisée pour les clusters Google Kubernetes Engine (GKE).

Il est courant que plusieurs équipes partagent un même cluster GKE. Le partage d'un cluster offre de nombreux avantages, y compris une découverte des services facilitée, une sécurité simplifiée et une gestion de clusters moins lourde à gérer par les administrateurs. Toutefois, les équipes de développement individuelles disposent généralement de leur propre projet. Cette structure, qui comporte un cluster GKE principal, mais des espaces de noms distincts pour chaque équipe de développement, est appelée architecture mutualisée. Le projet de l'équipe de développement se nomme le locataire.

Avec Google Cloud, les administrateurs de cluster GKE peuvent créer un système dans lequel les journaux du cluster demeurent au sein du projet GKE principal, tandis que les journaux des locataires sont distribués aux projets des locataires. Pour configurer vos journaux de cette manière, utilisez le routeur de journaux. Le routeur de journaux vous permet de contrôler la manière dont les journaux circulent dans votre projet Google Cloud et dont ils sont acheminés vers des destinations compatibles.

Pour créer des journaux spécifiques au locataire, l'administrateur de cluster crée un récepteur pour acheminer les entrées de journal vers le projet de chaque locataire. Dans chaque projet locataire, les équipes individuelles peuvent contrôler la manière dont les journaux sont stockés et utilisés, en configurant par exemple des métriques et des alertes basées sur les journaux pour les surveiller.

Nous recommandons d'inclure un filtre d'exclusion aux récepteurs _Default figurant dans les projets GKE principaux. Le filtre d'exclusion empêche l'ingestion des journaux de locataire à la fois dans le projet GKE principal et dans le projet locataire.

Prérequis

Configurer la journalisation mutualisée

Vous pouvez configurer la journalisation mutualisée à l'aide de Google Cloud CLI ou de la console Google Cloud.

gcloud

Pour configurer la journalisation mutualisée pour les clusters GKE, procédez comme suit :

  1. Définissez les variables d'environnement suivantes :

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Remplacez les éléments suivants :

    • TENANT_NAMESPACE : nom de l'espace de noms du projet locataire.
    • MAIN_PROJECT_ID : ID de votre projet principal.
    • TENANT_PROJECT_ID : ID de votre projet locataire.
  2. Créez un espace de noms dans votre cluster mutualisé :

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Créez un récepteur de journaux dans le projet GKE principal :

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    Cette commande crée un récepteur de journaux qui envoie tous les journaux associés à l'espace de noms $TENANT_NAMESPACE au projet locataire.

    Vous devrez peut-être utiliser un filtre --log-filter plus restrictif. Par exemple, si votre cluster et votre locataire ont le même espace de noms, ajoutez un filtre de cluster.

    Pour en savoir plus sur ces champs, consultez la documentation de l'API gcloud logging sinks create.

  4. Obtenez l'identité du rédacteur à partir du récepteur du projet principal et attribuez-la à une variable d'environnement.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. Attribuez le rôle Rédacteur de journaux (logging.bucketWriter) au compte de service utilisé par le récepteur. La commande suivante accorde au projet principal les autorisations nécessaires pour écrire des journaux dans le projet locataire :

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.logWriter' \
         --condition="expression=resource.name.endsWith(\"projects/$TENANT_PROJECT\"),title=Log writer for $TENANT_NAMESPACE,description=Grants Logs Writer role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

    Pour en savoir plus sur ces champs, consultez la documentation de l'API gcloud projects add-iam-policy-binding.

  6. Vous pouvez également créer un filtre d'exclusion pour le récepteur qui achemine les journaux vers le bucket _Default du projet principal. Si vous ne créez pas de filtre d'exclusion dans le bucket _Default, les journaux routés apparaissent à la fois dans le bucket _Default du projet principal et dans le bucket de journaux du projet locataire. Pour créer un filtre d'exclusion, procédez comme suit :

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion filter on the _Default bucket for $TENANT_NAMESPACE\",filter=resource.labels.namespace_name=\"$TENANT_NAMESPACE\""
    

    Pour en savoir plus sur ces champs, consultez la documentation de l'API gcloud logging sinks update.

Console

Pour mettre en œuvre la journalisation mutualisée pour GKE, procédez comme suit :

  1. Créez le récepteur de journaux dans le projet principal :

    1. Utilisez le sélecteur de projet de la console Google Cloud pour sélectionner le projet GKE principal.
    2. Dans le panneau de navigation de la console Google Cloud, sélectionnez Logging, puis Routeur de journaux :

      Accéder au routeur de journaux

    3. Sur la page Routeur de journaux, cliquez sur Créer un récepteur.
    4. Saisissez un nom et une description pour votre récepteur, puis cliquez sur Suivant.
    5. Dans le menu Sélectionner le service de récepteur, sélectionnez Autre projet.
    6. Dans le champ Destination du récepteur, ajoutez la destination suivante :

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      Remplacez TENANT_PROJECT_ID par l'ID de votre projet locataire.

    7. Cliquez sur Next (Suivant).

    8. Dans le champ Filtre d'inclusion de compilation, ajoutez le filtre suivant :

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      Remplacez TENANT_NAMESPACE par le nom de l'espace de noms de votre projet locataire.

      Vous pouvez utiliser un filtre d'inclusion plus restrictif. Par exemple, lorsque votre cluster et votre locataire ont le même espace de noms, envisagez d'ajouter une clause pour n'inclure que les entrées de journal d'un cluster spécifique.

    9. Cliquez sur Créer un récepteur. Votre nouveau récepteur s'affiche dans la liste Récepteurs du routeur de journaux.

  2. Copiez l'identité du rédacteur du récepteur dans votre presse-papiers :

    1. Sur la page Routeur de journaux, localisez le récepteur de journaux.
    2. Pour ce récepteur, cliquez sur Plus, puis sélectionnez Afficher les détails du récepteur.
    3. Dans le volet Détails du récepteur, recherchez le champ Identité du rédacteur, puis copiez la valeur dans votre presse-papiers. Omettez serviceAccount: de la valeur copiée.
  3. Dans le projet locataire, attribuez le rôle Rédacteur de journaux (roles/logging.logWriter) au compte de service utilisé par le récepteur du projet principal. Le projet principal a besoin de cette autorisation pour écrire des journaux dans le projet locataire.

    1. Dans le panneau de navigation de la console Google Cloud, sélectionnez IAM:

      Accéder à IAM

    2. Cliquez sur Accorder l'accès.
    3. Dans le champ Nouveaux comptes principaux, ajoutez le compte de service du récepteur.
    4. Dans la liste déroulante Sélectionner un rôle, sélectionnez Journalisation et Rédacteur de journaux.
    5. Cliquez sur Enregistrer.
  4. Vous pouvez éventuellement créer un filtre d'exclusion dans le bucket _Default du projet principal pour empêcher l'écriture des journaux acheminés vers un projet locataire dans le bucket de journaux _Default du projet principal :

    1. Dans le panneau de navigation de la console Google Cloud, sélectionnez Logging, puis Routeur de journaux :

      Accéder au routeur de journaux

    2. À côté du bucket _Default, cliquez sur Plus et sélectionnez Modifier le récepteur.
    3. Dans la section Choisissez des journaux à exclure du récepteur, cliquez sur Ajouter une exclusion.
    4. Saisissez un nom de filtre.
    5. Dans la zone Créer un filtre d'exclusion, ajoutez les éléments suivants :

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. Cliquez sur Mettre à jour le récepteur.

Vérifier les journaux de locataire

Une fois que vous avez commencé à utiliser les charges de travail qui utilisent TENANT_NAMESPACE, vous pouvez vérifier que le projet locataire reçoit les journaux propres au locataire :

  1. Sélectionnez le projet locataire à l'aide du sélecteur de projet de la console Google Cloud.
  2. Dans le panneau de navigation de la console Google Cloud, sélectionnez Logging, puis Explorateur de journaux :

    Accéder à l'explorateur de journaux

  3. Dans le champ de l'éditeur de requête, exécutez la requête suivante :

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    Dans le volet Résultats de la requête, vous devriez voir les journaux spécifiques au locataire acheminés à partir du projet principal.

Utiliser des journaux de locataire

Dans les projets locataires, chaque équipe peut contrôler la manière dont les journaux sont routés, stockés et analysés. Une fois les journaux acheminés vers les projets locataires, les équipes individuelles dédiées aux applications peuvent choisir d'acheminer leurs journaux vers des destinations compatibles, telles que les buckets Logging, ou vers des destinations tierces à l'aide de Pub/Sub. Pour en savoir plus sur le routage des entrées de journal, consultez la page Acheminer les journaux vers des destinations compatibles.

Les équipes individuelles dédiées aux applications peuvent également configurer des alertes basées sur le contenu des journaux ou des métriques dérivées des journaux. Pour en savoir plus, consultez la page Surveiller vos journaux.

Effectuer un nettoyage

Vous pouvez supprimer les objets que vous avez créés pour la journalisation mutualisée à l'aide de gcloud ou de la console Google Cloud.

gcloud

Pour supprimer les objets que vous avez créés pour la journalisation mutualisée, procédez comme suit :

  1. Définissez des variables pour simplifier les commandes suivantes :

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Remplacez l'élément suivant :

    • TENANT_NAMESPACE : nom de l'espace de noms du projet locataire.
    • MAIN-PROJECT-ID : ID de votre projet principal.
    • TENANT-PROJECT-ID : ID de votre projet locataire.
  2. Supprimez le rôle Rédacteur de journaux (roles/logging.logWriter) du compte de service dans le projet locataire :

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.logWriter' \
        --all
    
  3. Supprimez le récepteur de journaux :

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. Supprimez l'espace de noms :

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Dans le projet locataire, supprimez le rôle Rédacteur de journaux (roles/logging.logWriter) du compte de service :

    1. Dans le panneau de navigation de la console Google Cloud, sélectionnez IAM:

      Accéder à IAM

    2. Pour le compte de service que vous souhaitez supprimer, cliquez sur  Modifier le compte principal.
    3. Dans le panneau Modifier l'accès, cliquez sur  Supprimer le rôle à côté du rôle Rédacteur de journaux, puis sur Enregistrer.
  2. Dans le projet principal, supprimez le récepteur de journaux :

    1. Utilisez l'outil de sélection de projets de la console Google Cloud pour sélectionner le projet GKE locataire.
    2. Dans le panneau de navigation de la console Google Cloud, sélectionnez Logging, puis Routeur de journaux :

      Accéder au routeur de journaux

    3. Pour le récepteur que vous souhaitez supprimer, cliquez sur  Plus.
    4. Sélectionnez Supprimer le récepteur.
    5. Dans le panneau de confirmation, cliquez sur Supprimer.

Limites

La journalisation mutualisée présente les limites suivantes :

  • Le quota du nombre de récepteurs de journaux par projet est de 200. Si vous avez besoin de plus de 200 locataires, demandez une augmentation de quota en ouvrant une demande d'assistance.
  • Le nombre de filtres d'exclusion par bucket de journaux est limité à 50. Si vous prévoyez d'avoir plus de 50 locataires, révisez l'approche du filtre d'exclusion pour le bucket _Default. Vous pouvez également procéder comme suit :

    • Créez un filtre d'exclusion unique qui exclut tous les espaces de noms non liés au système ou autres que par défaut à l'aide de la commande suivante :

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion filter on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • Dupliquez les journaux entre le projet locataire et le projet principal en ne créant aucun filtre d'exclusion.

Étapes suivantes