Journalisation mutualisée sur GKE

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 Cloud Logging. 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 d'autres projets Google Cloud.

Pour créer des journaux spécifiques au locataire, l'administrateur de cluster crée un récepteur pour exporter les entrées de journal vers un bucket de journal créé au sein du projet du locataire. Vous pouvez éventuellement créer une règle d'exclusion pour éviter que les journaux du locataire soient stockés au sein du projet GKE principal.

Le diagramme suivant présente une architecture de journalisation mutualisée utilisant des buckets de journaux :

Architecture mutualisée GKE

Cette architecture comprend les éléments suivants :

  1. Un bucket de journal créé dans chaque projet locataire
  2. Un récepteur de journaux créé pour chaque espace de noms de locataire.
  3. Un compte de service créé automatiquement pour chaque récepteur de journal.
  4. Des règles d'exclusion pour, éventuellement, empêcher la duplication de journaux dans le projet GKE principal.

Les sections suivantes vous expliquent comment créer une telle architecture.

Prérequis

Configurer la journalisation mutualisée

Vous pouvez configurer la journalisation mutualisée à l'aide de l'outil de ligne de commande gcloud ou de Google Cloud Console.

gcloud

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

  1. Définissez les variables :

    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. Créez un espace de noms dans votre cluster mutualisé :

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Créez le bucket de journaux dans le projet locataire :

    gcloud logging buckets create gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global \
        --description="Log bucket for $TENANT_NAMESPACE namespace from $MAIN_PROJECT"
    

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

  4. 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/locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket \
        --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 liés à l'espace de noms $TENANT_NAMESPACE dans le bucket de journaux que vous avez créé à l'étape précédente.

    Vous aurez parfois besoin d'utiliser une commande --log-filter plus restrictive. Par exemple, si votre cluster et votre locataire ont le même espace de noms, vous pouvez ajouter un filtre de cluster.

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

  5. Importez le compte de service du récepteur dans le projet principal et attribuez-le à une variable. Vous aurez besoin de ce compte de service pour accorder des autorisations à l'étape suivante.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  6. Attribuez le rôle logging.bucketWriter au compte de service utilisé par le récepteur. Le projet principal a besoin de cette autorisation pour écrire dans le bucket du projet locataire.

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.bucketWriter' \
         --condition="expression=resource.name.endsWith(\"locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket\"),title=Log bucket writer for $TENANT_NAMESPACE,description=Grants logging.bucketWriter 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.

  7. Vous pouvez également créer une règle d'exclusion dans le bucket _Default. Cela empêche également l'écriture des journaux du locataire dans le bucket principal. Si vous omettez cette commande, vous obtiendrez des journaux en double dans le bucket _Default du projet principal et dans le bucket locataire.

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion rule 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 un bucket de journaux dans le projet locataire :

    1. Accédez au menu Stockage des journaux :

      Accéder à la page "Stockage des journaux"

    2. Cliquez sur la liste déroulante du projet en haut de la page, puis sélectionnez le projet locataire.

    3. Cliquez sur Créer un bucket de journaux.

    4. Saisissez un Nom et une Description pour votre bucket.

    5. Dans la liste déroulante Sélectionner la région du bucket de journaux, sélectionnez une région.

    6. Cliquez sur Create bucket (Créer un bucket). Votre nouveau bucket s'affiche dans la liste Bucket de journaux.

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

    1. Cliquez sur la liste déroulante du projet en haut de la page, puis sélectionnez le projet GKE principal.
    2. Dans le menu de gauche, sélectionnez Routeur de journaux. Vous êtes redirigé vers la page du routeur de journaux.
    3. Cliquez sur Créer un récepteur. La fenêtre Sélectionner un récepteur s'affiche.
    4. Dans la fenêtre Select sink (Sélectionner un récepteur), sélectionnez Bucket Cloud Logging.
    5. Saisissez un nom et une description pour votre récepteur, puis cliquez sur Suivant.
    6. Dans le menu déroulant Sélectionner le service de récepteur, sélectionnez Autre projet.
    7. Dans le champ Destination du récepteur, ajoutez la destination suivante : logging.googleapis.com/projects/MAIN_PROJECT_ID/locations/LOG_BUCKET_REGION/buckets/BUCKET_NAME

      Remplacez l'élément suivant :

      • MAIN_PROJECT_ID : ID de votre projet principal.
      • LOG_BUCKET_REGION : région dans laquelle vous avez créé votre bucket de journaux.
      • BUCKET_NAME : nom du bucket de journaux que vous avez créé dans la section précédente.
    8. Cliquez sur Next (Suivant).

    9. 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 aurez parfois besoin d'utiliser un filtre d'inclusion plus restrictif. Par exemple, si votre cluster et votre locataire ont le même espace de noms, vous pouvez ajouter un filtre de cluster.

    10. Cliquez sur Créer un récepteur. Votre nouveau récepteur s'affiche dans la liste Récepteurs de routage des journaux.

  3. Importez le compte de service du récepteur dans le projet principal. Vous aurez besoin de ce compte de service pour accorder des autorisations à l'étape suivante.

    1. Sur la page "Routeur de journaux", localisez le récepteur de journaux du projet principal.
    2. À côté de ce récepteur, cliquez sur Plus, puis sélectionnez Afficher les détails du récepteur.
    3. Copiez la valeur affichée à côté de Identité du rédacteur : serviceAccount :.
  4. Attribuez le rôle Rédacteur de bucket de journaux au compte de service utilisé par le récepteur du locataire. Le projet principal a besoin de cette autorisation pour écrire dans le bucket du projet locataire.

    1. Dans Cloud Console, accédez à la page IAM.

      Accéder à IAM

    2. Cliquez sur Ajouter.

    3. Dans le champ Nouveaux membres, ajoutez le compte de service du récepteur.

    4. Dans la liste déroulante Sélectionner un rôle, sélectionnez Logging et choisissez Rédacteur de bucket de journaux.

    5. Cliquez sur Enregistrer.

  5. Vous pouvez également créer une règle d'exclusion dans le bucket _Default. Cela empêche également l'écriture des journaux du locataire dans le bucket principal. Si vous omettez cette commande, vous obtiendrez des journaux en double dans le bucket _Default du projet principal et dans le bucket locataire.

    1. Dans Cloud Console, accédez à la page 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 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. À partir du projet locataire, accédez à la page Visionneuse de journaux dans Cloud Console.

    Accéder à la visionneuse de journaux

  2. Cliquez sur Affiner le champ d'application.

  3. Sélectionnez Recherche par espace de stockage et sélectionnez le bucket du locataire :

    gke-TENANT_NAMESPACE-log-bucket
    

