Come per qualsiasi cluster Kubernetes, la scalabilità dei cluster Google Distributed Cloud ha molte dimensioni correlate. Questo documento ha lo scopo di aiutarti a comprendere le dimensioni chiave che puoi modificare per fare lo scale up dei tuoi cluster senza interrompere i carichi di lavoro.
Comprendere i limiti
Google Distributed Cloud è un sistema complesso con un'ampia superficie di integrazione. Esistono molte dimensioni che influiscono sulla scalabilità del cluster. Ad esempio, il numero di nodi è solo una delle numerose dimensioni su cui Google Distributed Cloud può scalare. Altre dimensioni includono il numero totale di pod e servizi. Molte di queste dimensioni, ad esempio il numero di pod per nodo e il numero di nodi per cluster, sono interconnesse. Per ulteriori informazioni sulle dimensioni che hanno effetto sulla scalabilità, vedi Soglie di scalabilità di Kubernetes nella sezione Scalability Special Interest Group (SIG) del repository della community Kubernetes su GitHub.
I limiti di scalabilità sono sensibili anche all'hardware e alla configurazione dei nodi su cui è in esecuzione il cluster. I limiti descritti in questo documento sono verificati in un ambiente probabilmente diverso dal tuo. Pertanto, potresti non riprodurre gli stessi numeri quando l'ambiente sottostante è il fattore limitante.
Per ulteriori informazioni sui limiti che si applicano ai cluster Google Distributed Cloud, consulta Quote e limiti.
Preparati alla scalabilità
Quando ti prepari a scalare i tuoi cluster Google Distributed Cloud, considera i requisiti e le limitazioni descritti nelle sezioni seguenti.
Requisiti di CPU e memoria del nodo del piano di controllo
La seguente tabella illustra la configurazione consigliata di CPU e memoria per i nodi del piano di controllo per i cluster che eseguono carichi di lavoro di produzione:
Numero di nodi del cluster | CPU consigliate per il piano di controllo | Memoria consigliata per il piano di controllo |
---|---|---|
1-50 | 8 core | 32 GiB |
51-100 | 16 core | 64 GiB |
Numero di pod e servizi
Il numero di pod e servizi che puoi avere nei tuoi cluster è controllato dalle seguenti impostazioni:
clusterNetwork.pods.cidrBlocks
specifica il numero di pod consentiti nel cluster.nodeConfig.podDensity.maxPodsPerNode
specifica il numero massimo di pod che possono essere eseguiti su un singolo nodo.clusterNetwork.services.cidrBlocks
specifica il numero di servizi consentiti nel cluster.
CIDR pod e numero massimo di nodi
Il numero totale di indirizzi IP prenotati per i pod nel cluster è uno dei fattori che limitano lo scale up del cluster. Questa impostazione, insieme all'impostazione relativa al numero massimo di pod per nodo, determina il numero massimo di nodi che puoi avere nel cluster prima di rischiare di esaurire gli indirizzi IP dei pod.
Considera quanto segue:
Il numero totale di indirizzi IP riservati per i pod nel cluster è specificato con
clusterNetwork.pods.cidrBlocks
, che accetta un intervallo di indirizzi IP specificato nella notazione CIDR. Ad esempio, il valore precompilato192.168.0.0/16
specifica un intervallo di 65.536 indirizzi IP tra192.168.0.0
e192.168.255.255
.Il numero massimo di pod che possono essere eseguiti su un singolo nodo è specificato con
nodeConfig.podDensity.maxPodsPerNode
.In base all'impostazione del numero massimo di pod per nodo, Google Distributed Cloud esegue il provisioning di circa il doppio degli indirizzi IP per il nodo. Gli indirizzi IP aggiuntivi aiutano a impedire il riutilizzo involontario degli IP dei pod in un breve arco di tempo.
Dividendo il numero totale di indirizzi IP dei pod per il numero di indirizzi IP dei pod di cui è stato eseguito il provisioning su ciascun nodo si ottiene il numero totale di nodi che possono essere presenti nel cluster.
Ad esempio, se il CIDR del tuo pod è 192.168.0.0/17
, hai un totale di 32.768 indirizzi IP (2(32-17) = 215 = 32.768). Se imposti il numero massimo di pod per nodo su 250, Google Distributed Cloud esegue il provisioning di un intervallo di circa 500 indirizzi IP, che è all'incirca equivalente a un blocco CIDR /23
(2(32-23) = 29 = 512).
Pertanto, in questo caso il numero massimo di nodi è 64 (215 indirizzi/cluster diviso per 29 indirizzi/nodo = 2(15-9) nodi/cluster = 26 = 64 nodi/cluster).
Sia clusterNetwork.pods.cidrBlocks
che nodeConfig.podDensity.maxPodsPerNode
sono immutabili, quindi pianifica con attenzione la crescita futura del tuo cluster per
evitare di esaurire la capacità dei nodi. Per i valori massimi consigliati per pod per cluster, pod per nodo e nodi per cluster in base ai test, consulta i limiti.
CIDR servizio
Il CIDR del servizio può essere aggiornato per aggiungere altri servizi man mano che fai lo scale up del cluster. Tuttavia, non puoi ridurre l'intervallo CIDR del servizio. Per ulteriori informazioni, consulta Aumentare l'intervallo di rete dei servizi.
Risorse riservate per i daemon di sistema
Per impostazione predefinita, Google Distributed Cloud riserva automaticamente risorse su un nodo per
daemon di sistema come sshd
o udev
. Le risorse di CPU e memoria sono riservate su un nodo per i daemon di sistema, in modo che questi daemon dispongano delle risorse necessarie. Senza questa funzionalità, i pod possono potenzialmente consumare la maggior parte delle risorse su un nodo, impedendo ai daem di sistema di completare le loro attività.
In particolare, Google Distributed Cloud riserva 80 millicore di CPU (80 mCPU) e 280 mebibyte (280 MiB) di memoria su ciascun nodo per i daemon di sistema. Tieni presente che l'unità CPU mCPU è l'acronimo di millesimo di core e quindi l'80/1000 o l'8% di un core su ciascun nodo è riservato ai daemon di sistema. La quantità di risorse prenotate è ridotta e non ha un impatto significativo sulle prestazioni dei pod. Tuttavia, il kubelet su un nodo può rimuovere i pod se il loro utilizzo di CPU o memoria supera gli importi allocati.
Networking con MetalLB
Ti consigliamo di aumentare il numero di speaker MetalLB per affrontare i seguenti aspetti:
Larghezza di banda: l'intera larghezza di banda del cluster per i servizi di bilanciamento del carico dipende dal numero di altoparlanti e dalla larghezza di banda di ciascun nodo degli altoparlanti. Un maggiore traffico di rete richiede più altoparlanti.
Tolleranza di errore: un numero maggiore di altoparlanti riduce l'impatto complessivo di un guasto di un singolo speaker.
MetalLB richiede connessioni di livello 2 tra i nodi di bilanciamento del carico. In questo caso, potresti essere limitato dal numero di nodi con connettività di livello 2 in cui puoi inserire speaker MetalLB.
Pianifica con attenzione quanti speaker MetalLB vuoi avere nel cluster e determina il numero di nodi di livello 2 necessari. Per ulteriori informazioni, consulta Problemi di scalabilità di MetalLB.
Separatamente, quando utilizzi la modalità di bilanciamento del carico in bundle, anche i nodi del piano di controllo devono trovarsi nella stessa rete di livello 2. Il bilanciamento del carico manuale non presenta questa limitazione. Per maggiori informazioni, vedi Modalità del bilanciatore del carico manuale.
Esecuzione di molti nodi, pod e servizi
L'aggiunta di nodi, pod e servizi consente di fare lo scale up del cluster. Le sezioni seguenti trattano alcune impostazioni e configurazioni aggiuntive che devi prendere in considerazione quando aumenti il numero di nodi, pod e servizi nel tuo cluster. Per informazioni sui limiti di queste dimensioni e sulla loro relazione, consulta Limiti.
Crea un cluster senza kube-proxy
Per creare un cluster ad alte prestazioni in grado di fare lo scale up per utilizzare un numero elevato di servizi ed endpoint, ti consigliamo di creare il cluster senza kube-proxy
. Senza kube-proxy
, il cluster utilizza GKE Dataplane V2 in modalità kube-proxy-replacement. Questa modalità evita il consumo di risorse
necessario per mantenere un grande set di regole iptables.
Non puoi disabilitare l'utilizzo di kube-proxy
per un cluster esistente. Questa configurazione deve essere impostata al momento della creazione del cluster. Per istruzioni e
ulteriori informazioni, consulta Creare un cluster senza kube-proxy.
Configurazione CoreDNS
Questa sezione descrive gli aspetti di CoreDNS che influiscono sulla scalabilità dei tuoi cluster.
DNS dei pod
Per impostazione predefinita, i cluster Google Distributed Cloud inseriscono nei pod un valore resolv.conf
simile al seguente:
nameserver KUBEDNS_CLUSTER_IP
search <NAMESPACE>.svc.cluster.local svc.cluster.local cluster.local c.PROJECT_ID.internal google.internal
options ndots:5
L'opzione ndots:5
significa che i nomi host con meno di 5 punti non sono
considerati un nome di dominio completo (FQDN). Il server DNS aggiunge tutti i domini di ricerca specificati prima di cercare il nome host richiesto in origine, che esegue la ricerca nel seguente modo durante la risoluzione di google.com
:
google.com.NAMESPACE.svc.cluster.local
google.com.svc.cluster.local
google.com.cluster.local
google.com.c.PROJECT_ID.internal
google.com.google.internal
google.com
Ogni ricerca viene eseguita per IPv4 (record A) e IPv6 (record AAAA), generando 12 richieste DNS per ogni query non FQDN, il che amplifica in modo significativo il traffico DNS. Per limitare il problema, ti consigliamo di dichiarare il nome host per la ricerca come nome di dominio completo aggiungendo un punto finale (google.com.
). Questa dichiarazione deve essere effettuata a livello del carico di lavoro dell'applicazione. Per ulteriori
informazioni, consulta la pagina manuale di resolv.conf
.
IPv6
Se il cluster non utilizza IPv6, è possibile dimezzare le richieste DNS eliminando la ricerca del record AAAA
nel server DNS upstream. Se hai bisogno di aiuto per disabilitare le ricerche di AAAA
, contatta l'assistenza clienti Google Cloud.
Pool di nodi dedicato
Data la natura critica delle query DNS nei cicli di vita delle applicazioni, ti consigliamo di utilizzare nodi dedicati per il deployment coredns
. Questo deployment rientra in un dominio in errore diverso dalle normali applicazioni. Se hai bisogno di aiuto per configurare nodi dedicati per il deployment coredns
, contatta l'assistenza clienti Google Cloud.
Problemi di scalabilità MetalLB
MetalLB funziona in modalità attivo-passivo, il che significa che in qualsiasi momento c'è
un solo altoparlante MetalLB che gestisce un determinato VIP di LoadBalancer
.
Failover
Prima della release 1.28.0 di Google Distributed Cloud, su larga scala, il failover di MetalLB poteva richiedere molto tempo e presentare un rischio di affidabilità per il cluster.
Limiti di connessione
Se esiste un particolare VIP LoadBalancer
, ad esempio un servizio Ingress, che
prevede vicino a o più di 30.000 connessioni simultanee, è probabile che
il nodo dell'altoparlante che gestisce il VIP possa esaurire le porte
disponibili. A causa di una limitazione dell'architettura,
non esiste alcuna mitigazione per questo problema da parte di MetalLB. Valuta la possibilità di passare al bilanciamento del carico in bundle con BGP prima di creare il cluster o utilizza una classe in entrata diversa. Per maggiori informazioni, consulta la pagina
Configurazione in entrata.
Speaker con bilanciatore del carico
Per impostazione predefinita, Google Distributed Cloud utilizza lo stesso pool di nodi del bilanciatore del carico sia per il piano di controllo sia per il piano dati. Se non specifichi un pool di nodi del bilanciatore del carico (loadBalancer.nodePoolSpec
), viene utilizzato il pool di nodi del piano di controllo (controlPlane.nodePoolSpec
).
Per aumentare il numero di speaker quando utilizzi il pool di nodi del piano di controllo per il bilanciamento del carico, devi aumentare il numero di macchine del piano di controllo. Per i deployment di produzione, ti consigliamo di utilizzare tre nodi del piano di controllo per garantire una disponibilità elevata. Aumentare il numero di nodi del piano di controllo oltre tre per ospitare altri relatori potrebbe non essere un buon utilizzo delle tue risorse.
Configurazione in entrata
Se prevedi circa 30.000 connessioni simultanee in un singolo VIP di servizio
LoadBalancer
, MetalLB potrebbe non essere in grado di supportarlo.
Puoi prendere in considerazione l'esposizione del VIP tramite altri meccanismi, ad esempio F5 BIG-IP. In alternativa, puoi creare un nuovo cluster utilizzando il bilanciamento del carico in bundle con BGP, che non ha la stessa limitazione.
Ottimizza i componenti di Cloud Logging e Cloud Monitoring
In cluster di grandi dimensioni, a seconda dei profili delle applicazioni e del modello di traffico, le configurazioni predefinite delle risorse per i componenti di Cloud Logging e Cloud Monitoring potrebbero non essere sufficienti. Per istruzioni sull'ottimizzazione delle richieste e dei limiti delle risorse per i componenti di osservabilità, consulta Configurare le risorse dei componenti Stackdriver.
In particolare, kube-state-metrics nei cluster con un numero elevato di servizi ed endpoint, potrebbe causare un utilizzo eccessivo di memoria sia su kube-state-metrics
sia su gke-metrics-agent
sullo stesso nodo. L'utilizzo delle risorse di Metrics-server può anche fare lo scale in termini di nodi, pod e servizi. Se riscontri problemi relativi alle risorse su questi componenti, contatta l'
assistenza clienti Google Cloud.
Utilizza sysctl per configurare il sistema operativo
Ti consigliamo di ottimizzare la configurazione del sistema operativo in base ai nodi,
in modo che si adatti al meglio al caso d'uso del carico di lavoro. I parametri fs.inotify.max_user_watches
e
fs.inotify.max_user_instances
che controllano il numero di risorse di notifica
spesso devono essere ottimizzati. Ad esempio, se visualizzi messaggi di errore come il seguente, verifica se è necessario ottimizzare questi parametri:
The configured user limit (128) on the number of inotify instances has been reached
ENOSPC: System limit for number of file watchers reached...
L'ottimizzazione in genere varia in base ai tipi di carichi di lavoro e alla configurazione hardware. Puoi consultare il tuo fornitore di sistemi operativi per consultare le best practice specifiche per il sistema operativo.
Best practice
Questa sezione descrive le best practice per lo scale up del cluster.
Scalare una dimensione alla volta
Per ridurre al minimo i problemi e semplificare il rollback delle modifiche, non modificare più di una dimensione alla volta. Fare lo scale up di più dimensioni contemporaneamente può causare problemi anche in cluster più piccoli. Ad esempio, provare ad aumentare a 110 il numero di pod pianificati per nodo e a raggiungere a 250 il numero di nodi nel cluster, probabilmente non riuscirà perché il numero di pod, il numero di pod per nodo e il numero di nodi sono troppo estesi.
Scala i cluster in più fasi
Lo scale up di un cluster può richiedere molte risorse. Per ridurre il rischio che le operazioni del cluster o i carichi di lavoro del cluster subiscano interruzioni, sconsigliamo di tentare di creare cluster di grandi dimensioni con molti nodi in una singola operazione.
Crea cluster ibridi o autonomi senza nodi worker
Se stai creando un cluster ibrido o autonomo di grandi dimensioni con più di 50 nodi worker, ti consigliamo di creare prima un cluster ad alta disponibilità con i nodi del piano di controllo e poi lo scale up graduale. L'operazione di creazione del cluster utilizza un cluster di bootstrap, che non è ad alta disponibilità e pertanto è meno affidabile. Una volta creato il cluster ibrido o autonomo ad alta disponibilità, puoi utilizzarlo per fare lo scale up a più nodi.
Aumentare il numero di nodi worker in batch
Se stai espandendo un cluster a più nodi worker, è meglio eseguire l'espansione in fasi. Ti consigliamo di aggiungere non più di 20 nodi alla volta. Ciò è particolarmente vero per i cluster che eseguono carichi di lavoro critici.
Abilita il pull di immagini parallele
Per impostazione predefinita, kubelet estrae le immagini in modo seriale, una dopo l'altra. Se la connessione upstream al server del registro di immagini è errata, un pull delle immagini non valido può bloccare l'intera coda per un determinato pool di nodi.
Per mitigare questo problema, ti consigliamo di impostare serializeImagePulls
su false
nella
configurazione kubelet personalizzata. Per le istruzioni e ulteriori informazioni, consulta Configurare le impostazioni pull delle immagini kubelet.
L'abilitazione dei pull di immagini parallele può introdurre picchi nel consumo della larghezza di banda della rete o di I/O del disco.
Ottimizza le richieste e i limiti delle risorse delle applicazioni
In ambienti ad alta densità, i carichi di lavoro delle applicazioni potrebbero essere rimossi. Kubernetes utilizza il meccanismo di riferimento per classificare i pod in caso di eliminazione.
Una buona prassi per impostare le risorse del container consiste nell'utilizzare la stessa quantità di memoria per richieste e limiti e un limite di CPU maggiore o illimitato. Per ulteriori informazioni, consulta Preparare applicazioni Kubernetes basate su cloud nel Cloud Architecture Center.
Utilizzare un partner di archiviazione
Ti consigliamo di utilizzare uno dei partner di archiviazione GDCV Ready per i deployment su larga scala. È importante verificare le seguenti informazioni con il partner di archiviazione specifico:
- I deployment di archiviazione seguono le best practice per gli aspetti di archiviazione, come l'alta disponibilità, l'impostazione della priorità, le affinità dei nodi, le richieste e i limiti delle risorse.
- La versione di archiviazione è qualificata con la versione specifica di Google Distributed Cloud.
- Il fornitore dell'archiviazione può supportare l'alta scalabilità di cui vuoi eseguire il deployment.
Configura i cluster per l'alta disponibilità
È importante controllare il deployment su larga scala e assicurarti che i componenti critici siano configurati per l'alta disponibilità, se possibile. Google Distributed Cloud supporta opzioni di deployment ad alta disponibilità per tutti i tipi di cluster. Per ulteriori informazioni, consulta Scegliere un modello di deployment. Ad esempio, consulta i file di configurazione dei cluster dei deployment ad alta disponibilità, vedi Esempi di configurazione dei cluster.
È importante anche controllare altri componenti, tra cui:
- Fornitore di spazio di archiviazione
- Webhook del cluster
Monitoraggio dell'utilizzo delle risorse
Questa sezione fornisce alcuni suggerimenti di monitoraggio di base per i cluster su larga scala.
Monitora attentamente le metriche di utilizzo
È fondamentale monitorare l'utilizzo sia dei nodi sia dei singoli componenti di sistema e assicurarsi che abbiano un margine sicuro. Per conoscere le funzionalità di monitoraggio standard disponibili per impostazione predefinita, consulta Utilizzare le dashboard predefinite.
Monitorare il consumo della larghezza di banda
Monitora attentamente il consumo della larghezza di banda per assicurarti che la rete non sia satura, con un peggioramento delle prestazioni del cluster.
Migliora le prestazioni di etcd
La velocità del disco è fondamentale per le prestazioni e la stabilità etcd. Un disco lento aumenta la latenza della richiesta etcd, il che può portare a problemi di stabilità del cluster. Per migliorare le prestazioni dei cluster, Google Distributed Cloud archivia gli oggetti Event in un'istanza etcd separata e dedicata. L'istanza etcd standard utilizza /var/lib/etcd
come directory dei dati e porta 2379 per le richieste client. L'istanza etcd-events utilizza /var/lib/etcd-events
come directory dei dati e porta 2382 per le richieste del client.
Ti consigliamo di utilizzare un disco a stato solido (SSD) per gli archivi etcd. Per
prestazioni ottimali, monta dischi separati su /var/lib/etcd
e
/var/lib/etcd-events
. L'uso di dischi dedicati garantisce che le due
istanze etcd non condividano l'I/O del disco.
La documentazione etcd fornisce ulteriori suggerimenti per l'hardware per garantire le migliori prestazioni etcd durante l'esecuzione dei cluster in produzione.
Per controllare le prestazioni etcd e del disco, utilizza le seguenti metriche di latenza I/O etcd in Metrics Explorer:
etcd_disk_backend_commit_duration_seconds
: la durata deve essere inferiore a 25 millisecondi per il 99° percentile (p99).etcd_disk_wal_fsync_duration_seconds
: la durata deve essere inferiore a 10 millisecondi per il 99° percentile (p99).
Per ulteriori informazioni sulle prestazioni etcd, consulta Che cosa significa l'avviso etcd "applicare le voci troppo lungo"? e Che cosa significa l'avviso etcd "non è stato possibile inviare heartbeat in tempo"?.
Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.