Configura il logging multi-tenant


Questa pagina spiega come configurare il logging multi-tenant per di Google Kubernetes Engine (GKE).

È normale che più team condividano un singolo cluster GKE. La condivisione di un cluster offre diversi vantaggi, tra cui un servizio più semplice l'individuazione delle risorse, la sicurezza semplificata meno cluster da mantenere. I singoli team che si occupano delle applicazioni spesso hanno progetto separato. Questa struttura, che ha un cluster GKE principale, ma spazi dei nomi distinti per ogni team di applicazioni, è chiamata multitenancy. Il progetto del team di applicazioni è chiamato tenant.

Con Google Cloud, gli amministratori dei cluster GKE possono creare un sistema in cui i log del cluster rimangono nel progetto GKE principale e i log dei tenant vengono distribuiti ai progetti tenant. Per configurare i log in questo modo, utilizza il router dei log. La Il router dei log ti consente di controllare il flusso dei log all'interno del tuo progetto Google Cloud e come i log vengono instradati alle destinazioni supportate.

Per creare log specifici per il tenant, l'amministratore del cluster crea un'istanza sink per instradare le voci di log al progetto di ciascun tenant. Nella per ogni progetto tenant, i singoli team possono controllare la modalità di archiviazione dei log e in uso, ad esempio il monitoraggio dei log configurando metriche basate su log e e avvisi basati su log.

Consigliamo di includere un filtro di esclusione nei sink _Default dei progetti GKE principali. Il filtro di esclusione impedisce l'importazione dei log del tenant sia nel progetto GKE principale sia nel progetto del tenant.

Prerequisiti

Configurare il logging multi-tenant

Puoi configurare la registrazione multi-tenant utilizzando Google Cloud CLI o la console Google Cloud.

gcloud

Per configurare il logging multi-tenant per i cluster GKE, completa i seguenti passaggi:

  1. Imposta le seguenti variabili di ambiente:

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

    Sostituisci quanto segue:

    • TENANT_NAMESPACE: il nome dello spazio dei nomi del progetto tenant
    • MAIN_PROJECT_ID: l'ID del progetto principale
    • TENANT_PROJECT_ID: l'ID del progetto tenant
  2. Crea uno spazio dei nomi nel tuo cluster multi-tenant:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Crea un sink di log nel progetto GKE principale:

    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"
    

    Questo comando crea un sink di log che invia tutti i log relativi allo spazio dei nomi $TENANT_NAMESPACE al progetto tenant.

    Potresti dover utilizzare un criterio --log-filter più restrittivo. Ad esempio, se cluster e tenant hanno lo stesso spazio dei nomi, quindi aggiungi un filtro del cluster.

    Per ulteriori informazioni su questi campi, consulta la documentazione dell'API gcloud logging sinks create.

  4. Recupera l'identità writer dal sink del progetto principale e assegnala in una variabile di ambiente.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. Concedi l'autorizzazione Writer log (logging.bucketWriter) all'account di servizio usato dal sink. Il comando seguente concede le autorizzazioni principali del progetto per scrivere i log nel progetto tenant:

     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"
    

    Per ulteriori informazioni su questi campi, consulta Documentazione dell'API gcloud projects add-iam-policy-binding.

  6. Facoltativamente, crea un filtro di esclusione per il sink a cui instrada i log il bucket _Default del progetto principale. Se non crei un'esclusione sul bucket _Default, i log con routing verranno visualizzati sia _Default bucket del progetto principale e del bucket di log tenant. Per creare un filtro di esclusione:

    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\""
    

    Per ulteriori informazioni su questi campi, consulta Documentazione dell'API gcloud logging sinks update.

Console

Per implementare il logging multi-tenant per GKE, completa la seguenti passaggi:

  1. Crea il sink di log nel progetto principale:

    1. Utilizza il selettore di progetti della console Google Cloud per selezionare il progetto GKE principale.
    2. Nella console Google Cloud, vai alla pagina Log Router:

      Vai a Router dei log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

    3. Nella pagina Router dei log, fai clic su Crea sink.
    4. Inserisci un nome e una descrizione per il sink e poi fai clic su Avanti.
    5. Nel menu Seleziona servizio sink, scegli Altro progetto.
    6. Nel campo Destinazione sink, aggiungi la seguente destinazione:

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      Sostituisci TENANT_PROJECT_ID con l'ID progetto di del progetto tenant.

    7. Fai clic su Avanti.

    8. In Crea filtro di inclusione, aggiungi il seguente filtro:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      Sostituisci TENANT_NAMESPACE con il nome del tenant nello spazio dei nomi del progetto.

      Potresti voler utilizzare un filtro di inclusione più restrittivo. Ad esempio, se il tuo cluster e il tuo tenant hanno lo stesso spazio dei nomi, valuta la possibilità di aggiungere una clausola per includere solo le voci di log per un cluster specifico.

    9. Fai clic su Crea sink. Il nuovo sink viene visualizzato nella Sink del router dei log.

  2. Copia l'identità dello scrittore della destinazione negli appunti:

    1. Nella pagina Router dei log, individua il sink dei log.
    2. Per quel lavello, fai clic su Altro, quindi seleziona Visualizza dettagli sink.
    3. Nel riquadro Dettagli della destinazione, individua il campo Identità autore, quindi copia il valore nella clipboard. Ometti serviceAccount: dal valore copiato.
  3. Nel progetto tenant, concedi il writer di log (roles/logging.logWriter) all'account di servizio utilizzato dall'istanza principale nel sink del progetto. Il progetto principale richiede questa autorizzazione per scrivere i log in del progetto tenant.

    1. Nella console Google Cloud, vai alla pagina IAM:

      Vai a IAM

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo IAM e Console di amministrazione.

    2. Fai clic su Concedi accesso.
    3. Nel campo Nuove entità, aggiungi l'account di servizio della destinazione.
    4. Dall'elenco a discesa Seleziona un ruolo, seleziona Logging e scegli Scrittore di log.
    5. Fai clic su Salva.
  4. Se vuoi, crea un filtro di esclusione nel bucket _Default della rete principale per impedire che i log instradati a un progetto tenant vengano scritto nel bucket di log _Default nel progetto principale:

    1. Nella console Google Cloud, vai alla pagina Log Router:

      Vai a Router dei log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

    2. Accanto al bucket _Default, fai clic su Altro e seleziona Modifica sink.
    3. Nella sezione Scegli i log da filtrare dal sink, fai clic su Aggiungi esclusione.
    4. Aggiungi un nome per il filtro.
    5. Nella casella Crea un filtro di esclusione, aggiungi quanto segue:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. Fai clic su Aggiorna sink.

