Come qualsiasi cluster Kubernetes, la scalabilità dei cluster Google Distributed Cloud ha molte dimensioni interconnesse. Questo documento è inteso per aiutarti a comprendere le dimensioni chiave che puoi modificare per fare lo scale up dei cluster senza interrompere i workload.
Comprendere i 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 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 interconnesse. Per ulteriori informazioni sulle dimensioni che hanno un effetto sulla scalabilità, consulta le 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 alla configurazione hardware e 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 applicati ai cluster Google Distributed Cloud, consulta Quote e limiti.
Prepararsi alla scalabilità
Quando 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 dei nodi del control plane
La tabella seguente illustra la configurazione di CPU e memoria consigliata 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.cidrBlocksspecifica il numero di pod consentiti nel cluster.nodeConfig.podDensity.maxPodsPerNodespecifica il numero massimo di pod che possono essere eseguiti su un singolo nodo.clusterNetwork.services.cidrBlocksspecifica il numero di servizi consentiti nel cluster.
CIDR dei pod e numero massimo di nodi
Il numero totale di indirizzi IP riservati ai pod nel cluster è uno dei fattori limitanti per la scalabilità del cluster. Questa impostazione, insieme all'impostazione del 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/16specifica un intervallo di 65.536 indirizzi IP da192.168.0.0a192.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 prevenire 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 ogni nodo, ottieni il numero totale di nodi che puoi avere nel cluster.
Ad esempio, se il CIDR dei 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).
In questo caso, il numero massimo di nodi è 64 (215 indirizzi/cluster divisi 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 massimi consigliati per i pod per
cluster, i pod per nodo e i nodi per cluster in base ai test, consulta
Limiti.
CIDR servizio
Puoi aggiornare il CIDR del servizio 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 del servizio range.
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 abbiano le risorse di cui hanno bisogno. Senza questa funzionalità, i pod possono potenzialmente consumare la maggior parte delle risorse su un nodo, rendendo impossibile ai daemon di sistema completare le loro attività.
In particolare, 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 un 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 dei 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 allocate.
Networking con MetalLB
Potresti voler aumentare il numero di speaker MetalLB per risolvere 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 ogni nodo speaker. L'aumento del traffico di rete richiede più speaker.
Tolleranza agli errori: un numero maggiore di speaker riduce l'impatto complessivo di un singolo errore dello 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 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.
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 ha questa limitazione. Per ulteriori informazioni, consulta Modalità di bilanciamento del carico manuale.
Esecuzione di molti nodi, pod e servizi
L'aggiunta di nodi, pod e servizi è un modo per fare lo scale up del cluster. Le sezioni seguenti trattano alcune impostazioni e configurazioni aggiuntive da considerare quando aumenti il numero di nodi, pod e servizi nel cluster. Per informazioni sui limiti di queste dimensioni e sul loro rapporto, consulta Limiti.
Creare un cluster senza kube-proxy
Per creare un cluster ad alte prestazioni che possa 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à sostituzione di kube-proxy. Questa modalità evita il consumo di risorse necessario per mantenere un insieme di regole iptables di grandi dimensioni.
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
ulteriori informazioni, consulta Creare un cluster senza
kube-proxy.
Configurazione di CoreDNS
Questa sezione descrive gli aspetti di CoreDNS che influiscono sulla scalabilità dei cluster.
DNS dei pod
Per impostazione predefinita, i cluster Google Distributed Cloud inseriscono nei pod un file 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 nomi di dominio completi (FQDN). Il server DNS aggiunge tutti i domini di ricerca specificati prima di cercare il nome host richiesto originariamente, il che ordina le ricerche come segue quando risolve google.com:
google.com.NAMESPACE.svc.cluster.localgoogle.com.svc.cluster.localgoogle.com.cluster.localgoogle.com.c.PROJECT_ID.internalgoogle.com.google.internalgoogle.com
Ogni ricerca viene eseguita per IPv4 (record A) e IPv6 (record AAAA), con un conseguente numero di 12 richieste DNS per ogni query non FQDN, che amplifica notevolmente il traffico DNS. Per attenuare 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 resolv.conf pagina
man.
IPv6
Se il cluster non utilizza IPv6, è possibile ridurre le richieste DNS della metà eliminando la ricerca del record AAAA sul server DNS upstream. Se hai
bisogno di aiuto per disattivare le ricerche AAAA, contatta l'assistenza clienti Google Cloud.
Pool di nodi dedicati
A causa della 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 rispetto alle applicazioni normali. Se
hai bisogno di aiuto per configurare nodi dedicati per il deployment coredns, contatta
l'assistenza clienti Google Cloud.
Problemi di scalabilità di MetalLB
MetalLB viene eseguito in modalità attivo-passivo, il che significa che in qualsiasi momento è presente un solo speaker MetalLB che gestisce 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 presentare un rischio di affidabilità per il cluster.
Limiti di connessione
Se esiste un VIP LoadBalancer specifico, 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 possa esaurire le
porte disponibili. A causa di una limitazione dell'architettura, non esiste alcuna 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 di utilizzare una classe Ingress 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 control plane 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 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 i deployment di produzione, ti consigliamo di utilizzare tre nodi del control plane per l'alta affidabilità. Aumentare il numero di nodi del control plane oltre tre per ospitare speaker aggiuntivi potrebbe non essere un buon utilizzo delle risorse.
Configurazione di Ingress
Se prevedi un numero di connessioni simultanee pari o superiore a 30.000 a un singolo VIP del servizio LoadBalancer, MetalLB potrebbe non essere in grado di supportarlo.
Puoi prendere in considerazione l'esposizione del VIP 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
Nei cluster di grandi dimensioni, a seconda dei profili delle applicazioni e del pattern di traffico, le configurazioni delle risorse predefinite per i componenti di 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 ed endpoint potrebbe causare un utilizzo eccessivo della memoria utilizzata 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 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 nodi in modo che si adatti al meglio al 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 richiedono l'ottimizzazione. 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...
L'ottimizzazione in genere varia in base ai tipi di workload e alla configurazione hardware. Puoi consultare il fornitore del sistema operativo per le best practice specifiche del sistema operativo.
Best practice
Questa sezione descrive le best practice per la scalabilità 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. La scalabilità simultanea di più dimensioni può causare problemi anche nei cluster più piccoli. Ad esempio, se provi ad aumentare il numero di pod pianificati per nodo a 110 e contemporaneamente aumenti il numero di nodi nel cluster a 250, è probabile che l'operazione non vada a buon fine perché il numero di pod, il numero di pod per nodo e il numero di nodi sono troppo elevati.
Scalare i cluster in fasi
La scalabilità di un cluster può richiedere molte risorse. Per ridurre il rischio di errori nelle operazioni del cluster o di interruzioni dei workload del cluster, ti sconsigliamo di tentare di creare cluster di grandi dimensioni con molti nodi in una singola 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, è preferibile creare prima un cluster ad alta disponibilità (HA) con nodi del control plane e poi fare 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 HA, puoi utilizzarlo per fare lo scale up a un numero maggiore di nodi.
Aumentare il numero di nodi worker in batch
Se stai espandendo un cluster a un numero maggiore di nodi worker, è preferibile espandere in fasi. Ti consigliamo di aggiungere non più di 20 nodi alla volta. Questo è particolarmente vero per i cluster che eseguono workload critici.
Attivare 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 attenuare questo problema, ti consigliamo di impostare serializeImagePulls su false nella configurazione kubelet personalizzata. Per istruzioni e ulteriori informazioni, consulta
Configurare le impostazioni di pull delle immagini 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 delle applicazioni
Negli ambienti densamente compressi, i workload delle applicazioni potrebbero essere eliminati. Kubernetes utilizza il meccanismo di riferimento per classificare i pod in caso di eliminazione.
Una best practice per l'impostazione delle risorse dei container è utilizzare la stessa quantità di memoria per le richieste e i limiti e un limite di CPU più grande o illimitato. Per ulteriori informazioni, consulta Preparare le applicazioni Kubernetes basate sul cloud nel Cloud Architecture Center.
Utilizzare un partner di archiviazione
Ti consigliamo di utilizzare uno dei partner di archiviazione GDC Ready per i deployment su larga scala. È importante confermare le seguenti informazioni con il partner di archiviazione specifico:
- I deployment di archiviazione seguono le best practice per gli aspetti di archiviazione, come alta affidabilità, 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 eseguire il deployment.
Configurare i cluster per l'alta affidabilità
È 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 le opzioni di deployment HA per tutti i tipi di cluster. Per ulteriori informazioni, consulta Scelta di un modello di deployment. Per i file di configurazione dei cluster di esempio dei 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 suggerimenti di monitoraggio di base per i cluster su larga scala.
Monitorare 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 scoprire 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 del rendimento del cluster.
Migliorare il rendimento di etcd
La velocità del disco è fondamentale per il rendimento 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 il rendimento del 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 di 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 dei client.
Ti consigliamo di utilizzare un disco a stato solido (SSD) per gli archivi etcd. Per
un rendimento ottimale, 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 il miglior rendimento di etcd quando esegui i cluster in produzione.
Per controllare il rendimento 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, consulta Cosa significa l'avviso etcd "apply entries took too long" mean? e Cosa significa l'avviso etcd "failed to send out heartbeat on time" mean?.
Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud. Puoi anche consultare Richiedere assistenza per ulteriori informazioni sulle risorse di assistenza, tra cui:
- Requisiti per l'apertura di una richiesta di assistenza.
- Strumenti per la risoluzione dei problemi, come la configurazione dell'ambiente, i log e le metriche.
- Componenti supportati.