Configurare il logging multi-tenant


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

È comune che più team condividano un singolo cluster GKE. La condivisione di un cluster offre diversi vantaggi, tra cui una più facile individuazione dei servizi, una sicurezza semplificata e un numero inferiore di cluster da gestire per gli amministratori. Tuttavia, i singoli team di sviluppo di applicazioni spesso hanno un progetto separato. Questa struttura, con un cluster GKE principale, ma spazi dei nomi separati per ogni team di applicazioni, è chiamata multi-tenancy. Il progetto del team dell'applicazione è 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. Il router dei log ti consente di controllare il flusso dei log all'interno del tuo Google Cloud progetto e il modo in cui vengono indirizzati alle destinazioni supportate.

Per creare log specifici per il tenant, l'amministratore del cluster crea un sink per indirizzare le voci di log al progetto di ogni tenant. In ogni progetto tenant, i singoli team possono controllare come vengono archiviati e utilizzati i log, ad esempio monitorandoli configurando metriche basate sui log e avvisi basati sui log.

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

Prerequisiti

Configura il logging multi-tenant

Puoi configurare la registrazione multitenant utilizzando Google Cloud CLI o la consoleGoogle 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 progetto del tuo progetto principale
    • TENANT_PROJECT_ID: l'ID progetto per il progetto tenant
  2. Crea uno spazio dei nomi nel 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 correlati allo spazio dei nomi $TENANT_NAMESPACE al progetto tenant.

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

    Per saperne di più su questi campi, consulta la documentazione dell'API gcloud logging sinks create.

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

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. Concedi il ruolo Scrittore log (logging.bucketWriter) al account di servizio utilizzato dal sink. Il seguente comando concede al progetto principale le autorizzazioni per scrivere 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 saperne di più su questi campi, consulta la documentazione dell'API gcloud projects add-iam-policy-binding.

  6. (Facoltativo) Crea un filtro di esclusione per il sink che indirizza i log al bucket _Default del progetto principale. Se non crei un filtro di esclusione nel bucket _Default, i log instradati vengono visualizzati sia nel bucket _Default del progetto principale sia nel bucket dei log del 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 saperne di più su questi campi, consulta la documentazione dell'API gcloud logging sinks update.

Console

Per implementare il logging multi-tenant per GKE, completa i 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 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. Nella pagina Router dei log, fai clic su Crea sink.
    4. Inserisci un nome e una descrizione per il sink, quindi fai clic su Avanti.
    5. Nel menu Seleziona il servizio sink, seleziona 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 del tuo 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 dello spazio dei nomi del progetto tenant.

      Potresti volere un filtro di inclusione più restrittivo. Ad esempio, se il cluster e il 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 nell'elenco Sink del router dei log.

  2. Copia l'identità del writer del sink negli appunti:

    1. Nella pagina Router dei log, individua il sink di log.
    2. Per il sink, fai clic su Altro e poi seleziona Visualizza dettagli sink.
    3. Nel riquadro Dettagli sink, individua il campo Identità writer e copia il valore negli appunti. Ometti serviceAccount: dal valore copiato.
  3. Nel progetto tenant, concedi il ruolo Scrittore log (roles/logging.logWriter) all'account di servizio utilizzato dal sink del progetto principale. Il progetto principale ha bisogno di questa autorizzazione per scrivere i log nel 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 amministrazione.

    2. Fai clic su Concedi accesso.
    3. Nel campo Nuove entità, aggiungi il account di servizio del sink.
    4. Dal menu a discesa Seleziona un ruolo, seleziona Logging e scegli Scrittore log.
    5. Fai clic su Salva.
  4. (Facoltativo) Crea un filtro di esclusione nel bucket _Default del progetto principale per impedire che i log instradati a un progetto tenant vengano scritti nel bucket di log _Default del progetto principale:

    1. 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.

    2. Accanto al bucket _Default, fai clic su Altro e seleziona Modifica sink.
    3. Nella sezione Scegli i log da escludere 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 workload che utilizzano TENANT_NAMESPACE, puoi verificare che il progetto tenant riceva log specifici del tenant:

  1. Seleziona il progetto tenant utilizzando il selettore di progetti della console Google Cloud .
  2. Nella Google Cloud console, 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 la seguente query:

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    Nel riquadro Risultati delle query, dovresti visualizzare i log specifici del tenant instradati dal progetto principale.

Utilizzare i log del tenant

Nei progetti tenant, ogni team può controllare il modo in cui i log vengono instradati, archiviati e analizzati. Una volta instradati ai progetti tenant, i singoli team di applicazioni possono scegliere di instradare i propri log a destinazioni supportate come bucket Logging o a destinazioni di terze parti utilizzando Pub/Sub. Per informazioni sul routing delle voci di log, consulta Eseguire il routing dei log verso le destinazioni supportate.

I singoli team di applicazioni possono anche configurare avvisi in base ai contenuti dei log o alle metriche derivate dai log. Per saperne di più, consulta Monitorare i log.

Esegui la pulizia

Puoi rimuovere gli oggetti che hai creato per la registrazione multitenant utilizzando gcloud o la console Google Cloud .

gcloud

Per rimuovere gli oggetti che hai creato per la registrazione multitenant, completa i 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 progetto del tuo progetto principale
    • TENANT-PROJECT-ID: l'ID progetto per il progetto tenant
  2. Rimuovi il ruolo Scrittore log (roles/logging.logWriter) dall'account di servizio nel progetto tenant:

    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 tenant, rimuovi il ruolo Scrittore log (roles/logging.logWriter) dal 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 il 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 log e fai clic 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 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. Per il lavello che vuoi eliminare, fai clic su Altro.
    4. Seleziona Elimina lavello.
    5. Nel riquadro di conferma, fai clic su Elimina.

Limitazioni

La registrazione multitenant presenta le seguenti limitazioni:

  • La quota per il numero di sink di log per progetto è 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 bucket di log. Se intendi avere più di 50 tenant, l'approccio di filtro di esclusione per il bucket _Default deve essere rivisto. In alternativa, puoi procedere nel seguente modo:

    • Crea un singolo filtro di esclusione che escluda tutti gli spazi dei nomi non di sistema o non predefiniti utilizzando 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 non creando il filtro di esclusione.

Passaggi successivi