Questo documento descrive le best practice per la configurazione delle opzioni di networking per i cluster Google Kubernetes Engine (GKE). È pensata per essere una guida alla pianificazione dell'architettura per cloud architect e ingegneri di rete con consigli sulla configurazione dei cluster applicabili alla maggior parte dei cluster GKE. Prima di creare i cluster GKE, ti consigliamo di esaminare tutte le sezioni di questa pagina per comprendere le opzioni di networking supportate da GKE e le relative implicazioni.
Le opzioni di networking che scegli influiscono sull'architettura dei tuoi cluster GKE. Alcune di queste opzioni non possono essere modificate dopo la configurazione senza ricreare il cluster.
Prima di leggere questa pagina, assicurati di conoscere i concetti e la terminologia di rete di Kubernetes, alcuni concetti generali di rete e la rete Kubernetes. Per maggiori informazioni, consulta la panoramica della rete GKE.
Durante la revisione di queste best practice, tieni presente quanto segue:
- Il modo in cui prevedi di esporre internamente i carichi di lavoro alla tua rete Virtual Private Cloud (VPC), ad altri carichi di lavoro nel cluster, ad altri cluster GKE o esternamente a internet.
- Come prevedi di scalare i tuoi carichi di lavoro.
- Quali tipi di servizi Google vuoi utilizzare.
Per un elenco di controllo riepilogativo di tutte le best practice, consulta il Riepilogo dell'elenco di controllo.
Best practice per la progettazione di VPC
Quando progetti le tue reti VPC, segui le best practice per la progettazione di VPC.
La sezione seguente fornisce alcuni consigli specifici per GKE per la progettazione della rete VPC.
Utilizza cluster nativi di VPC
Ti consigliamo di utilizzare cluster VPC nativi. I cluster nativi di VPC utilizzano intervalli di indirizzi IP alias sui nodi GKE e sono necessari per i cluster basati sul peering di rete VPC, per i cluster su VPC condivisi e offrono molti altri vantaggi. Per i cluster creati in modalità Autopilot, la modalità VPC nativa è sempre attiva e non può essere disattivata.
I cluster nativi di VPC vengono scalati più facilmente rispetto ai cluster basati su route senza consumare Google Cloud route, quindi sono meno soggetti a raggiungere i limiti di routing.
I vantaggi dell'utilizzo di cluster VPC nativi vanno di pari passo con il supporto dell'IP alias. Ad esempio, i gruppi di endpoint di rete (NEG) possono essere utilizzati solo con indirizzi IP secondari, pertanto sono supportati solo nei cluster VPC nativi.
Utilizza reti VPC condivise
I cluster GKE richiedono un'attenta pianificazione dell'indirizzo IP. La maggior parte delle organizzazioni ha una struttura di gestione centralizzata con un team di amministrazione di rete che può allocare lo spazio degli indirizzi IP per i cluster e un amministratore della piattaforma per il funzionamento dei cluster. Questo tipo di struttura dell'organizzazione funziona bene con l'architettura di rete VPC condiviso di Google Cloud. Nell'architettura di rete VPC condiviso, un amministratore di rete può creare subnet e condividerle con i VPC. Puoi creare cluster GKE in un progetto di servizio e utilizzare le subnet condivise dal VPC condiviso nel progetto host. Il componente dell'indirizzo IP rimane nel progetto host, mentre gli altri componenti del cluster si trovano nel progetto di servizio.
In generale, una rete VPC condiviso è un'architettura utilizzata di frequente e adatta alla maggior parte delle organizzazioni con un team di gestione centralizzato. Ti consigliamo di utilizzare le reti VPC condiviso per creare le subnet per i tuoi cluster GKE ed evitare conflitti di indirizzi IP nella tua organizzazione. Potresti anche voler utilizzare i VPC condivisi per la governance delle funzioni operative. Ad esempio, puoi avere un team di rete che lavora solo su componenti e affidabilità di rete e un altro team che lavora su GKE.
Strategie di gestione degli indirizzi IP
Tutti i cluster Kubernetes, inclusi i cluster GKE, richiedono un indirizzo IP univoco per ogni pod. Per saperne di più, consulta il modello di networking GKE.
In GKE, tutti questi indirizzi IP sono instradabili in tutta la rete VPC. Pertanto, la pianificazione degli indirizzi IP è necessaria perché gli indirizzi non possono sovrapporsi allo spazio di indirizzi IP interni utilizzato on-premise o in altri ambienti connessi. Le sezioni seguenti suggeriscono strategie per la gestione degli indirizzi IP con GKE.
Best practice:
Pianifica l'assegnazione degli indirizzi IP necessari.Utilizza uno spazio non RFC 1918, se necessario.
Utilizza la modalità subnet personalizzata.
Pianifica la densità dei pod per nodo.
Evita sovrapposizioni con gli indirizzi IP utilizzati in altri ambienti.
Crea una subnet del bilanciatore del carico.
Riserva spazio di indirizzi IP sufficiente per il gestore della scalabilità automatica dei cluster.
Condividi indirizzi IP tra cluster.
Condividi gli indirizzi IP per i servizi LoadBalancer interni.
Pianifica l'assegnazione degli indirizzi IP necessari
Ti consigliamo di utilizzare cluster nativi del VPC con Private Service Connect (PSC). I cluster che utilizzano il peering di rete VPC devono essere cluster VPC nativi.
I cluster VPC nativi richiedono i seguenti intervalli di indirizzi IP:
- Intervallo di indirizzi IP del control plane: utilizza una subnet /28 all'interno degli intervalli privati di indirizzi IP inclusi nella RFC 1918. Devi assicurarti che questa subnet non si sovrapponga ad altri blocchi CIDR (Classless Inter-Domain Routing) nella rete VPC.
- Subnet del nodo: la subnet con l'intervallo di indirizzi IP primari che vuoi allocare per tutti i nodi del cluster. I servizi di tipo
LoadBalancerche utilizzano l'annotazionecloud.google.com/load-balancer-type: "Internal"utilizzano anche questa subnet per impostazione predefinita. Puoi anche utilizzare una subnet dedicata per i bilanciatori del carico interni. - Intervallo di indirizzi IP del pod: l'intervallo IP che allochi per tutti i pod nel tuo cluster. GKE esegue il provisioning di questo intervallo come alias della subnet. Per saperne di più, consulta Intervalli di indirizzi IP per i cluster VPC nativi.
- Intervallo di indirizzi IP del servizio: l'intervallo di indirizzi IP che allochi per tutti i servizi nel cluster. GKE esegue il provisioning di questo intervallo come alias della subnet.
Quando configuri la rete del cluster, devi definire una subnet dei nodi, un intervallo di indirizzi IP dei pod e un intervallo di indirizzi IP dei servizi.
Se vuoi utilizzare lo spazio degli indirizzi IP in modo più efficiente, consulta la pagina Ridurre l'utilizzo degli indirizzi IP interni in GKE.
L'intervallo di indirizzi IP del control plane è dedicato al control plane gestito da GKE che si trova in un progetto tenant gestito da Google in peering con il tuo VPC. Questo intervallo di indirizzi IP non deve sovrapporsi ad alcun indirizzo IP nel gruppo di peering VPC perché GKE importa questa route nel tuo progetto. Ciò significa che se hai route allo stesso CIDR nel tuo progetto, potresti riscontrare problemi di routing.
Quando crei un cluster, la subnet ha un intervallo principale per i nodi del cluster e deve esistere prima della creazione del cluster. La subnet deve ospitare il numero massimo di nodi che prevedi nel cluster e gli indirizzi IP del bilanciatore del carico interno nel cluster utilizzando la subnet.
Puoi utilizzare il gestore della scalabilità automatica del cluster per limitare il numero massimo di nodi.
Gli intervalli di indirizzi IP di pod e servizi sono rappresentati come intervalli secondari distinti della subnet, implementati come indirizzi IP alias nei cluster VPC nativi.
Scegli intervalli di indirizzi IP sufficientemente ampi da poter ospitare tutti i nodi, i pod e i servizi per il cluster.
Tieni presenti le seguenti limitazioni:
- Puoi espandere gli intervalli di indirizzi IP principali, ma non puoi ridurli. Questi intervalli di indirizzi IP non possono essere discontigui.
- Puoi espandere l'intervallo di pod aggiungendo intervalli di pod aggiuntivi al cluster o creando nuovi node pool con altri intervalli di pod secondari.
- L'intervallo di indirizzi IP secondari per i servizi non può essere espanso o modificato durante il ciclo di vita del cluster.
- Esamina le limitazioni per l'intervallo di indirizzi IP secondari per pod e servizi.
Utilizzare più indirizzi IP RFC 1918 privati
Per alcuni ambienti, lo spazio RFC 1918 in grandi blocchi CIDR contigui potrebbe essere già allocato in un'organizzazione. Puoi utilizzare lo spazio non RFC 1918 per CIDR aggiuntivi per i cluster GKE, se non si sovrappongono a indirizzi IP pubblici di proprietà di Google. Consigliamo di utilizzare la parte 100.64.0.0/10 dello spazio di indirizzi RFC perché lo spazio di indirizzi Classe E può presentare problemi di interoperabilità con l'hardware on-premise. Puoi utilizzare IP pubblici riutilizzati privatamente (PUPI).
Quando utilizzi indirizzi IP pubblici utilizzati privatamente, utilizzali con cautela e valuta la possibilità di controllare le pubblicità di route nelle reti on-premise a internet quando scegli questa opzione.
Non devi utilizzare la traduzione degli Network Address Translation (SNAT) in un cluster con traffico pod-to-pod e pod-to-service. In questo modo si interrompe il modello di networking di Kubernetes.
Kubernetes presuppone che tutti gli indirizzi IP non RFC 1918 siano indirizzi IP pubblici riutilizzati privatamente e utilizza SNAT per tutto il traffico proveniente da questi indirizzi.
Se utilizzi un indirizzo IP non RFC 1918 per il tuo cluster GKE, per i cluster standard devi disattivare esplicitamente SNAT o configurare l'agente di mascheramento IP in modo da escludere da SNAT gli indirizzi IP dei pod del cluster e gli intervalli di indirizzi IP secondari per i servizi. Per i cluster Autopilot, questa operazione non richiede passaggi aggiuntivi.
Utilizzare la modalità di subnet personalizzata
Quando configuri la rete, seleziona anche la modalità subnet: auto (impostazione predefinita)
o custom (opzione consigliata). La modalità auto lascia l'allocazione della subnet a Google ed è una buona opzione per iniziare senza pianificare gli indirizzi IP. Tuttavia,
ti consigliamo di selezionare la modalità custom perché ti consente di scegliere intervalli di indirizzi IP
che non si sovrappongono ad altri intervalli nel tuo ambiente. Se utilizzi un VPC condiviso, questa modalità può essere selezionata da un amministratore dell'organizzazione o da un amministratore di rete.
L'esempio seguente crea una rete denominata my-net-1 con la modalità subnet personalizzata:
gcloud compute networks create my-net-1 --subnet-mode custom
Pianifica la densità dei pod per nodo
Per impostazione predefinita, i cluster Standard riservano un intervallo /24 per ogni nodo dello spazio di indirizzi dei pod nella subnet e consentono fino a 110 pod per nodo. Tuttavia, puoi configurare un cluster Standard per supportare fino a 256 pod per nodo, con un intervallo /23 riservato per ogni nodo. A seconda delle dimensioni dei nodi e del profilo dell'applicazione dei pod, potresti eseguire un numero notevolmente inferiore di pod su ciascun nodo.
Se non prevedi di eseguire più di 64 pod per nodo, ti consigliamo di modificare il numero massimo di pod per nodo per preservare lo spazio degli indirizzi IP nella subnet dei pod.
Se prevedi di eseguire più di 110 pod per nodo predefiniti, puoi aumentare il numero massimo di pod per nodo fino a 256, con /23 riservato per ogni nodo. Con questo tipo di configurazione ad alta densità di pod, consigliamo di utilizzare istanze con 16 o più core CPU per garantire la scalabilità e le prestazioni del cluster.
Per i cluster Autopilot, il numero massimo di pod per nodo è impostato su 32, riservando un intervallo /26 per ogni nodo. Non puoi configurare questa impostazione nei cluster Autopilot.
Evita sovrapposizioni con gli indirizzi IP utilizzati in altri ambienti
Puoi connettere la tua rete VPC a un ambiente on-premise o ad altri fornitori di servizi cloud tramite Cloud VPN o Cloud Interconnect. Questi ambienti possono condividere le route, rendendo importante lo schema di gestione degli indirizzi IP on-premise nella pianificazione degli indirizzi IP per GKE. Ti consigliamo di assicurarti che gli indirizzi IP non si sovrappongano a quelli utilizzati in altri ambienti.
Crea una subnet del bilanciatore del carico
Crea una subnet del bilanciatore del carico separata per esporre i servizi con il bilanciamento del carico TCP/UDP interno. Se non viene utilizzata una subnet del bilanciatore del carico separata, questi servizi vengono esposti utilizzando un indirizzo IP della subnet dei nodi, il che può comportare l'utilizzo di tutto lo spazio allocato in quella subnet prima del previsto e impedire di scalare il cluster GKE al numero previsto di nodi.
L'utilizzo di una subnet del bilanciatore del carico separata significa anche che puoi filtrare il traffico verso e da i nodi GKE separatamente dai servizi esposti dal bilanciamento del carico TCP/UDP interno, il che ti consente di impostare limiti di sicurezza più rigidi.
Prenota spazio di indirizzi IP sufficiente per il gestore della scalabilità automatica del cluster
Puoi utilizzare lo scalatore automatico del cluster per aggiungere e rimuovere dinamicamente i nodi nel cluster, in modo da poter controllare i costi e migliorare l'utilizzo. Tuttavia, quando utilizzi il gestore della scalabilità automatica del cluster, assicurati che la pianificazione degli indirizzi IP tenga conto della dimensione massima di tutti i node pool. Ogni nuovo nodo richiede il proprio indirizzo IP del nodo, nonché il proprio insieme allocabile di indirizzi IP dei pod in base ai pod configurati per nodo. Il numero di pod per nodo può essere configurato in modo diverso rispetto a quanto configurato a livello di cluster. Non puoi modificare il numero di pod per nodo dopo aver creato il cluster o il pool di nodi. Devi prendere in considerazione i tipi di workload e assegnarli a pool di nodi distinti per un'allocazione ottimale degli indirizzi IP.
Valuta la possibilità di utilizzare il provisioning automatico dei nodi con il gestore della scalabilità automatica dei cluster, soprattutto se utilizzi cluster nativi di VPC. Per saperne di più, consulta Intervalli di limitazione dei nodi.
Condividere indirizzi IP tra cluster
Potresti dover condividere gli indirizzi IP tra i cluster se hai un team centralizzato che gestisce l'infrastruttura per i cluster. Per condividere gli indirizzi IP tra i cluster GKE, vedi Condividere intervalli di indirizzi IP tra i cluster GKE. Puoi ridurre l'esaurimento degli indirizzi IP creando tre intervalli per pod, servizi e nodi e riutilizzandoli o condividendoli, soprattutto in un modello VPC condiviso. Questa configurazione può anche semplificare la gestione degli indirizzi IP da parte degli amministratori di rete in quanto non richiede la creazione di subnet specifiche per ogni cluster.
Considera quanto segue:
- Come best practice, utilizza subnet e intervalli di indirizzi IP separati per tutti i cluster.
- Puoi condividere l'intervallo di indirizzi IP del pod secondario, ma non è consigliabile perché un cluster potrebbe utilizzare tutti gli indirizzi IP.
- Puoi condividere intervalli di indirizzi IP del servizio secondari, ma questa funzionalità non funziona con Cloud DNS con ambito VPC per GKE.
Se esaurisci gli indirizzi IP, puoi creare intervalli di indirizzi IP del pod aggiuntivi utilizzando il CIDR multi-pod discontinuo.
Condividere indirizzi IP per i servizi LoadBalancer interni
Puoi condividere un singolo indirizzo IP con un massimo di 50 backend utilizzando porte diverse. In questo modo puoi ridurre il numero di indirizzi IP necessari per i servizi LoadBalancer interni.
Per saperne di più, consulta IP condiviso.
Best practice per la sicurezza della rete
In questa sezione sono descritti alcuni consigli chiave per l'isolamento del cluster. La sicurezza di rete per i cluster GKE è una responsabilità condivisa tra Google e gli amministratori dei cluster.
Best practice:
Utilizza GKE Dataplane V2.Ridurre al minimo l'esposizione dei nodi.
Riduci al minimo l'esposizione del control plane del cluster.
Autorizza l'accesso al control plane.
Consenti la connettività del control plane.
Deploy proxies for control plane access from peered networks (Deployment di proxy per l'accesso al control plane dalle reti in peering).
Limita il traffico del cluster utilizzando i criteri di rete.
Attiva i criteri di sicurezza di Google Cloud Armor per Ingress.
Utilizza Identity-Aware Proxy per fornire l'autenticazione per le applicazioni con utenti IAM.
Utilizza i vincoli delle policy dell'organizzazione per migliorare ulteriormente la sicurezza.
Utilizza GKE Dataplane V2
GKE Dataplane V2 si basa su
eBPF e offre un'esperienza integrata di sicurezza e visibilità della rete. Quando crei un cluster utilizzando
GKE Dataplane V2, non devi abilitare esplicitamente i criteri di rete perché
GKE Dataplane V2 gestisce il routing dei servizi, l'applicazione dei criteri di rete e
la registrazione. Abilita il nuovo dataplane con l'opzione --enable-dataplane-v2 di Google Cloud CLI durante la creazione di un cluster. Una volta configurati i criteri di rete, è possibile configurare un oggetto CRD NetworkLogging predefinito per registrare le connessioni di rete consentite e negate. Ti consigliamo di creare cluster
con GKE Dataplane V2 per sfruttare appieno le funzionalità integrate, come
il logging delle policy di rete.
Ridurre al minimo l'esposizione dei nodi
In un cluster con solo nodi privati, i pod sono isolati dalla comunicazione in entrata e in uscita (il perimetro del cluster). Puoi controllare questi flussi direzionali esponendo i servizi utilizzando il bilanciamento del carico e Cloud NAT, come descritto nella sezione Connettività del cluster di questo documento. Il seguente diagramma mostra questo tipo di configurazione:
Questo diagramma mostra come può comunicare un cluster con nodi privati. I client on-premise possono connettersi al cluster con il client kubectl. L'accesso ai servizi Google viene fornito tramite l'accesso privato Google e la comunicazione a internet è disponibile solo utilizzando Cloud NAT.
Ridurre al minimo l'esposizione del control plane del cluster
Il control plane ha due tipi di endpoint per l'accesso al cluster:
- Endpoint basato su DNS
- Endpoint basati su IP
Utilizza solo l'endpoint basato su DNS per accedere al control plane per una configurazione semplificata e un livello di sicurezza flessibile e basato su policy.
L'endpoint DNS è accessibile da qualsiasi rete raggiungibile dalle API Google Cloud , incluse le reti on-premise o di altri cloud. Per attivare l'endpoint basato su DNS, utilizza il flag --enable-dns-access.
Il server API GKE può essere esposto anche come
endpoint pubblico o basato su IP privato. Puoi decidere quale endpoint utilizzare quando
crei il cluster. Puoi controllare l'accesso con le reti autorizzate, in cui gli endpoint pubblici e privati consentono per impostazione predefinita tutte le comunicazioni tra l'IP del pod e l'IP del nodo nel cluster. Per abilitare un endpoint privato quando
crei un cluster, utilizza il flag
--enable-private-endpoint.
Autorizza l'accesso al control plane
Le reti autorizzate possono contribuire a stabilire a quali subnet di indirizzi IP è consentito accedere
ai nodi del control plane GKE. Dopo aver abilitato queste reti, puoi limitare l'accesso a intervalli di indirizzi IP di origine specifici. Se l'endpoint pubblico
è disattivato, questi intervalli di indirizzi IP di origine devono essere privati. Se è attivato un endpoint pubblico, puoi consentire intervalli di indirizzi IP pubblici o interni.
Configura annunci di route personalizzati per consentire all'endpoint privato del control plane del cluster di essere raggiungibile da un ambiente on-premise. Puoi rendere l'endpoint API GKE privato raggiungibile a livello globale utilizzando l'opzione --enable-master-global-access quando crei un cluster.
Il seguente diagramma mostra la connettività tipica del control plane utilizzando le reti autorizzate:
Questo diagramma mostra gli utenti attendibili in grado di comunicare con il control plane GKE tramite l'endpoint pubblico in quanto fanno parte di reti autorizzate, mentre l'accesso da attori non attendibili è bloccato. La comunicazione con e dal cluster GKE avviene tramite l'endpoint privato del control plane.
Consenti la connettività del control plane
Alcuni pod di sistema su ogni nodo di lavoro dovranno raggiungere servizi come il server API Kubernetes (kube-apiserver), le API di Google o il server dei metadati.
Il kube-apiserverdeve comunicare anche con alcuni pod di sistema, ad esempio
event-exporter. Questa comunicazione è consentita per impostazione predefinita. Se
implementi regole firewall VPC all'interno dei progetti (maggiori dettagli nella
sezione Limita il traffico del cluster), assicurati che
questi pod possano continuare a comunicare con kube-apiserver e con le API di Google.
Esegui il deployment dei proxy per l'accesso al control plane dalle reti in peering
Se il cluster utilizza il peering di rete VPC, non puoi accedere al control plane del cluster da un'altra rete in peering.
Se vuoi l'accesso diretto da un'altra rete in peering o da on-premise quando utilizzi un'architettura hub-and-spoke, implementa i proxy per il traffico del control plane.
Limitare il traffico del cluster utilizzando i criteri di rete
Per i workload del cluster sono possibili più livelli di sicurezza di rete che possono essere combinati: regole firewall VPC, policy dei firewall gerarchiche e policy di rete Kubernetes. Le regole firewall VPC e i criteri firewall gerarchici si applicano a livello di macchina virtuale (VM), ovvero ai nodi worker in cui risiedono i pod del cluster GKE. I criteri di rete di Kubernetes vengono applicati a livello di pod per applicare i percorsi del traffico da pod a pod.
Se implementi i firewall VPC, puoi interrompere la comunicazione predefinita e obbligatoria del control plane, ad esempio la comunicazione di kubelet con il control plane. GKE crea regole firewall obbligatorie per impostazione predefinita, ma possono essere sovrascritte. Alcuni deployment potrebbero richiedere al control plane di raggiungere il cluster sul servizio. Puoi utilizzare i firewall VPC per configurare una policy di ingresso che renda accessibile il servizio.
I criteri di rete GKE vengono configurati tramite l'API Network Policy di Kubernetes per applicare la comunicazione dei pod di un cluster. Puoi abilitare i criteri di rete quando crei un cluster utilizzando l'opzione gcloud container
clusters create --enable-network-policy. Per limitare il traffico utilizzando le policy di rete, puoi seguire la guida all'implementazione del blueprint per la limitazione del traffico di Anthos.
Attiva le policy di sicurezza di Google Cloud Armor per l'ingresso
Utilizzando le policy di sicurezza di Google Cloud Armor, puoi proteggere le applicazioni che utilizzano i bilanciatori del carico delle applicazioni esterni da attacchi DDoS e altri attacchi basati sul web bloccando il traffico all'edge di rete. In GKE, attiva le policy di sicurezza di Google Cloud Armor per le applicazioni utilizzando Ingress per i bilanciatori del carico delle applicazioni esterni e aggiungendo una policy di sicurezza a BackendConfig collegato all'oggetto Ingress.
Utilizzare Identity-Aware Proxy per fornire l'autenticazione per le applicazioni con utenti IAM
Se vuoi eseguire il deployment di servizi a cui possono accedere solo gli utenti della tua organizzazione, senza che debbano trovarsi sulla rete aziendale, puoi utilizzare Identity-Aware Proxy per creare un livello di autenticazione per queste applicazioni. Per abilitare Identity-Aware Proxy per GKE, segui i passaggi di configurazione per aggiungere Identity-Aware Proxy come parte di BackendConfig per il servizio Ingress. Identity-Aware Proxy può essere combinato con Google Cloud Armor.
Utilizza i vincoli dei criteri dell'organizzazione per migliorare ulteriormente la sicurezza
Utilizzando i vincoli dei criteri dell'organizzazione, puoi impostare criteri per migliorare ulteriormente la tua postura di sicurezza. Ad esempio, puoi utilizzare i vincoli per limitare la creazione del bilanciatore del carico a determinati tipi, ad esempio solo ai bilanciatori del carico interni.
Scalabilità della connettività del cluster
Questa sezione illustra le opzioni scalabili per DNS e connettività in uscita dai cluster verso internet e i servizi Google.
Best practice:
Utilizzare Cloud DNS per GKE.Abilita NodeLocal DNSCache.
Utilizza Cloud NAT per l'accesso a internet dai cluster.
Utilizza l'accesso privato Google per accedere ai servizi Google.
Utilizzare Cloud DNS per GKE
Puoi utilizzare Cloud DNS per GKE per fornire la risoluzione DNS di pod e servizi con DNS gestito senza un provider DNS ospitato nel cluster. Cloud DNS elimina il sovraccarico della gestione di un server DNS ospitato nel cluster e non richiede scalabilità, monitoraggio o gestione delle istanze DNS perché è un servizio Google ospitato.
Abilita NodeLocal DNSCache
GKE utilizza kube-dns per fornire il servizio DNS locale del cluster come componente aggiuntivo del cluster predefinito. kube-dns viene replicato nel cluster
in funzione del numero totale di core e nodi nel cluster.
Puoi migliorare le prestazioni del DNS con NodeLocal DNSCache. NodeLocal DNSCache è un componente aggiuntivo di cui viene eseguito il deployment come DaemonSet e non richiede modifiche alla configurazione dei pod. Le ricerche DNS nel servizio pod locale non creano connessioni aperte che devono essere monitorate sul nodo, il che consente una maggiore scalabilità. Le ricerche di nomi host esterni vengono inoltrate a Cloud DNS, mentre tutte le altre query DNS vengono inviate a kube-dns.
Abilita NodeLocal DNSCache per tempi di ricerca delle query DNS più coerenti e una migliore scalabilità del cluster. Per i cluster Autopilot, NodeLocal DNSCache è abilitato per impostazione predefinita e non può essere sostituito.
La seguente opzione Google Cloud CLI abilita NodeLocal DNSCache quando crei un cluster: --addons NodeLocalDNS.
Se hai il controllo del nome che le applicazioni cercano di risolvere,
esistono modi per migliorare lo scaling del DNS. Ad esempio, utilizza un nome di dominio completo (termina il
nome host con un punto) o disattiva l'espansione del percorso di ricerca tramite
l'opzione del manifest Pod.dnsConfig.
Utilizzare Cloud NAT per l'accesso a internet dai cluster
Per impostazione predefinita, i cluster con nodi privati abilitati non hanno accesso a internet. Per consentire ai pod di accedere a internet, attiva Cloud NAT per ogni regione. Come minimo, abilita Cloud NAT per gli intervalli principali e secondari nella subnet GKE. Assicurati di allocare un numero sufficiente di indirizzi IP per Cloud NAT e porte per VM.
Utilizza le seguenti best practice per la configurazione del gateway Cloud NAT quando utilizzi Cloud NAT per i cluster:
- Quando crei il gateway Cloud NAT, abilitalo solo per gli intervalli di subnet utilizzati dai cluster. Contando tutti i nodi in tutti i cluster, puoi determinare il numero di VM consumer NAT che hai nel progetto.
Utilizza l'allocazione dinamica delle porte per assegnare numeri diversi di porte per VM in base all'utilizzo della VM stessa. Inizia con un minimo di 64 porte e un massimo di 2048 porte.
Se devi gestire molte connessioni simultanee alla stessa tupla 3, riduci il timeout TCP
TIME_WAITdal valore predefinito di120sa5s. Per saperne di più, consulta Specificare timeout diversi per NAT.Attiva il logging degli errori di Cloud NAT per controllare i log correlati.
Controlla i log del gateway Cloud NAT dopo averlo configurato. Per ridurre i problemi relativi allo stato di allocazione eliminato, potrebbe essere necessario aumentare il numero massimo di porte per VM.
Devi evitare il doppio SNAT per il traffico dei pod (SNAT prima sul nodo GKE e poi di nuovo con Cloud NAT). A meno che tu non richieda
SNAT per nascondere gli indirizzi IP dei pod verso le reti on-premise connesse tramite
Cloud VPN o Cloud Interconnect,
disable-default-snat
e scarica il monitoraggio SNAT su Cloud NAT per la scalabilità. Questa soluzione
funziona per tutti gli intervalli IP di subnet primari e secondari. Utilizza le policy di rete per
limitare il traffico esterno dopo aver abilitato Cloud NAT. Cloud NAT non è
necessario per accedere ai servizi Google.
Utilizzare l'accesso privato Google per accedere ai servizi Google
Nei cluster con nodi privati, i pod non hanno indirizzi IP pubblici per raggiungere servizi pubblici, inclusi API e servizi Google. L'accesso privato Google consente alle risorse Google Cloud private di raggiungere i servizi Google.
L'accesso privato Google è abilitato per impostazione predefinita nei cluster con nodi privati, ad eccezione dei cluster VPC condiviso.
Best practice per la scalabilità delle applicazioni
Quando crei applicazioni raggiungibili esternamente o internamente alla tua organizzazione, assicurati di utilizzare il tipo e le opzioni di bilanciatore del carico corretti. Questa sezione fornisce consigli sull'esposizione e sul ridimensionamento delle applicazioni con Cloud Load Balancing.
Best practice:
Utilizza il bilanciamento del carico nativo del container.Scegli la risorsa GKE corretta per esporre la tua applicazione.
Crea controlli di integrità basati su BackendConfig.
Utilizza il criterio di gestione del traffico locale per conservare gli indirizzi IP originali.
Utilizza Private Service Connect.
Utilizza il bilanciamento del carico nativo del container
Utilizza il bilanciamento del carico nativo del container quando esponi i servizi utilizzando HTTP(S) esternamente. Il bilanciamento del carico nativo del container riduce i salti di rete, diminuisce la latenza e fornisce una distribuzione del traffico più precisa. Aumenta inoltre la visibilità tempo di round trip e consente di utilizzare funzionalità di bilanciamento del carico come Google Cloud Armor.
Scegli la risorsa GKE corretta per esporre la tua applicazione
A seconda dell'ambito dei tuoi client (interni, esterni o anche interni al cluster), della regionalità della tua applicazione e dei protocolli che utilizzi, esistono diverse risorse GKE che puoi scegliere di utilizzare per esporre la tua applicazione. La panoramica di Service Networking spiega queste opzioni e può aiutarti a scegliere la risorsa migliore per esporre ogni parte della tua applicazione utilizzando le opzioni di bilanciamento del carico Google Cloud .
Crea controlli di integrità basati su BackendConfig
Se utilizzi un Ingress per esporre i servizi, utilizza una configurazione del controllo di integrità in un CRD BackendConfig per utilizzare la funzionalità di controllo di integrità del bilanciatore del carico delle applicazioni esterno. Puoi indirizzare il controllo di integrità all'endpoint appropriato e impostare le tue soglie. Senza una CRD BackendConfig, i controlli di integrità vengono dedotti dai parametri del probe di idoneità o utilizzano i parametri predefiniti.
Utilizza i criteri di gestione del traffico locale per conservare gli indirizzi IP originali
Quando utilizzi un bilanciatore del carico di rete passthrough interno con
GKE, imposta
l'opzione
externalTrafficPolicy su Local per preservare l'indirizzo IP di origine delle richieste. Utilizza questa
opzione se la tua applicazione richiede l'indirizzo IP di origine originale. Tuttavia, l'opzione
externalTrafficPolicy local può comportare una distribuzione del carico meno ottimale,
quindi utilizza questa funzionalità solo quando necessario. Per i servizi HTTP(S), puoi utilizzare i controller Ingress e ottenere l'indirizzo IP originale leggendo l'intestazione X-Forwarded-For nella richiesta HTTP.
Utilizzare Private Service Connect
Puoi utilizzare Private Service Connect per condividere i servizi di bilanciamento del carico di rete pass-through interno in altre reti VPC. Ciò è utile per i servizi ospitati su cluster GKE, ma che servono clienti che vengono eseguiti in progetti e VPC diversi.
Puoi utilizzare Private Service Connect per ridurre il consumo di indirizzi IP fornendo connettività tra VPC con indirizzi IP sovrapposti.
Best practice operative
Best practice:
Utilizza IAM per le autorizzazioni GKE per controllare le policy nelle VPC condiviso condivise.Utilizza cluster regionali e distribuisci i carichi di lavoro per garantire l'alta disponibilità.
Utilizza Cloud Logging e Cloud Monitoring e attiva il logging dei criteri di rete.
Le sezioni seguenti contengono best practice operative che ti aiutano a garantire opzioni di autorizzazione granulari per i tuoi workload. Per evitare di creare regole firewall manuali, segui le best practice operative descritte in questa sezione. Include anche consigli per distribuire i carichi di lavoro e per il monitoraggio e il logging in GKE.
Utilizzare IAM per le autorizzazioni GKE per controllare i criteri nelle reti VPC condiviso
Quando utilizzi le reti VPC condivise, le regole firewall per i bilanciatori del carico vengono create automaticamente nel progetto host.
Per evitare di dover creare manualmente regole firewall, assegna un ruolo personalizzato con privilegi minimi al account di servizio GKE nel progetto host denominato service-HOST_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com.
Sostituisci HOST_PROJECT_NUMBER con il numero di progetto del progetto host per il VPC condiviso.
Il ruolo personalizzato che crei deve disporre delle seguenti autorizzazioni:
compute.firewalls.createcompute.firewalls.getcompute.firewalls.listcompute.firewalls.delete
Inoltre, le regole firewall create da GKE hanno sempre la priorità predefinita di 1000, quindi puoi impedire il flusso di traffico specifico creando regole firewall con una priorità più alta.
Se vuoi limitare la creazione di determinati tipi di bilanciatori del carico, utilizza le policy dell'organizzazione per limitare la creazione di bilanciatori del carico.
Utilizza cluster regionali e distribuisci i carichi di lavoro per l'alta affidabilità
I cluster a livello di regione possono aumentare la disponibilità delle applicazioni in un cluster perché il control plane e i nodi del cluster sono distribuiti su più zone.
Tuttavia, per garantire la migliore esperienza utente possibile in caso di errore di zona, utilizza lo scalatore automatico del cluster per assicurarti che il cluster possa gestire il carico richiesto in qualsiasi momento.
Puoi anche utilizzare l'anti-affinità dei pod per assicurarti che i pod di un determinato servizio siano pianificati in più zone.
Per ulteriori informazioni su come configurare queste impostazioni per l'alta disponibilità e l'ottimizzazione dei costi, consulta Best practice per i cluster GKE ad alta disponibilità.
Utilizza Cloud Logging e Cloud Monitoring e attiva il logging dei criteri di rete
Sebbene ogni organizzazione abbia requisiti diversi per la visibilità e il controllo, ti consigliamo di attivare la registrazione delle norme di rete. Questa funzionalità è disponibile solo con GKE Dataplane V2. La registrazione dei criteri di rete fornisce visibilità sull'applicazione dei criteri e sui pattern di traffico dei pod. Tieni presente che sono previsti costi per la registrazione dei log delle norme di rete.
Per i cluster GKE che utilizzano la versione 1.14 o successive, Logging e Monitoring sono entrambi abilitati per impostazione predefinita. Monitoring fornisce una dashboard per i tuoi cluster GKE. La registrazione abilita anche le annotazioni GKE per i log di flusso VPC. Per impostazione predefinita, Logging raccoglie i log per tutti i workload di cui è stato eseguito il deployment nel cluster, ma esiste anche un'opzione per i log di sistema soltanto. Utilizza la dashboard GKE per osservare e impostare avvisi. Per i cluster creati in modalità Autopilot, il monitoraggio e la registrazione vengono attivati automaticamente e non possono essere configurati.
Tieni presente che sono previsti costi per Google Cloud Observability.
Best practice per la distribuzione uniforme del traffico
Questa sezione fornisce pratiche consigliate per una distribuzione uniforme del traffico. Prima di implementarle, assicurati di aver implementato un monitoraggio appropriato (ad esempio utilizzando Prometheus, Cloud Monitoring o i servizi di monitoraggio del tuo provider di servizi cloud) per identificare e confermare modelli di distribuzione non uniformi.
Disattivare o configurare con attenzione l'affinità sessione
Per risolvere il problema, disattiva affinità sessione, a meno che non sia assolutamente necessario. Imposta
sessionAffinity: None nel manifest del servizio. Se devi utilizzare l'affinità di sessione, valuta attentamente le implicazioni e monitora il carico dei pod. L'affinità
sessione assicura che un utente rimanga connesso allo stesso backend per tutta la durata
di una sessione.
Utilizza il bilanciamento del carico ponderato
Per implementare questa pratica, configura il servizio in modo che utilizzi il bilanciamento del carico ponderato. Il bilanciamento del carico ponderato distribuisce il traffico in base al numero di pod integri per nodo. Il bilanciatore del carico invia nuove connessioni a un nodo GKE in proporzione al numero di pod integri in quel nodo. Per un bilanciatore del carico di rete passthrough esterno in GKE, il bilanciamento del carico ponderato consente ai nodi con più pod di servizio di ricevere una proporzione maggiore di nuove connessioni.
Per abilitare il bilanciamento del carico ponderato, devi soddisfare i seguenti requisiti e configurare il servizio con annotazioni specifiche:
- Versione del cluster GKE: il cluster GKE deve utilizzare la versione 1.31.0-gke.1506000 o successive.
- Componente aggiuntivo per il bilanciamento del carico HTTP: il componente aggiuntivo
HttpLoadBalancingdeve essere abilitato per il cluster (è abilitato per impostazione predefinita). - Bilanciatore del carico basato sul servizio di backend: includi l'annotazione
cloud.google.com/l4-rbs: "enabled"nel manifest del servizio per assicurarti che GKE crei un bilanciatore del carico di rete passthrough esterno basato sul servizio di backend. I bilanciatori del carico basati su pool di destinazione non supportano il bilanciamento del carico ponderato. - Annotazione di bilanciamento del carico ponderato: includi l'annotazione
networking.gke.io/weighted-load-balancing: pods-per-nodenel manifest del servizio. - Policy del traffico esterno: il manifest del servizio deve utilizzare
externalTrafficPolicy: Local. SebbeneexternalTrafficPolicy: Clustersia consentito, disabilita di fatto il bilanciamento del carico ponderato, in quanto i pacchetti potrebbero essere instradati a un nodo diverso dopo la distribuzione iniziale del bilanciatore del carico.
- Salva il seguente manifest di esempio come
weighted-lb-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-weighted-service
annotations:
cloud.google.com/l4-rbs: "enabled"
networking.gke.io/weighted-load-balancing: pods-per-node
spec:
type: LoadBalancer
externalTrafficPolicy: Local
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
Applica il manifest al cluster:
kubectl apply -f weighted-lb-service.yaml
Questa configurazione evita di sovraccaricare le istanze di backend distribuendo le nuove
connessioni proporzionalmente al numero di pod su ogni nodo. Inoltre, conserva l'affinità dell'indirizzo IP client e l'indirizzo IP di origine originale del client per l'applicazione grazie a externalTrafficPolicy: Local.
Garantire una distribuzione uniforme dei pod tra i nodi
Utilizza l'anti-affinità dei pod per impedire la pianificazione dei pod dello stesso servizio sullo stesso nodo. Definisci le regole di anti-affinità dei pod nei manifest di deployment.
L'esempio seguente mostra un manifest di Deployment con anti-affinità tra pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 6
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: "kubernetes.io/hostname"
Esaminare le norme sul traffico esterno
Utilizza Cluster come externalTrafficPolicy per consentire al bilanciatore del carico di distribuire il traffico a qualsiasi nodo del cluster. Imposta externalTrafficPolicy:
Cluster nel manifest del servizio. Utilizza questa impostazione se devi distribuire
il traffico in modo uniforme su tutti i nodi.
Se utilizzi Local, assicurati di distribuire uniformemente i pod tra i nodi.
Disattiva l'affinità dei nodi
Rimuovi le configurazioni di affinità dai deployment se riscontri hotspot.
Utilizzare i probe di idoneità
Configura i probe di idoneità sui pod. Definisci i probe di idoneità nei manifest dei pod. In questo modo, il bilanciatore del carico invia il traffico solo ai pod pronti a gestire le richieste.
L'esempio seguente mostra un manifest di pod con un probe di idoneità:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Utilizza il bilanciamento del carico nativo del container
Se possibile, utilizza il bilanciamento del carico nativo del container. Il bilanciatore del carico distribuisce il traffico direttamente ai pod, anziché ai nodi. In questo modo, la distribuzione del traffico migliora e la latenza si riduce. Per ulteriori informazioni, consulta Informazioni sul bilanciamento del carico in GKE.
Valuta il routing basato sulla topologia
Valuta la possibilità di utilizzare il routing basato sulla topologia. Questa funzionalità mira a mantenere il traffico all'interno della zona di origine, migliorando le prestazioni e riducendo i costi. Questa funzionalità funziona meglio quando il traffico in entrata è distribuito in modo uniforme e i servizi Kubernetes hanno tre o più endpoint per zona. Per maggiori informazioni, consulta la sezione Risoluzione dei problemi relativi alla distribuzione del traffico.
Cloud Service Mesh
Per un controllo più granulare della distribuzione del traffico, delle policy di routing avanzate e dell'osservabilità, valuta la possibilità di implementare una mesh di servizi cloud come Istio. Cloud Service Mesh opera a livello di applicazione e fornisce funzionalità avanzate di gestione del traffico.