Nettoyer

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

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. Si vous avez créé une règle d'exclusion dans le projet principal, supprimez-la :

    gcloud logging sinks update _Default \
       --project=$MAIN_PROJECT \
       --remove-exclusions=gke-$TENANT_NAMESPACE-default-exclusion
    
  3. Supprimez le rôle bucketWriter du compte de service :

    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.bucketWriter' \
        --all
    
  4. Supprimez le récepteur de journaux :

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  5. Supprimez le bucket de journaux :

    gcloud logging buckets delete gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global
    
  6. Supprimez l'espace de noms :

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Si vous avez créé une règle d'exclusion dans le projet principal, supprimez-la :

    1. Dans Cloud Console, accédez à la page Routeur de journaux.

      Accéder au routeur de journaux

    2. À côté du bucket _Default, cliquez sur Plus 

    3. Sélectionnez Modifier le récepteur.

    4. Cliquez sur Supprimer à côté de la règle d'exclusion que vous avez créée.

    5. Cliquez sur Mettre à jour le récepteur.

  2. Dans le projet principal, supprimez le compte de service :

    1. Dans Cloud Console, accédez à la page IAM.

      Accéder à IAM

    2. Sélectionnez le compte de service du récepteur.

    3. Cliquez sur Supprimer.

    4. Dans la fenêtre de confirmation, cliquez sur Confirmer.

  3. Dans le projet locataire, supprimez le récepteur de journaux :

    1. Cliquez sur la liste déroulante du projet en haut de la page, puis sélectionnez le projet GKE locataire.
    2. Dans le menu "Journalisation", sélectionnez 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.

  4. Dans le projet principal, supprimez le bucket de journaux :

    1. Cliquez sur la liste déroulante du projet en haut de la page, puis sélectionnez le projet GKE principal.
    2. Dans le menu "Journalisation", sélectionnez Stockage des journaux.

      Accéder à la page "Stockage des journaux"

    3. Cliquez sur l'élément Plus  correspondant au bucket que vous souhaitez supprimer.

    4. Cliquez sur Supprimer le bucket.

    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 effectuant une demande d'assistance.
  • Il existe une limite stricte de 50 règles d'exclusion par bucket de journaux. Si vous prévoyez plus de 50 locataires, révisez l'approche de la règle d'exclusion pour le bucket _Default. Vous pouvez également :

    • Créer une règle d'exclusion unique qui filtre tous les espaces de noms non système ou non 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 rule 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\""
      
    • Dupliquer les journaux entre le projet locataire et le projet principal en ne créant aucune règle d'exclusion.

Étape suivante