Come qualsiasi cluster Kubernetes, la scalabilità del cluster Google Distributed Cloud ha molte dimensioni interconnesse. Questo documento ha lo scopo di aiutarti a comprendere le dimensioni chiave che puoi modificare per scalare i cluster senza interrompere i carichi di lavoro.
Informazioni sui 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 tante 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 intercorrelate. Per maggiori informazioni sulle dimensioni che influiscono sulla scalabilità, consulta 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à dipendono anche dalla configurazione dell'hardware e dei nodi su cui viene eseguito 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 applicati ai cluster Google Distributed Cloud, consulta Quote e limiti.
Prepararsi alla scalabilità
Mentre ti prepari a scalare i cluster Google Distributed Cloud, tieni presente i requisiti e le limitazioni descritti nelle sezioni seguenti.
Requisiti di CPU e memoria del nodo del control plane
La seguente tabella descrive la configurazione consigliata di CPU e memoria per i nodi del control plane per i cluster che eseguono workload di produzione:
Numero di nodi del cluster | CPU del control plane consigliate | Memoria del control plane consigliata |
---|---|---|
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 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 riservati ai pod nel cluster è uno dei fattori limitanti per lo scale up del cluster. Questa impostazione, insieme a quella 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 ai 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 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 evitare il riutilizzo involontario degli IP dei pod in un breve periodo 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, ottieni il numero totale di nodi che puoi avere nel cluster.
Ad esempio, se il CIDR 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 equivale approssimativamente 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 immutabili, quindi pianifica attentamente la crescita futura del 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 Limiti.
CIDR servizio
Il CIDR del servizio può essere aggiornato per aggiungere altri servizi man mano che aumenti le dimensioni del cluster. Tuttavia, non puoi ridurre l'intervallo CIDR del servizio. Per ulteriori informazioni, vedi Aumentare l'intervallo della rete di servizi.
Risorse riservate ai daemon di sistema
Per impostazione predefinita, Google Distributed Cloud riserva automaticamente le risorse su un nodo per i 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 di un nodo, rendendo impossibile ai daemon di sistema completare le proprie 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 daemon di sistema. Tieni presente che l'unità CPU mCPU sta per millesimo di core, quindi l'80/1000 o l'8% di un core su ogni nodo è riservato ai daemon di sistema. La quantità di risorse riservate è piccola e non ha un impatto significativo sul rendimento del pod. Tuttavia, il kubelet su un nodo può eliminare i pod se il loro utilizzo di CPU o memoria supera le quantità che sono state loro allocate.
Networking con MetalLB
Potresti voler aumentare il numero di speaker MetalLB per risolvere i seguenti aspetti:
Larghezza di banda: l'intera larghezza di banda del 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ù speaker.
Tolleranza agli errori: più speaker riducono l'impatto complessivo del guasto di un singolo speaker.
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 inserire i router MetalLB.
Pianifica attentamente il numero di speaker MetalLB che 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 control plane devono trovarsi nella stessa rete di livello 2. Il bilanciamento del carico manuale non presenta questa limitazione. Per ulteriori informazioni, vedi Modalità di bilanciamento del carico manuale.
Esecuzione di molti nodi, pod e servizi
L'aggiunta di nodi, pod e servizi è un modo per scalare il cluster. Le sezioni seguenti 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, consulta la sezione Limiti.
Crea un cluster senza kube-proxy
Per creare un cluster ad alte prestazioni che possa 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 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 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 i nomi host con meno di 5 punti non sono
considerati un nome di dominio completo (FQDN). L'app DNS Server aggiunge tutti i domini di ricerca specificati prima di cercare il nome host richiesto originariamente, 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
Ciascuna ricerca viene eseguita per IPv4 (record A) e IPv6 (record AAAA),
con conseguenti 12 richieste DNS per ogni query non FQDN, il che amplifica
in modo significativo il traffico DNS. Per risolvere questo 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 man resolv.conf
.
IPv6
Se il cluster non utilizza IPv6, è possibile ridurre le richieste DNS della metà eliminando la ricerca del record AAAA
nel server DNS upstream. 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 undominio in erroree diverso rispetto alle applicazioni normali. Se
hai bisogno di assistenza per configurare nodi dedicati per il deployment di coredns
, contatta
l'assistenza clienti Google Cloud.
Problemi di scalabilità di MetalLB
MetalLB viene eseguito in modalità attivo-passiva, il che significa che in qualsiasi momento è presente
un solo speaker MetalLB che gestisce un particolare VIP LoadBalancer
.
Failover
Prima della release 1.28.0 di Google Distributed Cloud, in caso di failover su larga scala di MetalLB, l'operazione poteva richiedere molto tempo e presentare un rischio di affidabilità per il cluster.
Limiti di connessione
Se esiste un LoadBalancer
VIP particolare, ad esempio un servizio Ingress, che
prevede un numero di connessioni simultanee pari o superiore a 30.000, è probabile che
il nodo speaker che gestisce il VIP esaurisca le porte
disponibili. A causa di una limitazione dell'architettura,
non esiste una mitigazione per questo problema da MetalLB. Valuta la possibilità di passare al
bilanciamento del carico in bundle con BGP prima
della creazione del cluster o utilizza una classe Ingress diversa. Per ulteriori informazioni, vedi
Configurazione Ingress.
Altoparlanti 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 che per il piano dati. Se non specifichi un pool di nodi del bilanciatore del carico
(loadBalancer.nodePoolSpec
), viene utilizzato il pool di nodi del control plane (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 control plane per l'alta disponibilità. Aumentare il numero di nodi del control plane oltre tre per ospitare speaker aggiuntivi potrebbe non essere un buon utilizzo delle risorse.
Configurazione Ingress
Se prevedi circa 30.000 connessioni simultanee in un unico
VIP del servizio LoadBalancer
, MetalLB potrebbe non essere in grado di supportarle.
Puoi prendere in considerazione l'idea di esporre il 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 presenta la stessa limitazione.
Ottimizza i componenti di Cloud Logging e Cloud Monitoring
Nei cluster di grandi dimensioni, a seconda dei profili delle applicazioni e del pattern di traffico, le configurazioni delle risorse predefinite 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 Configurazione delle risorse dei componenti di Stackdriver.
In particolare, kube-state-metrics nei cluster con un numero elevato di servizi
ed endpoint potrebbe causare un utilizzo eccessivo della memoria sia su
kube-state-metrics
stesso sia su gke-metrics-agent
sullo stesso nodo. L'utilizzo delle risorse di metrics-server può anche essere fare lo scale in termini di nodi, pod e servizi. Se riscontri problemi con le risorse di 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 nodi
in modo che si adattino al meglio al tuo caso d'uso del workload. I parametri fs.inotify.max_user_watches
e
fs.inotify.max_user_instances
che controllano il numero di risorse inotify
spesso devono essere ottimizzati. Ad esempio, se visualizzi messaggi di errore come i
seguenti, potresti provare a verificare se questi parametri devono essere
ottimizzati:
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 varia in genere in base ai tipi di workload e alla configurazione hardware. Puoi consultare il fornitore del sistema operativo per informazioni sulle best practice specifiche del 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. L'aumento simultaneo di più dimensioni può causare problemi anche nei cluster più piccoli. Ad esempio, il tentativo di aumentare il numero di pod pianificati per nodo a 110 aumentando 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.
Scalabilità dei cluster in più fasi
Lo scale up di un cluster può richiedere molte risorse. Per ridurre il rischio di errori nelle operazioni del cluster o interruzioni dei carichi di lavoro del cluster, 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, è meglio creare prima un cluster ad alta disponibilità (HA) con nodi del control plane e poi eseguire lo scale up gradualmente. L'operazione di creazione del cluster utilizza un cluster di bootstrap, che non è HA e quindi è meno affidabile. Una volta creato il cluster ibrido o autonomo ad alta disponibilità, puoi utilizzarlo per scalare a più nodi.
Aumentare il numero di nodi worker in batch
Se espandi un cluster a più nodi worker, è meglio eseguire l'espansione in più fasi. Ti consigliamo di aggiungere non più di 20 nodi alla volta. Ciò vale soprattutto per i cluster che eseguono carichi di lavoro critici.
Abilita i pull di immagini paralleli
Per impostazione predefinita, kubelet esegue il pull delle immagini in serie, una dopo l'altra. Se hai una connessione upstream scadente al server del registro delle immagini, un pull di immagini scadente può bloccare l'intera coda per un determinato pool di nodi.
Per risolvere il problema, ti consigliamo di impostare serializeImagePulls
su false
nella
configurazione kubelet personalizzata. Per istruzioni e ulteriori informazioni, vedi
Configurare le impostazioni di pull delle immagini di kubelet.
L'attivazione dei pull di immagini paralleli può introdurre picchi nel consumo di larghezza di banda di rete o I/O del disco.
Ottimizzare le richieste e i limiti delle risorse dell'applicazione
Negli ambienti densamente compattati, i carichi di lavoro delle applicazioni potrebbero essere eliminati. Kubernetes utilizza il meccanismo di riferimento per classificare i pod in caso di espulsione.
Una buona pratica per impostare le risorse del container è utilizzare la stessa quantità di memoria per richieste e limiti e un limite di CPU più elevato o illimitato. Per ulteriori informazioni, consulta Preparare applicazioni Kubernetes basate sul cloud nel Centro architettura cloud.
Utilizzare un partner di archiviazione
Per le implementazioni su larga scala, ti consigliamo di utilizzare uno dei partner di archiviazione GDC Ready. È 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 alta disponibilità, impostazione della priorità, affinità dei nodi e richieste e limiti delle risorse.
- La versione di archiviazione è qualificata con la versione specifica di Google Distributed Cloud.
- Il fornitore di spazio di archiviazione può supportare la scalabilità elevata che vuoi implementare.
Configura i cluster per l'alta disponibilità
È importante controllare il deployment su larga scala e assicurarsi che i componenti critici siano configurati per l'alta disponibilità, ove possibile. Google Distributed Cloud supporta opzioni di deployment HA per tutti i tipi di cluster. Per ulteriori informazioni, consulta la sezione Scegliere un modello di deployment. Per esempi di file di configurazione del cluster di deployment HA, consulta Esempi di configurazione dei cluster.
È anche importante controllare altri componenti, tra cui:
- Fornitore di spazio di archiviazione
- Webhook del cluster
Monitoraggio dell'utilizzo delle risorse
Questa sezione fornisce alcuni consigli di base per il monitoraggio di 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 di sicurezza confortevole. Per vedere 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 satura, il che comporta un peggioramento 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
dedicata separata. L'istanza etcd standard utilizza
/var/lib/etcd
come directory di dati e la porta 2379 per le richieste client. L'istanza
etcd-events utilizza /var/lib/etcd-events
come directory dei dati e la porta
2382 per le richieste 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'utilizzo di dischi dedicati garantisce che le due istanze etcd
non condividano l'I/O del disco.
La documentazione di etcd fornisce ulteriori consigli sull'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 di 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, vedi Che cosa significa l'avviso etcd "apply entries took too long"? e Che cosa significa l'avviso etcd "failed to send out heartbeat on time"?.
Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud. Puoi anche consultare la sezione Richiedere assistenza per ulteriori informazioni sulle risorse di assistenza, tra cui:
- Requisiti per l'apertura di una richiesta di assistenza.
- Strumenti per aiutarti a risolvere i problemi, ad esempio la configurazione dell'ambiente, i log e le metriche.
- Componenti supportati.