Verifica i log del tenant

Dopo aver iniziato a utilizzare i carichi di lavoro che usano TENANT_NAMESPACE, puoi verificare che il progetto tenant riceva i log specifici per il tenant:

  1. Seleziona il progetto tenant utilizzando il selettore di progetti della console Google Cloud.
  2. Nella console Google Cloud, vai alla pagina Esplora log:

    Vai a Esplora log

    Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

  3. Nel campo dell'editor di query, esegui questa query:

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    Nel riquadro Risultati delle query dovresti vedere i log specifici del tenant che sono indirizzate dal progetto principale.

Usa log tenant

Nei progetti tenant, ogni team può controllare il routing, l'archiviazione e analizzato. Dopo che i log sono stati inoltrati ai progetti del tenant, i singoli team di applicazioni possono scegliere di inoltrarli a destinazioni supportate come i bucket di log o a destinazioni di terze parti utilizzando Pub/Sub. Per informazioni sulle voci di log di routing, consulta Esegui il routing dei log alle destinazioni supportate.

I singoli team di applicazioni possono anche configurare avvisi in base ai contenuti dei log o alle metriche ricavate dai log. Per ulteriori informazioni, consulta Monitorare i log.

Esegui la pulizia

Puoi rimuovere gli oggetti creati per la registrazione multi-tenant utilizzando gcloud o la console Google Cloud.

gcloud

Per rimuovere gli oggetti creati per il logging multi-tenant, completa la seguenti passaggi:

  1. Imposta le variabili per semplificare i seguenti comandi:

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

    Sostituisci quanto segue:

    • TENANT_NAMESPACE: il nome dello spazio dei nomi del progetto tenant
    • MAIN-PROJECT-ID: l'ID del progetto principale
    • TENANT-PROJECT-ID: l'ID del progetto tenant
  2. Rimuovi il writer di log (roles/logging.logWriter) dell'account di servizio nel tenant progetto:

    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. Elimina il sink di log:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. Elimina lo spazio dei nomi:

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Nel progetto del tenant, rimuovi il ruolo Scrittore di log (roles/logging.logWriter) dall'account di servizio:

    1. Nella console Google Cloud, vai alla pagina IAM:

      Vai a IAM

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo IAM e amministrazione.

    2. Per l'account di servizio che vuoi eliminare, fai clic su Modifica entità.
    3. Nel riquadro Modifica accesso, fai clic su Elimina ruolo accanto al ruolo Scrittore di log e poi su Salva.
  2. Nel progetto principale, elimina il sink di log:

    1. Utilizza il selettore di progetti della console Google Cloud per selezionare il progetto GKE del tenant.
    2. Nella console Google Cloud, vai alla pagina Router dei log:

      Vai a Router dei log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

    3. In corrispondenza della cassetta di scarico che vuoi eliminare, fai clic su Altro.
    4. Seleziona Elimina destinazione.
    5. Nel riquadro di conferma, fai clic su Elimina.

Limitazioni

Il logging multi-tenant presenta le seguenti limitazioni:

  • La quota per il numero di destinazioni dei log per progetto è di 200. Se hai bisogno di più di 200 tenant, richiedi un aumento della quota aprendo una richiesta di assistenza.
  • Esiste un limite di 50 filtri di esclusione per separazione log. Se intendi avere più di 50 tenant, l'approccio al filtro di esclusione per il bucket _Default deve essere rivisti. In alternativa, puoi procedere nel seguente modo:

    • Crea un singolo filtro di esclusione che escluda tutti gli elementi non di sistema o con questo comando:

      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\""
      
    • Duplica i log tra il progetto tenant e il progetto principale in base a non sta creando il filtro di esclusione.

Passaggi successivi