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 l'individuazione più semplice dei servizi, la sicurezza semplificata. Inoltre, gli amministratori del cluster hanno meno cluster da gestire. Tuttavia, i singoli team delle applicazioni hanno spesso il proprio progetto separato. Questa struttura, che ha un cluster GKE principale, ma spazi dei nomi distinti per ogni team dell'applicazione, è chiamata multitenancy. Il progetto del team dell'applicazione è denominato 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 del 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 progetto Google Cloud e il routing dei log verso destinazioni supportate.
Per creare log specifici per il tenant, l'amministratore del cluster crea un sink per instradare le voci di log al progetto di ogni tenant. In ogni progetto tenant, i singoli team possono controllare il modo in cui i log vengono archiviati e utilizzati, ad esempio monitorandoli configurando metriche basate su log e avvisi basati su log.
È consigliabile che i sink _Default
nei progetti GKE principali includano un filtro di esclusione. Il filtro di esclusione impedisce l'importazione dei log del tenant sia nel progetto GKE principale sia nel progetto tenant.
Prerequisiti
- Acquisisci familiarità con i seguenti documenti su multitenancy e routing:
- Assicurati di avere un progetto tenant e un progetto principale esistenti.
Configura il logging multi-tenant
Puoi configurare il logging multi-tenant utilizzando Google Cloud CLI o la console Google Cloud.
gcloud
Per configurare il logging multi-tenant per i cluster GKE, completa questi passaggi:
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 tenantMAIN_PROJECT_ID
: l'ID del progetto principaleTENANT_PROJECT_ID
: l'ID per il progetto tenant
Crea uno spazio dei nomi nel tuo cluster multi-tenant:
kubectl create namespace $TENANT_NAMESPACE
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
--log-filter
più restrittivo. Ad esempio, se il cluster e il tenant hanno lo stesso spazio dei nomi, aggiungi un filtro per il cluster.Per ulteriori informazioni su questi campi, consulta la documentazione dell'API
gcloud logging sinks create
.Recupera l'identità autore 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)')
Concedi il ruolo Writer log (
logging.bucketWriter
) all'account di servizio utilizzato dal sink. Il comando seguente concede le autorizzazioni principali al 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 la documentazione dell'API
gcloud projects add-iam-policy-binding
.Se vuoi, 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 con routing vengono visualizzati sia nel bucket_Default
del progetto principale sia nel 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 la documentazione dell'API
gcloud logging sinks update
.
Console
Per implementare il logging multi-tenant per GKE, completa questi passaggi:
Crea il sink di log nel progetto principale:
- Utilizza il selettore progetti della console Google Cloud per selezionare il progetto GKE principale.
-
Nella console Google Cloud, vai alla pagina Router dei log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è Logging.
- Nella pagina Router dei log, fai clic su Crea sink.
- Inserisci un nome e una descrizione per il sink, quindi fai clic su Avanti.
- Nel menu Seleziona servizio sink, scegli Altro progetto.
Nel campo Destinazione sink, aggiungi la seguente destinazione:
logging.googleapis.com/projects/TENANT_PROJECT_ID
Sostituisci
TENANT_PROJECT_ID
con l'ID del progetto tenant.Tocca Avanti.
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.
Fai clic su Crea sink. Il nuovo sink viene visualizzato nell'elenco Sink del router dei log.
Copia l'identità dell'autore del sink negli appunti:
- Nella pagina Router dei log, individua il sink di log.
- Per il sink, fai clic su Altro, quindi seleziona Visualizza dettagli sink.
- Nel riquadro Dettagli sink, individua il campo Identità autore, quindi copia il valore negli appunti. Ometti
serviceAccount:
dal valore copiato.
Nel progetto tenant, concedi il ruolo Writer log (
roles/logging.logWriter
) all'account di servizio utilizzato dal sink del progetto principale. Il progetto principale ha bisogno di questa autorizzazione per scrivere log nel progetto tenant.-
Nella console Google Cloud, vai alla pagina IAM:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è IAM e amministrazione.
- Fai clic su Concedi accesso.
- Nel campo Nuove entità, aggiungi l'account di servizio del sink.
- Nel menu a discesa Seleziona un ruolo, seleziona Logging e scegli Writer log.
- Fai clic su Salva.
-
Facoltativamente, 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
nel progetto principale:-
Nella console Google Cloud, vai alla pagina Router dei log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è Logging.
- Accanto al bucket
_Default
, fai clic su Altro e seleziona Modifica sink. - Nella sezione Scegli i log da escludere dal sink, fai clic su Aggiungi esclusione.
- Aggiungi un nome per il filtro.
Nella casella Crea un filtro di esclusione, aggiungi quanto segue:
resource.labels.namespace_name="TENANT_NAMESPACE"
Fai clic su Aggiorna sink.
-
Verifica i log del tenant
Dopo aver iniziato a utilizzare carichi di lavoro che utilizzano TENANT_NAMESPACE, puoi verificare che il progetto tenant riceva log specifici per il tenant:
- Seleziona il progetto tenant utilizzando il selettore progetti della console Google Cloud.
-
Nella console Google Cloud, vai alla pagina Esplora log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è Logging.
Nel campo query-editor, esegui la query seguente:
resource.labels.namespace_name="TENANT_NAMESPACE"
Nel riquadro Risultati delle query dovresti vedere i log specifici del tenant che sono stati instradati dal progetto principale.
Usa log tenant
Nei progetti tenant, ogni team può controllare il modo in cui i log vengono instradati, archiviati e analizzati. Dopo che i log sono stati instradati ai progetti tenant, i singoli team delle applicazioni possono scegliere di instradare i log a destinazioni supportate come i bucket Logging o a destinazioni di terze parti utilizzando Pub/Sub. Per informazioni sul routing delle voci di log, consulta Instradare i log alle destinazioni supportate.
I singoli team delle applicazioni possono anche configurare avvisi in base ai contenuti dei log o alle metriche derivate dai log. Per maggiori informazioni, consulta Monitorare i log.
Esegui la pulizia
Puoi rimuovere gli oggetti creati per il logging multi-tenant utilizzando gcloud
o la console Google Cloud.
gcloud
Per rimuovere gli oggetti creati per il logging multi-tenant, completa i seguenti passaggi:
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 tenantMAIN-PROJECT-ID
: l'ID del progetto principaleTENANT-PROJECT-ID
: l'ID per il progetto tenant
Rimuovi il ruolo Writer 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
Elimina il sink di log:
gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \ --project=$MAIN_PROJECT
Elimina lo spazio dei nomi:
kubectl delete namespace $TENANT_NAMESPACE
Console
Nel progetto tenant, rimuovi il ruolo Writer log (
roles/logging.logWriter
) dall'account di servizio:-
Nella console Google Cloud, vai alla pagina IAM:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è IAM e amministrazione.
- In corrispondenza dell'account di servizio che vuoi eliminare, fai clic su edit Modifica entità.
- Nel riquadro Accesso in modifica, fai clic su Elimina ruolo accanto al ruolo Writer log e fai clic su Salva.
-
Nel progetto principale, elimina il sink di log:
- Utilizza il selettore progetti della console Google Cloud per selezionare il progetto GKE tenant.
-
Nella console Google Cloud, vai alla pagina Router dei log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato il cui sottotitolo è Logging.
- Fai clic su more_vert Altro in corrispondenza del sink da eliminare.
- Seleziona Elimina sink.
- Nel riquadro di conferma, fai clic su Elimina.
Limitazioni
Il logging multi-tenant presenta le seguenti limitazioni:
- La quota del 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 del filtro di esclusione per il bucket
_Default
deve essere rivisto. In alternativa, puoi: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\""
Log duplicati tra il progetto tenant e il progetto principale non creando il filtro di esclusione.
Passaggi successivi
- Scopri di più sulle Best practice per la multitenancy aziendale su GKE.