Questa pagina illustra la multi-tenancy dei cluster in Google Kubernetes Engine (GKE). Sono inclusi i cluster condivisi da utenti diversi all'interno di una singola organizzazione e i cluster condivisi da istanze per cliente di un'applicazione software as a service (SaaS). La multi-tenancy dei cluster è un'alternativa alla gestione di molti cluster single-tenant.
Questa pagina riassume anche le funzionalità di Kubernetes e GKE che possono essere utilizzate per gestire i cluster multi-tenant.
Che cos'è la multi-tenancy?
Un cluster multi-tenant è condiviso da più utenti e/o carichi di lavoro, denominati "tenant". Gli operatori dei cluster multi-tenant devono isolare i tenant l'uno dall'altro per ridurre al minimo i danni che un tenant compromesso o dannoso può causare al cluster e ad altri tenant. Inoltre, le risorse del cluster devono essere allocate equamente tra i tenant.
Quando pianifichi un'architettura multi-tenant, devi considerare i livelli di isolamento delle risorse in Kubernetes: cluster, spazio dei nomi, nodo, pod e container. Devi anche considerare le implicazioni di sicurezza della condivisione di diversi tipi di risorse tra i tenant. Ad esempio, la pianificazione dei pod di tenant diversi sullo stesso nodo potrebbe ridurre il numero di macchine necessarie nel cluster. D'altra parte, potresti dover impedire la collocazione di determinati carichi di lavoro. Ad esempio, potresti non consentire l'esecuzione di codice non attendibile al di fuori della tua organizzazione sullo stesso nodo dei container che elaborano informazioni sensibili.
Sebbene Kubernetes non possa garantire un isolamento perfettamente sicuro tra i tenant, offre funzionalità che potrebbero essere sufficienti per casi d'uso specifici. Puoi separare ogni tenant e le relative risorse Kubernetes nei propri spazi dei nomi. Puoi quindi utilizzare le policy per applicare l'isolamento dei tenant. Le policy sono in genere limitate allo spazio dei nomi e possono essere utilizzate per limitare l'accesso alle API, vincolare l'utilizzo delle risorse e limitare le operazioni consentite ai container.
I tenant di un cluster multi-tenant condividono:
- Estensioni, controller, componenti aggiuntivi e definizioni di risorse personalizzate (CRD).
- Il control plane del cluster. Ciò implica che le operazioni, la sicurezza e l'audit del cluster sono centralizzati.
L'utilizzo di un cluster multi-tenant presenta diversi vantaggi rispetto all'utilizzo di più cluster single-tenant:
- Riduzione dell'overhead di gestione
- Riduzione della frammentazione delle risorse
- Non è necessario attendere la creazione del cluster per i nuovi tenant
Casi d'uso della multi-tenancy
Questa sezione descrive come configurare un cluster per vari casi d'uso della multi-tenancy.
Multi-tenancy aziendale
In un ambiente aziendale, i tenant di un cluster sono team distinti all'interno dell'organizzazione. In genere, ogni tenant ha uno spazio dei nomi corrispondente. I modelli alternativi di multi-tenancy con un tenant per cluster o un tenant per Google Cloud progetto sono più difficili da gestire. Il traffico di rete all'interno di uno spazio dei nomi non è limitato. Il traffico di rete tra gli spazi dei nomi deve essere consentito esplicitamente. Queste policy possono essere applicate utilizzando la policy di rete di Kubernetes.
Gli utenti del cluster sono suddivisi in tre ruoli diversi, a seconda dei loro privilegi:
- Amministratore cluster
- Questo ruolo è destinato agli amministratori dell'intero cluster, che gestiscono tutti i tenant. Gli amministratori cluster possono creare, leggere, aggiornare ed eliminare qualsiasi oggetto policy. Possono creare spazi dei nomi e assegnarli agli amministratori degli spazi dei nomi.
- Amministratore dello spazio dei nomi
- Questo ruolo è destinato agli amministratori di tenant singoli e specifici. Un amministratore dello spazio dei nomi può gestire gli utenti nel proprio spazio dei nomi.
- Sviluppatore
- I membri di questo ruolo possono creare, leggere, aggiornare ed eliminare oggetti non policy con ambito spazio dei nomi, come pod, job e ingress. Gli sviluppatori hanno questi privilegi solo negli spazi dei nomi a cui hanno accesso.
Per informazioni sulla configurazione di più cluster multi-tenant per un' organizzazione aziendale, consulta Best practice per la multi- tenancy.
Multi-tenancy del fornitore SaaS
I tenant del cluster di un fornitore SaaS sono le istanze per cliente dell'applicazione e il piano di controllo del SaaS. Per sfruttare le policy con ambito spazio dei nomi, le istanze dell'applicazione devono essere organizzate nei propri spazi dei nomi, così come i componenti del piano di controllo del SaaS. Gli utenti finali non possono interagire direttamente con il piano di controllo di Kubernetes, ma utilizzano l'interfaccia del SaaS, che a sua volta interagisce con il piano di controllo di Kubernetes.
Ad esempio, una piattaforma di blogging potrebbe essere eseguita su un cluster multi-tenant. In questo caso, i tenant sono l'istanza del blog di ogni cliente e il piano di controllo della piattaforma. Il piano di controllo della piattaforma e ogni blog ospitato verrebbero eseguiti in spazi dei nomi separati. I clienti creerebbero ed eliminerebbero i blog, aggiornerebbero le versioni del software di blogging tramite l'interfaccia della piattaforma senza visibilità sul funzionamento del cluster.
Applicazione delle policy di multi-tenancy
GKE e Kubernetes forniscono diverse funzionalità che possono essere utilizzate per gestire i cluster multi-tenant. Le sezioni seguenti forniscono una panoramica di queste funzionalità.
Controllo degli accessi
GKE ha due sistemi di controllo dell'accesso: Identity and Access Management (IAM) e controllo dell'accesso basato sui ruoli (RBAC). IAM è il sistema di controllo dell'accesso per la gestione dell'autenticazione e dell'autorizzazione per Google Cloud risorse. Google CloudUtilizza IAM per concedere agli utenti l'accesso alle risorse GKE e Kubernetes. RBAC è integrato in Kubernetes e concede autorizzazioni granulari per risorse e operazioni specifiche all'interno dei cluster.
Per ulteriori informazioni su queste opzioni e su quando utilizzare ciascuna, consulta la panoramica del controllo degli accessi.
Consulta la guida illustrativa RBAC e la guida illustrativa IAM per scoprire come utilizzare questi sistemi di controllo dell'accesso.
Puoi utilizzare le autorizzazioni IAM e RBAC insieme agli spazi dei nomi per limitare le interazioni degli utenti con le risorse del cluster su Google Cloud console. Per ulteriori informazioni, consulta Abilitare l'accesso e visualizzare le risorse del cluster per spazio dei nomi.Criteri di rete
I criteri di rete del cluster ti consentono di controllare la comunicazione tra i pod del cluster. I criteri specificano gli spazi dei nomi, le etichette e gli intervalli di indirizzi IP con cui un pod può comunicare.
Per istruzioni sull'abilitazione dell'applicazione dei criteri di rete in GKE, consulta la guida pratica ai criteri di rete.
Segui il tutorial sui criteri di rete per scoprire come scrivere i criteri di rete.
Quote delle risorse
Le quote delle risorse gestiscono la quantità di risorse utilizzate dagli oggetti in uno spazio dei nomi. Puoi impostare le quote in termini di utilizzo di CPU e memoria utilizzata o in termini di conteggi degli oggetti. Le quote delle risorse ti consentono di assicurarti che nessun tenant utilizzi più della quota assegnata di risorse del cluster.
Per ulteriori informazioni, consulta la documentazione sulle quote delle risorse.
Controllo di ammissione dei pod basato su policy
Per impedire l'esecuzione nel cluster di pod che violano i limiti di sicurezza, utilizza un controller di ammissione. I controller di ammissione possono controllare le specifiche dei pod rispetto alle policy che definisci e possono impedire l'esecuzione nel cluster dei pod che violano queste policy.
GKE supporta i seguenti tipi di controllo di ammissione:
- Policy Controller: dichiara policy predefinite o personalizzate e applicale nei cluster su larga scala utilizzando i parchi risorse. Policy Controller è un'implementazione dell'agente di policy open source Gatekeeper open policy agent ed è una funzionalità di GKE Enterprise.
- Controller di ammissione PodSecurity: applica policy predefinite che corrispondono agli standard di sicurezza dei pod in singoli cluster o in spazi dei nomi specifici.
Anti-affinità dei pod
Puoi utilizzare l'anti-affinità
dei pod
per impedire la pianificazione dei pod di tenant diversi sullo stesso nodo.
I vincoli di anti-affinità si basano sulle etichette dei pod
.
Ad esempio, la specifica del pod riportata di seguito descrive un pod con l'etichetta "team":
"billing" e una regola di anti-affinità che impedisce la pianificazione del pod
insieme ai pod senza l'etichetta.
apiVersion: v1
kind: Pod
metadata:
name: bar
labels:
team: "billing"
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: "kubernetes.io/hostname"
labelSelector:
matchExpressions:
- key: "team"
operator: NotIn
values: ["billing"]
Lo svantaggio di questa tecnica è che gli utenti dannosi potrebbero aggirare la regola applicando l'etichetta team: billing a un pod arbitrario. L'anti-affinità dei pod da sola non può applicare in modo sicuro le policy sui cluster con tenant non attendibili.
Per ulteriori informazioni, consulta la documentazione sull'anti-affinità dei pod.
Nodi dedicati con incompatibilità e tolleranze
Le incompatibilità dei nodi sono un altro modo per controllare la pianificazione dei carichi di lavoro. Puoi utilizzare le incompatibilità dei nodi per riservare nodi specializzati all'utilizzo da parte di determinati tenant. Ad esempio, puoi dedicare i nodi dotati di GPU ai tenant specifici i cui carichi di lavoro richiedono GPU. Per i cluster Autopilot, le tolleranze dei nodi sono supportate solo per la separazione dei carichi di lavoro. Le incompatibilità dei nodi vengono aggiunte automaticamente dal provisioning automatico dei nodi in base alle esigenze.
Per dedicare un node pool a un
determinato tenant, applica un'incompatibilità con effect: "NoSchedule" al pool di nodi. A questo punto, solo i pod con una tolleranza corrispondente possono essere pianificati sui nodi del node pool.
Lo svantaggio di questa tecnica è che gli utenti dannosi potrebbero aggiungere una tolleranza ai propri pod per accedere al pool di nodi dedicato. Le incompatibilità e le tolleranze dei nodi da sole non possono applicare in modo sicuro le policy sui cluster con tenant non attendibili.
Per ulteriori informazioni, consulta Incompatibilità e tolleranze nella documentazione di Kubernetes.
GKE Sandbox
GKE Sandbox fornisce un ulteriore livello di sicurezza per i cluster multi-tenant isolando i carichi di lavoro non attendibili dal kernel host sui nodi del cluster. GKE Sandbox utilizza gVisor, una tecnologia di sandboxing dei container open source, per fornire un kernel dello spazio utente separato per ogni pod.
GKE Sandbox è particolarmente utile per i fornitori SaaS o le organizzazioni che eseguono codice non attendibile, perché aiuta a impedire a un tenant dannoso di uscire dal container o di influire sul kernel host. Per ulteriori informazioni, consulta GKE Sandbox.
Condivisione di acceleratori come GPU e TPU
La condivisione degli acceleratori GPU o TPU tra i pod comporta un rischio aggiuntivo. Le GPU e le TPU potrebbero o meno fornire protezioni contro l'accesso condiviso. Queste protezioni possono dipendere dalla versione hardware, dalla versione del driver e dalla configurazione del sistema di runtime. La tabella seguente evidenzia diversi approcci e il rischio associato a ciascuno.
I pod che si fidano l'uno dell'altro possono decidere di accettare un'ampia gamma di rischi. La tabella indica il livello di rischio per ogni livello di isolamento.
| Architettura | Superficie di attacco principale | Riepilogo sulla sicurezza |
|---|---|---|
| I pod sullo stesso nodo condividono direttamente un acceleratore, inclusi il time-sharing della GPU e NVIDIA MPS. | Memoria GPU e stato globale | I pod sono vulnerabili l'uno all'altro e devono fidarsi l'uno dell'altro. |
| I pod sullo stesso nodo condividono direttamente un acceleratore e utilizzano GKE Sandbox, inclusi il time-sharing della GPU e NVIDIA MPS. | Memoria GPU e driver host | GKE Sandbox isola il kernel del carico di lavoro dal kernel host. Sebbene gVisor riduca la superficie di attacco della GPU esposta all'applicazione, non fornisce la separazione all'interno dell'ambiente GPU, che rimane condiviso. Per ulteriori informazioni, consulta: Supporto GPU - Sicurezza. |
| I pod sullo stesso nodo hanno acceleratori dedicati, inclusi NVIDIA MIG. | Kernel host (tramite driver) | I pod potrebbero comunque essere compromessi da vulnerabilità dell'acceleratore o del driver che consentono l'escalation al kernel host. |
| I pod sullo stesso nodo hanno acceleratori dedicati, inclusi NVIDIA MIG, e utilizzano GKE Sandbox. | Interfaccia driver host (nvproxy) | GKE Sandbox isola il kernel, ma l'interfaccia del driver GPU host (nvproxy) rimane una superficie di attacco condivisa. Un exploit del driver potrebbe consentire l'uscita dal kernel host. Sono possibili anche perdite di canale laterale tra le istanze MIG. |
| Ogni pod viene eseguito su un nodo dedicato, che dispone di acceleratori dedicati. | Limite VM / hypervisor | Opzione consigliata per i carichi di lavoro non attendibili. Qualsiasi compromissione è limitata a una VM. |
Passaggi successivi
- Scopri di più sulle best practice per la multi-tenancy aziendale.
- Scopri di più sulla gestione del parco risorse.
- Scopri come abilitare l'accesso e visualizzare le risorse del cluster per spazio dei nomi.
- Scopri come controllare la comunicazione tra pod e servizi utilizzando i criteri di rete.
- Scopri come configurare il logging multi-tenant.
- Scopri come configurare GKE Sandbox.