Come qualsiasi cluster Kubernetes, la scalabilità del cluster Google Distributed Cloud ha molte dimensioni interconnesse. Lo scopo di questo documento è aiutarti a comprendere le dimensioni chiave che puoi modificare per eseguire lo scaling dei tuoi cluster senza interrompere i carichi di lavoro.
Informazioni sui limiti
Google Distributed Cloud è un sistema complesso con una vasta superficie di integrazione. Esistono molte dimensioni che influiscono sulla scalabilità del cluster. Ad esempio, il numero di nodi è solo una delle molte dimensioni su cui Google Distributed Cloud può scalare. Altre dimensioni includono il numero totale di pod e servizi. Molte di queste dimensioni, come il numero di pod per nodo e il numero di nodi per cluster, sono correlate. Per ulteriori informazioni sulle dimensioni che influiscono sulla scalabilità, consulta le soglie di scalabilità di Kubernetes nella sezione del gruppo di interesse speciale (SIG) sulla scalabilità 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 vengono verificati in un ambiente probabilmente diverso dal tuo. Di conseguenza, potresti non riprodurre gli stessi numeri quando l'ambiente di base è il fattore limitante.
Per ulteriori informazioni sui limiti che si applicano ai tuoi cluster Google Distributed Cloud, consulta Quote e limiti.
Prepararsi alla scalabilità
Quando ti prepari a scalare i tuoi cluster Google Distributed Cloud, tieni conto dei requisiti e delle limitazioni descritti nelle sezioni seguenti.
Requisiti di CPU e memoria del nodo del control plane
La tabella seguente illustra la configurazione consigliata per 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 del control plane consigliate | Memoria consigliata per il control plane |
---|---|---|
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 del pod e numero massimo di nodi
Il numero totale di indirizzi IP riservati ai pod nel cluster è uno dei fattori limitanti per l'aumento di scala del cluster. Questa impostazione, insieme all'impostazione per il 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 per i pod.
Considera quanto segue:
Il numero totale di indirizzi IP riservati per i pod nel cluster viene specificato con
clusterNetwork.pods.cidrBlocks
, che accetta un intervallo di indirizzi IP specificati in notazione CIDR. Ad esempio, il valore precompilato192.168.0.0/16
specifica un intervallo di 65.536 indirizzi IP da192.168.0.0
a192.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 contribuiscono a impedire il riutilizzo involontario degli IP dei pod in un breve lasso di tempo.
Se dividi 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, ottieni il numero totale di nodi che puoi avere nel cluster.
Ad esempio, se il CIDR del 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 è approssimativamente
equivalente a un blocco CIDR /23
(2(32-23) = 29 = 512).
Pertanto, il numero massimo di nodi in questo caso è 64 (215
indirizzi/cluster diviso per 29 indirizzi/nodo = 2(15-9)
nodi/cluster = 26 = 64 nodi/cluster).
Sia clusterNetwork.pods.cidrBlocks
sia nodeConfig.podDensity.maxPodsPerNode
sono immuabili, quindi pianifica attentamente la crescita futura del tuo cluster per
evitare di esaurire la capacità dei nodi. Per i valori massimi consigliati per i pod per cluster, i pod per nodo e i nodi per cluster in base ai test, consulta Limiti.
CIDR servizio
Il CIDR del servizio può essere aggiornato per aggiungere altri servizi man mano che esegui l'upgrade del cluster. Tuttavia, non puoi ridurre l'intervallo CIDR del servizio. Per ulteriori informazioni, consulta Aumentare l'intervallo della rete di servizio.
Risorse riservate ai demoni di sistema
Per impostazione predefinita, Google Distributed Cloud riserva automaticamente risorse su un nodo per i demoni di sistema, ad esempio sshd
o udev
. Le risorse di CPU e memoria sono riservate su un nodo per i demoni di sistema in modo che questi demoni dispongano delle risorse di cui hanno bisogno. Senza questa funzionalità, i pod possono potenzialmente consumare la maggior parte delle risorse su un nodo, rendendo impossibile per i demoni di sistema completare le loro attività.
Nello specifico, Google Distributed Cloud riserva 80 millicore di CPU (80 mCPU) e 280 mebibyte (280 MiB) di memoria su ogni nodo per i demoni di sistema. Tieni conto che l'unità CPU mCPU indica un millesimo di core, pertanto 80/1000 o l'8% di un core su ogni nodo è riservato ai demoni di sistema. La quantità di risorse riservate è ridotta e non ha un impatto significativo sul rendimento del pod. Tuttavia, kubelet su un nodo potrebbe espellere i pod se il loro utilizzo di CPU o memoria supera le quantità che sono state loro allocate.
Networking con MetalLB
Ti consigliamo di aumentare il numero di speaker MetalLB per gestire i seguenti aspetti:
larghezza di banda: la larghezza di banda dell'intero cluster per i servizi di bilanciamento del carico dipende dal numero di speaker e dalla larghezza di banda di ciascun nodo speaker. L'aumento del traffico di rete richiede più altoparlanti.
Tolleranza ai guasti: più altoparlanti riducono l'impatto complessivo di un singolo guasto.
MetalLB richiede connettività 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 su cui puoi installare gli speaker MetalLB.
Pianifica attentamente il numero di speaker MetalLB che vuoi avere nel cluster e determina il numero di nodi di livello 2 di cui hai bisogno. Per ulteriori informazioni, consulta Problemi di scalabilità di MetalLB.
Inoltre, quando utilizzi la modalità di bilanciamento del carico in bundle, i nodi del piano di controllo devono trovarsi anche nella stessa rete di livello 2. Il bilanciamento del carico manuale non ha questa limitazione. Per ulteriori informazioni, consulta la modalità del bilanciatore del carico manuale.
Eseguire molti nodi, pod e servizi
L'aggiunta di nodi, pod e servizi è un modo per eseguire lo scale up del cluster. Le seguenti sezioni trattano alcune impostazioni e configurazioni aggiuntive da prendere in considerazione quando aumenti il numero di nodi, pod e servizi nel cluster. Per informazioni sui limiti di queste dimensioni e sul loro rapporto tra loro, consulta Limiti.
Creare un cluster senza kube-proxy
Per creare un cluster ad alte prestazioni che può essere scalato 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 gestire un ampio insieme di regole iptables.
Non puoi disattivare l'utilizzo di kube-proxy
per un cluster esistente. Questa configurazione deve essere impostata al momento della creazione del cluster. Per istruzioni e maggiori informazioni, vedi Creare un cluster senza kube-proxy.
Configurazione di CoreDNS
Questa sezione descrive gli aspetti di CoreDNS che influiscono sulla scalabilità dei tuoi cluster.
DNS del pod
Per impostazione predefinita, i cluster Google Distributed Cloud iniettano pod con un 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
indica che gli host name 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 inizialmente richiesto,
che ordina le ricerche come segue 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), con un risultato di 12 richieste DNS per ogni query non FQDN, il che amplifica notevolmente il traffico DNS. Per attenuare il problema, ti consigliamo di dichiarare il nome host da cercare come FQDN aggiungendo un punto finale (google.com.
). Questa dichiarazione deve essere eseguita a livello di workload dell'applicazione. Per ulteriori informazioni, consulta la pagina del 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 a monte. Se hai bisogno di aiuto per disattivare le ricerche AAAA
, contatta l'assistenza clienti Google Cloud.
Pool di nodi dedicato
A causa della natura critica delle query DNS nei cicli di vita delle applicazioni, ti consigliamo di utilizzare nodi dedicati per il deployment di coredns
. Questo deployment rientra in un dominio in errore diverso rispetto alle normali applicazioni. Se hai bisogno di assistenza per la configurazione di nodi dedicati per il deployment di coredns
, contatta l'assistenza clienti Google Cloud.
Problemi di scalabilità di MetalLB
MetalLB funziona in modalità attiva/passiva, il che significa che in qualsiasi momento esiste un solo speaker MetalLB che serve un determinato VIP LoadBalancer
.
Failover
Prima della release 1.28.0 di Google Distributed Cloud, su larga scala, il failover di MetalLB poteva richiedere molto tempo e poteva rappresentare un rischio di affidabilità per il cluster.
Limiti di connessione
Se esiste un determinato LoadBalancer
VIP, ad esempio un servizio di ingresso, che si aspetta quasi o più di 30.000 connessioni simultanee, è probabile che il nodo speaker che gestisce il VIP esaurisca le porte disponibili. A causa di una limitazione dell'architettura,
non è prevista alcuna mitigazione di questo problema da parte di MetalLB. Valuta la possibilità di passare al bilanciamento del carico in bundle con BGP prima della creazione del cluster o utilizza una classe di ingresso diversa. Per ulteriori informazioni, consulta la sezione Configurazione di Ingress.
Speaker del 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 di 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 control plane per il bilanciamento del carico, devi aumentare il numero di macchine del control plane. Per le implementazioni di produzione, ti consigliamo di utilizzare tre nodi del piano di controllo per l'alta disponibilità. Aumentare il numero di nodi del piano di controllo oltre tre per ospitare altri speaker potrebbe non essere un buon utilizzo delle risorse.
Configurazione Ingress
Se prevedi quasi 30.000 connessioni simultanee in un singolo VIP
LoadBalancer
del servizio, MetalLB potrebbe non essere in grado di supportarlo.
Puoi prendere in considerazione l'esposizione dell'IP virtuale tramite altri meccanismi, come F5 BIG-IP. In alternativa, puoi creare un nuovo cluster utilizzando il bilanciamento del carico in bundle con BGP, che non presenta la stessa limitazione.
Ottimizzare i componenti di Cloud Logging e Cloud Monitoring
In cluster di grandi dimensioni, a seconda dei profili delle applicazioni e del pattern di traffico, le configurazioni predefinite delle risorse per i componenti Cloud Logging e Cloud Monitoring potrebbero non essere sufficienti. Per istruzioni su come ottimizzare le richieste e i limiti delle risorse per i componenti di osservabilità, consulta Configurare le risorse dei componenti di Stackdriver.
In particolare, kube-state-metrics nei cluster con un numero elevato di servizi
e endpoint potrebbe causare un utilizzo eccessivo della memoria sia sul
kube-state-metrics
stesso sia sul gke-metrics-agent
nello stesso nodo. L'utilizzo delle risorse di metrics-server può essere scalato anche in termini di nodi, pod e servizi. Se riscontri problemi di risorse su questi componenti, contatta l'
assistenza clienti Google Cloud.
Utilizzare sysctl per configurare il sistema operativo
Ti consigliamo di ottimizzare la configurazione del sistema operativo per i tuoi nodi in modo che si adatti al meglio al caso d'uso del tuo carico di lavoro. I parametri fs.inotify.max_user_watches
e
fs.inotify.max_user_instances
che controllano il numero di risorse inotify
spesso richiedono la regolazione. Ad esempio, se visualizzi messaggi di errore come quelli riportati di seguito, ti consigliamo di verificare 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...
La messa a punto in genere varia in base ai tipi di carico di lavoro e alla configurazione hardware. Puoi rivolgerti al fornitore del sistema operativo per consultare le best practice specifiche per il sistema operativo.
Best practice
Questa sezione descrive le best practice per eseguire lo scaling up del cluster.
Scala una dimensione alla volta
Per ridurre al minimo i problemi e semplificare il rollback delle modifiche, non modificare più di una dimensione alla volta. L'aumento di più dimensioni contemporaneamente può causare problemi anche in cluster più piccoli. Ad esempio, tentare di aumentare il numero di pod pianificati per nodo a 110 e contemporaneamente il numero di nodi nel cluster a 250 probabilmente non andrà a buon fine perché il numero di pod, il numero di pod per nodo e il numero di nodi sono troppo elevati.
Eseguire la scalabilità dei cluster in più fasi
L'aumento di un cluster può richiedere molte risorse. Per ridurre il rischio di fallimento delle operazioni del cluster o di interruzione dei carichi di lavoro del cluster, sconsigliamo di tentare di creare cluster di grandi dimensioni con molti nodi in un'unica operazione.
Creare cluster ibridi o autonomi senza nodi worker
Se stai creando un cluster ibrido o autonomo di grandi dimensioni con più di 50 nodi worker, è meglio creare prima un cluster ad alta disponibilità (HA) con nodi del control plane e poi eseguire gradualmente l'upgrade. L'operazione di creazione del cluster utilizza un cluster di bootstrap, che non è ad alta disponibilità e quindi è meno affidabile. Una volta creato il cluster ibrido o autonomo ad alta disponibilità, puoi utilizzarlo per eseguire lo scale up a più nodi.
Aumentare il numero di nodi worker in batch
Se stai espandendo un cluster con più nodi worker, è meglio farlo in più fasi. Ti consigliamo di aggiungere non più di 20 nodi alla volta. Questo è particolarmente vero per i cluster che eseguono carichi di lavoro critici.
Attivare i recuperi di immagini paralleli
Per impostazione predefinita, kubelet estrae le immagini in sequenza, una dopo l'altra. Se hai una connessione upstream scadente al server del registry delle immagini, un pull di immagini non valido può bloccare l'intera coda per un determinato pool di nodi.
Per attenuare il problema, ti consigliamo di impostare serializeImagePulls
su false
nella configurazione personalizzata di kubelet. Per istruzioni e ulteriori informazioni, consulta
Configurare le impostazioni di estrazione delle immagini kubelet.
L'attivazione dei tiri delle immagini in parallelo può causare picchi nel consumo della larghezza di banda della rete o dell'I/O del disco.
Ottimizzare le richieste e i limiti delle risorse dell'applicazione
In ambienti con un numero elevato di risorse, i carichi di lavoro delle applicazioni potrebbero essere espulsi. Kubernetes utilizza il meccanismo a cui si fa riferimento per classificare i pod in caso di espulsione.
Una buona prassi per impostare le risorse del container è utilizzare la stessa quantità di memoria per richieste e limiti e un limite della CPU più grande 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 GDC Ready per le implementazioni su larga scala. È importante verificare le seguenti informazioni con il partner di archiviazione specifico:
- I deployment dello spazio di archiviazione seguono le best practice per gli aspetti di archiviazione, come la disponibilità elevata, l'impostazione della priorità, le affinità dei nodi e le richieste e i limiti delle risorse.
- La versione dello spazio di archiviazione è qualificata con la versione specifica di Google Distributed Cloud.
- Il fornitore di servizi di archiviazione può supportare la scalabilità elevata che vuoi implementare.
Configurare i cluster per l'alta disponibilità
È importante eseguire il controllo del deployment su larga scala e assicurarsi che i componenti critici siano configurati per l'HA, ove possibile. Google Distributed Cloud supporta opzioni di deployment HA per tutti i tipi di cluster. Per ulteriori informazioni, consulta Scegliere un modello di implementazione. Ad esempio, i file di configurazione dei cluster dei deployment HA, consulta Esempi di configurazione dei cluster.
È importante anche eseguire la revisione di altri componenti, tra cui:
- Fornitore di servizi di archiviazione
- Webhook del cluster
Monitoraggio dell'utilizzo delle risorse
Questa sezione fornisce alcuni consigli di base per il monitoraggio dei cluster su larga scala.
Monitora attentamente le metriche di utilizzo
È fondamentale monitorare l'utilizzo sia dei nodi sia dei singoli componenti del sistema e assicurarsi che abbiano un margine di sicurezza sufficiente. Per sapere quali funzionalità di monitoraggio standard sono disponibili per impostazione predefinita, consulta Utilizzare le dashboard predefinite.
Monitorare il consumo di larghezza di banda
Monitora attentamente il consumo di larghezza di banda per assicurarti che la rete non sia saturata, il che comporta un calo delle prestazioni del cluster.
Migliorare le prestazioni di etcd
La velocità del disco è fondamentale per le prestazioni e la stabilità di etcd. Un disco lento aumenta la latenza delle richieste etcd, il che può causare problemi di stabilità del cluster. Per migliorare le prestazioni del cluster, Google Distributed Cloud archivia gli oggetti Event in un'istanza etcd distinta e dedicata. L'istanza etcd standard utilizza
/var/lib/etcd
come directory dei dati e la porta 2379 per le richieste dei client. L'istanza etcd-events utilizza /var/lib/etcd-events
come directory di dati e la porta 2382 per le richieste del client.
Ti consigliamo di utilizzare un disco a stato solido (SSD) per gli store etcd. Per prestazioni ottimali, monta dischi separati su /var/lib/etcd
e /var/lib/etcd-events
. L'utilizzo di dischi dedicati garantisce che le due istanze etcd non condividano l'I/O del disco.
La documentazione di etcd fornisce ulteriori consigli hardware per garantire le migliori prestazioni di etcd durante l'esecuzione dei cluster in produzione.
Per controllare le prestazioni di etcd e del disco, utilizza le seguenti metriche sulla latenza I/O di 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 sul rendimento di etcd, consulta Che cosa significa l'avviso etcd "L'applicazione delle voci ha richiesto troppo tempo"? e Che cosa significa l'avviso etcd "Impossibile inviare il messaggio heartbeat in tempo"?.
Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.