Questo documento mostra come personalizzare la configurazione dei nodi di Google Kubernetes Engine (GKE) utilizzando un file di configurazione chiamato configurazione di sistema dei nodi.
Una configurazione di sistema del nodo è un file di configurazione che consente di
modificare un insieme limitato di impostazioni di sistema. Nel tuo pool di nodi, puoi utilizzare una configurazione di sistema del nodo per specificare impostazioni personalizzate per l'agente del nodo Kubernetes kubelet e per le configurazioni del kernel Linux di basso livello sysctl.
Questo documento descrive in dettaglio le configurazioni disponibili per una configurazione del sistema di nodi e come applicarle ai node pool GKE Standard. Tieni presente che, poiché i cluster GKE Autopilot hanno un ambiente dei nodi più gestito, le loro opzioni di configurazione diretta del sistema dei nodi sono limitate rispetto ai pool di nodi GKE Standard.
Perché utilizzare le configurazioni del sistema di nodi
Le configurazioni del sistema di nodi offrono i seguenti vantaggi:
- Ottimizzazione delle prestazioni:ottimizza le prestazioni dello stack di rete, la gestione della memoria, la pianificazione della CPU o il comportamento I/O per applicazioni esigenti come l'addestramento o il servizio di AI, i database, i server web con traffico elevato o i servizi sensibili alla latenza.
- Rafforzamento della sicurezza:applica impostazioni di sicurezza specifiche a livello di kernel o limita determinati comportamenti del sistema per ridurre la superficie di attacco.
- Gestione delle risorse:perfeziona il modo in cui
kubeletgestisce PID, spazio su disco, garbage collection delle immagini o risorse di CPU e memoria. - Compatibilità del workload:contribuisce a garantire che l'ambiente dei nodi soddisfi prerequisiti specifici per software specializzati o applicazioni meno recenti che richiedono impostazioni del kernel particolari.
Altre opzioni per personalizzare le configurazioni dei nodi
Puoi anche personalizzare la configurazione dei nodi utilizzando altri metodi:
- File di configurazione del runtime: per personalizzare un runtime dei container containerd sui nodi GKE, puoi utilizzare un file diverso chiamato file di configurazione del runtime. Per saperne di più, consulta Personalizzare la configurazione di containerd nei nodi GKE.
- ComputeClass: puoi specificare gli attributi dei nodi nella specifica ComputeClass di GKE. Puoi utilizzare ComputeClass sia in modalità GKE Autopilot che in modalità Standard in GKE versione 1.32.1-gke.1729000 e successive. Per saperne di più, consulta Personalizza la configurazione del sistema dei nodi.
- DaemonSets: puoi anche utilizzare DaemonSet per personalizzare i nodi. Per saperne di più, consulta Eseguire il bootstrapping automatico dei nodi GKE con DaemonSet.
Le configurazioni di sistema dei nodi non sono supportate nei nodi Windows Server.
Prima di iniziare
Prima di iniziare, assicurati di:
- Installa gli strumenti a riga di comando:
- Se utilizzi gli esempi di gcloud CLI in questo documento, assicurati di installare e configurare Google Cloud CLI.
- Se utilizzi gli esempi di Terraform, assicurati di installare e configurare Terraform.
- Concedi autorizzazioni: devi disporre delle autorizzazioni IAM appropriate per creare e aggiornare i cluster GKE e i node pool, ad esempio
container.clusterAdmino un ruolo diverso con autorizzazioni equivalenti. - Pianifica potenziali interruzioni del carico di lavoro: le configurazioni dei nodi personalizzate vengono applicate a livello di pool di nodi. In genere le modifiche attivano un aggiornamento in sequenza dei nodi nel pool, che comporta la ricreazione dei nodi. Pianifica potenziali interruzioni del workload e utilizza i budget di interruzione dei pod (PDB) se appropriato.
- Esegui il backup e testa tutte le modifiche: testa sempre le modifiche alla configurazione in un ambiente di staging o di sviluppo prima di applicarle alla produzione. Impostazioni errate possono causare l'instabilità dei nodi o errori dei workload.
- Controlla le impostazioni predefinite di GKE: le immagini dei nodi GKE vengono fornite con configurazioni predefinite ottimizzate. Personalizza i parametri solo se hai un'esigenza specifica e comprendi l'impatto delle modifiche.
Utilizzare una configurazione del sistema di nodi in modalità GKE Standard
Quando utilizzi una configurazione di sistema dei nodi, utilizzi un file YAML che contiene i parametri di configurazione per kubelet e il kernel Linux. Sebbene le configurazioni del sistema dei nodi siano disponibili anche in modalità GKE Autopilot, i passaggi descritti in questo documento mostrano come creare e utilizzare un file di configurazione per la modalità GKE Standard.
Per utilizzare una configurazione di sistema dei nodi in modalità GKE Standard, procedi nel seguente modo:
- Crea un file di configurazione. Questo file contiene le configurazioni di
kubeletesysctl. - Aggiungi la configurazione quando crei un cluster o quando crei o aggiorni un pool di nodi.
Creare un file di configurazione
Scrivi la configurazione del sistema dei nodi in YAML. L'esempio seguente aggiunge
le configurazioni per le opzioni kubelet e sysctl:
kubeletConfig:
cpuManagerPolicy: static
allowedUnsafeSysctls:
- 'kernel.shm*'
- 'kernel.msg*'
- 'kernel.sem'
- 'fs.mqueue*'
- 'net.*'
linuxConfig:
sysctl:
net.core.somaxconn: '2048'
net.ipv4.tcp_rmem: '4096 87380 6291456'
In questo esempio, si applica quanto segue:
- Il campo
cpuManagerPolicy: staticconfigurakubeletper utilizzare la policy di gestione statica della CPU. + Il camponet.core.somaxconn: '2048'limita il backlogsocket listen()a 2048 byte. - Il campo
net.ipv4.tcp_rmem: '4096 87380 6291456'imposta il valore minimo, predefinito e massimo del buffer di ricezione del socket TCP rispettivamente su 4096 byte, 87.380 byte e 6.291.456 byte.
Se vuoi aggiungere configurazioni solo per kubelet o sysctl, includi
solo quella sezione nella configurazione di sistema del nodo. Ad esempio, per aggiungere una
configurazione kubelet, crea il seguente file:
kubeletConfig:
cpuManagerPolicy: static
Per un elenco completo dei campi che puoi aggiungere alla configurazione del sistema di nodi, consulta le sezioni Opzioni di configurazione di Kubelet e Opzioni di configurazione di Sysctl.
Aggiungi la configurazione a un pool di nodi Standard
Dopo aver creato la configurazione del sistema dei nodi, aggiungi il flag
--system-config-from-file
utilizzando Google Cloud CLI. Puoi aggiungere questo flag quando crei un cluster o quando crei o aggiorni un pool di nodi. Non puoi aggiungere una configurazione
del sistema del nodo utilizzando la console Google Cloud .
Crea un cluster con la configurazione di sistema del nodo
Puoi aggiungere una configurazione di sistema dei nodi durante la creazione del cluster utilizzando gcloud CLI o Terraform. Le seguenti istruzioni applicano la configurazione del sistema dei nodi al pool di nodi predefinito:
Interfaccia a riga di comando gcloud
gcloud container clusters create CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
Sostituisci quanto segue:
CLUSTER_NAME: il nome del clusterLOCATION: la zona di computing o la regione del clusterSYSTEM_CONFIG_PATH: il percorso del file che contiene le configurazioni dikubeletesysctl
Dopo aver applicato una configurazione del sistema di nodi, il pool di nodi predefinito del cluster utilizza le impostazioni che hai definito.
Terraform
Per creare un cluster regionale con una configurazione di sistema dei nodi personalizzata utilizzando Terraform, consulta il seguente esempio:
Per saperne di più sull'utilizzo di Terraform, consulta Supporto di Terraform per GKE.
Crea un nuovo pool di nodi con la configurazione del sistema dei nodi
Puoi aggiungere una configurazione di sistema dei nodi quando utilizzi gcloud CLI o Terraform per creare un nuovo pool di nodi.
Le seguenti istruzioni applicano la configurazione del sistema di nodi a un nuovo node pool:
Interfaccia a riga di comando gcloud
gcloud container node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
Sostituisci quanto segue:
POOL_NAME: il nome del pool di nodiCLUSTER_NAME: il nome del cluster a cui vuoi aggiungere un pool di nodiLOCATION: la zona di computing o la regione del clusterSYSTEM_CONFIG_PATH: il percorso del file che contiene le configurazioni dikubeletesysctl
Terraform
Per creare un pool di nodi con una configurazione del sistema di nodi personalizzata utilizzando Terraform, consulta il seguente esempio:
Per saperne di più sull'utilizzo di Terraform, consulta Supporto di Terraform per GKE.
Aggiorna la configurazione del sistema di nodi di un pool di nodi esistente
Puoi aggiornare la configurazione del sistema di nodi di un pool di nodi esistente eseguendo il seguente comando:
gcloud container node-pools update POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
Sostituisci quanto segue:
POOL_NAME: il nome del pool di nodi che vuoi aggiornareCLUSTER_NAME: il nome del cluster che vuoi aggiornareLOCATION: la zona di computing o la regione del clusterSYSTEM_CONFIG_PATH: il percorso del file che contiene le configurazioni dikubeletesysctl
Questa modifica richiede la ricreazione dei nodi, il che può causare interruzioni ai carichi di lavoro in esecuzione. Per saperne di più su questa modifica specifica, trova la riga corrispondente nella tabella Modifiche manuali che ricreano i nodi utilizzando una strategia di upgrade dei nodi senza rispettare le norme di manutenzione.
Per ulteriori informazioni sugli aggiornamenti dei nodi, consulta Pianificazione delle interruzioni dell'aggiornamento dei nodi.
Modificare una configurazione del sistema di nodi
Per modificare una configurazione del sistema di nodi, puoi creare un nuovo pool di nodi con la configurazione che preferisci oppure aggiornare la configurazione del sistema di nodi di unpool di nodiol esistente.
Modifica creando un pool di nodi
Per modificare la configurazione di un sistema di nodi creando un pool di nodi:
- Crea un file di configurazione con la configurazione che preferisci.
- Aggiungi la configurazione a un nuovo pool di nodi.
- Esegui la migrazione dei workload al nuovo pool di nodi.
- Elimina il vecchio node pool.
Modifica aggiornando un pool di nodi esistente
Per modificare la configurazione del sistema dei nodi di un pool di nodi esistente, segui le istruzioni nella scheda Aggiorna node pool per aggiungere la configurazione a un node pool. Quando aggiorni una configurazione del sistema dei nodi e la nuova configurazione sostituisce quella esistente del sistema depool di nodiol, i nodi devono essere ricreati. Se ometti dei parametri durante un aggiornamento, questi vengono impostati sui rispettivi valori predefiniti.
Se vuoi ripristinare la configurazione del sistema del nodo ai valori predefiniti, aggiorna
il file di configurazione con valori vuoti per i campi kubelet e sysctl,
ad esempio:
kubeletConfig: {}
linuxConfig:
sysctl: {}
Eliminare una configurazione del sistema di nodi
Per rimuovere una configurazione del sistema di nodi:
- Crea un node pool.
- Esegui la migrazione dei workload al nuovo pool di nodi.
- Elimina il node pool con la vecchia configurazione del sistema dei nodi.
Opzioni di configurazione per kubelet
Le tabelle in questa sezione descrivono le opzioni kubelet che puoi modificare.
Gestione della CPU
La tabella seguente descrive le opzioni di gestione della CPU per kubelet.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
cpuCFSQuota |
Deve essere true o false. |
true |
Questa impostazione applica il limite della CPU del pod. Se imposti questo valore su false, i limiti di CPU per i pod vengono ignorati.Ignorare i limiti di CPU potrebbe essere utile in alcuni scenari in cui i pod sono sensibili a questi limiti. Il rischio di disattivare cpuCFSQuota è che un pod non autorizzato possa consumare più risorse CPU del previsto. |
cpuCFSQuotaPeriod |
Deve essere una durata di tempo. | "100ms" |
Questa impostazione imposta il valore del periodo di quota CFS della CPU, cpu.cfs_period_us, che specifica la frequenza con cui deve essere riassegnato l'accesso di un cgroup alle risorse della CPU. Questa opzione ti consente di ottimizzare il comportamento di limitazione della CPU. |
Gestione della memoria e rimozione
La tabella seguente descrive le opzioni modificabili per la gestione della memoria e
l'eliminazione. Questa sezione contiene anche una tabella separata che descrive le opzioni modificabili per il flag evictionSoft.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
evictionSoft |
Mappa dei nomi degli indicatori. Per le limitazioni dei valori, consulta la tabella seguente. | none |
Questa impostazione mappa i nomi dei segnali a una quantità o una percentuale che definisce le soglie di rimozione temporanea. Una soglia di sfratto temporaneo deve avere un periodo di tolleranza. kubelet non espelle i pod finché non viene superato il periodo di tolleranza. |
evictionSoftGracePeriod |
Mappa dei nomi degli indicatori. Per ogni nome dell'indicatore, il valore deve essere una durata positiva inferiore a 5m. Le unità di tempo valide sono ns, us (o µs), ms, s o m. |
none |
Questa impostazione mappa i nomi dei segnali alle durate che definiscono i periodi di tolleranza per le soglie di espulsione temporanea. Ogni soglia di sfratto soft deve avere un periodo di tolleranza corrispondente. |
evictionMinimumReclaim |
Mappa dei nomi degli indicatori. Per ogni nome dell'indicatore, il valore deve essere una percentuale positiva inferiore a 10%. |
none |
Questa impostazione mappa i nomi dei segnali alle percentuali che definiscono la quantità minima di una determinata risorsa che kubelet recupera quando esegue l'espulsione di un pod. |
evictionMaxPodGracePeriodSeconds |
Il valore deve essere un numero intero compreso tra 0 e 300. |
0 |
Questa impostazione definisce, in secondi, il periodo di tolleranza massimo per la terminazione del pod durante l'espulsione. |
La tabella seguente mostra le opzioni modificabili per il flag evictionSoft.
Le stesse opzioni si applicano anche ai flag evictionSoftGracePeriod e
evictionMinimumReclaim con restrizioni diverse.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
memoryAvailable |
Il valore deve essere una quantità maggiore di 100Mi e inferiore a 50% della memoria del nodo. |
none |
Questa impostazione rappresenta la quantità di memoria disponibile prima dell'eliminazione temporanea. Definisce la quantità di segnale memory.available in kubelet . |
nodefsAvailable |
Il valore deve essere compreso tra 10% e 50%. |
none |
Questa impostazione rappresenta il nodo file system disponibile prima dell'espulsione temporanea. Definisce la quantità di segnale nodefs.available in kubelet . |
nodefsInodesFree |
Il valore deve essere compreso tra 5% e 50%. |
none |
Questa impostazione rappresenta gli inode nodefs liberi prima dell'eliminazione temporanea. Definisce la quantità di segnale nodefs.inodesFree in kubelet . |
imagefsAvailable |
Il valore deve essere compreso tra 15% e 50%. |
none |
Questa impostazione rappresenta imagefs disponibile prima dell'eliminazione temporanea. Definisce la quantità di indicatore imagefs.available nel kubelet . |
imagefsInodesFree |
Il valore deve essere compreso tra 5% e 50%. |
none |
Questa impostazione rappresenta gli inode imagefs liberi prima dell'eliminazione temporanea. Definisce la quantità di segnale imagefs.inodesFree nel kubelet. |
pidAvailable |
Il valore deve essere compreso tra 10% e 50%. |
none |
Questa impostazione rappresenta i PID disponibili prima dell'eliminazione temporanea. Definisce la quantità di segnale pid.available in kubelet. |
singleProcessOOMKill
|
Il valore deve essere true o false. |
true per i nodi cgroupv1, false per i nodi cgroupv2. |
Questa impostazione determina se i processi nel container vengono terminati individualmente o come gruppo.
Disponibile nelle versioni 1.32.4-gke.1132000, 1.33.0-gke.1748000 o successive di GKE. |
Gestione PID
La tabella seguente descrive le opzioni modificabili per la gestione dei PID.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
podPidsLimit |
Il valore deve essere compreso tra 1024 e 4194304. |
none |
Questa impostazione definisce il numero massimo di ID processo (PID) che ogni pod può utilizzare. |
Logging
La tabella seguente descrive le opzioni modificabili per la registrazione.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
containerLogMaxSize |
Il valore deve essere un numero positivo e un suffisso di unità compreso tra 10Mi e 500Mi inclusi. |
10Mi |
Questa impostazione controlla l'impostazione containerLogMaxSize del criterio di rotazione dei log dei container, che consente di configurare le dimensioni massime per ogni file di log. Il valore predefinito è 10Mi. Le unità valide sono Ki, Mi e Gi. |
containerLogMaxFiles |
Il valore deve essere un numero intero compreso tra 2 e 10 inclusi. |
5 |
Questa impostazione controlla l'impostazione containerLogMaxFiles del criterio di rotazione dei file di log del contenitore, che consente di configurare il numero massimo di file consentiti per ogni contenitore rispettivamente. Il valore predefinito è 5. La dimensione totale dei log (container_log_max_size*container_log_max_files) per contenitore non può superare l'1% dello spazio di archiviazione totale del nodo. |
Garbage collection delle immagini
La seguente tabella descrive le opzioni modificabili per la garbage collection delle immagini.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
imageGCHighThresholdPercent |
Il valore deve essere un numero intero compreso tra 10 e 85 inclusi e superiore a imageGcLowThresholdPercent. |
85 |
Questa impostazione definisce la percentuale di utilizzo del disco al di sopra della quale viene eseguita la garbage collection delle immagini. Rappresenta l'utilizzo del disco più elevato per l'esecuzione della garbage collection. La percentuale viene calcolata dividendo il valore di questo campo per 100. |
imageGCLowThresholdPercent |
Il valore deve essere un numero intero compreso tra 10 e 85 inclusi e inferiore a imageGcHighThresholdPercent. |
80 |
Questa impostazione definisce la percentuale di utilizzo del disco prima della quale non viene mai eseguita la garbage collection delle immagini. Rappresenta l'utilizzo del disco più basso da raccogliere. La percentuale viene calcolata dividendo il valore di questo campo per 100. |
imageMinimumGcAge |
Il valore deve essere una durata di tempo non superiore a 2m. Le unità di tempo valide sono ns, us (o µs), ms, s, m o h. |
2m |
Questa impostazione definisce l'età minima di un'immagine inutilizzata prima che venga eseguita la garbage collection. |
imageMaximumGcAge |
Il valore deve essere una durata di tempo. | 0s |
Questa impostazione definisce l'età massima di un'immagine prima che venga sottoposta alla garbage collection. Il valore predefinito di questo campo è Disponibile nelle versioni GKE 1.30.7-gke.1076000, 1.31.3-gke.1023000 o successive. |
Pull delle immagini
La tabella seguente descrive le opzioni modificabili per il pull delle immagini.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
maxParallelImagePulls |
Il valore deve essere un numero intero compreso tra 2 e 5 inclusi. | 2 o 3 in base al tipo di disco. |
Questa impostazione definisce il numero massimo di pull di immagini in parallelo. Il valore predefinito è determinato dal tipo di disco di avvio. |
Sicurezza e operazioni non sicure
La tabella seguente descrive le opzioni modificabili per configurare la sicurezza e la gestione delle operazioni non sicure.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
allowedUnsafeSysctls |
Elenco di
|
none |
Questa impostazione definisce una lista consentita separata da virgole di nomi di sysctl non sicuri o gruppi di sysctl che possono essere impostati sui pod. |
insecureKubeletReadonlyPortEnabled |
Il valore deve essere booleano, ovvero true o false. |
true |
Questa impostazione disabilita la kubelet porta di sola lettura non sicura 10255 in ogni nuovo pool di nodi del cluster. Se configuri questa impostazione in questo file, non puoi utilizzare un client API GKE per modificarla a livello di cluster. |
Resource Manager
Kubernetes offre una suite di Resource Manager. Puoi configurare questi Resource Manager per coordinare e ottimizzare l'allineamento delle risorse dei nodi per i pod configurati con requisiti specifici per CPU, dispositivi e risorse di memoria (hugepages).
La tabella seguente descrive le opzioni modificabili per Resource Manager.
Impostazioni di configurazione kubelet |
Limitazioni | Impostazione predefinita | Descrizione |
|---|---|---|---|
cpuManagerPolicy |
Il valore deve essere none o static. |
none |
Questa impostazione controlla il kubelet criterio di gestione della CPU. Il valore predefinito è none, ovvero lo schema di affinità della CPU predefinito, che non fornisce affinità oltre a quella eseguita automaticamente dallo scheduler del sistema operativo.Se imposti questo valore su static, i pod che si trovano sia nella classe QoS Guaranteed sia con richieste di CPU intere possono essere assegnati a CPU esclusive. |
memoryManager.policy |
Il valore deve essere None o Static. |
None |
Questa impostazione controlla il Se imposti questo valore su Questa impostazione è supportata per i cluster con il control plane che esegue GKE versione 1.32.3-gke.1785000 o successive. |
topologyManager |
Il valore deve essere una delle impostazioni supportate per ciascuno dei rispettivi campi. Non puoi impostare il campo |
|
Queste impostazioni controllano la configurazione di Puoi impostare le impostazioni di criteri e ambito in modo indipendente l'una dall'altra. Per saperne di più su queste impostazioni, consulta Ambiti e policy di Topology Manager. Le seguenti risorse GKE supportano questa impostazione:
|
Opzioni di configurazione sysctl
Per ottimizzare le prestazioni del sistema, puoi modificare i parametri del kernel Linux. Le tabelle in questa sezione descrivono i vari parametri del kernel che puoi configurare.
Parametri del file system (fs.*)
La tabella seguente descrive i parametri modificabili per il file system Linux. Queste impostazioni controllano il comportamento del file system Linux, ad esempio i limiti di gestione dei file e il monitoraggio degli eventi.
Parametro Sysctl |
Limitazioni | Descrizione |
|---|---|---|
fs.aio-max-nr |
Deve essere compreso tra [65536, 4194304]. | Questa impostazione definisce il numero massimo a livello di sistema di richieste I/O asincrone. |
fs.file-max |
Deve essere compreso tra [104857, 67108864]. | Questa impostazione definisce il numero massimo di handle di file che il kernel Linux può allocare. |
fs.inotify.max_user_instances |
Deve essere compreso tra [8192, 1048576]. | Questa impostazione definisce il numero massimo di istanze inotify che un utente può creare. |
fs.inotify.max_user_watches |
Deve essere compreso tra [8192, 1048576]. | Questa impostazione definisce il numero massimo di inotify watch che un utente può creare. |
fs.nr_open |
Deve essere compreso tra [1048576, 2147483584]. | Questa impostazione definisce il numero massimo di descrittori di file che possono essere aperti da un processo. |
Parametri del kernel (kernel.*)
La seguente tabella descrive i parametri modificabili per il kernel Linux. Queste impostazioni configurano le funzionalità principali del kernel, inclusa l'allocazione della memoria condivisa.
| Parametro sysctl | Limitazioni | Descrizione |
|---|---|---|
kernel.shmmni |
Deve essere compreso tra [4096, 32768]. | Questa impostazione definisce il numero massimo di segmenti di memoria condivisa a livello di sistema. Se questo valore non è impostato, il valore predefinito è 4096. |
kernel.shmmax |
Il valore deve essere compreso tra [0, 18446744073692774399]. | Questa impostazione definisce le dimensioni massime, in byte, di un singolo segmento di memoria condivisa consentito dal kernel. Questo valore viene ignorato se è maggiore della quantità effettiva di RAM, il che significa che tutta la RAM disponibile può essere condivisa. |
kernel.shmall |
Il valore deve essere compreso tra [0, 18446744073692774399]. | Questa impostazione definisce la quantità totale di pagine di memoria condivisa che possono essere utilizzate sul sistema contemporaneamente. Una pagina è di 4096 byte sull'architettura AMD64 e Intel 64. |
kernel.perf_event_paranoid |
Deve essere compreso tra -1 e 3. | Questa impostazione controlla l'utilizzo del sistema di eventi di prestazioni da parte di utenti senza privilegi senza CAP_PERFMON. Il valore predefinito è 2 nel kernel. |
kernel.sched_rt_runtime_us |
Il valore deve essere compreso tra -1 e 1.000.000. | Questa impostazione definisce un limite globale alla quantità di tempo che può essere utilizzata dalla pianificazione in tempo reale. |
kernel.softlockup_panic |
Facoltativo (booleano). | Questa impostazione controlla se il kernel va in panico quando viene rilevato un soft lockup. |
kernel.yama.ptrace_scope |
Deve essere compreso tra [0, 3]. |
Questa impostazione definisce l'ambito e le limitazioni per la chiamata di sistema
|
kernel.kptr_restrict |
Deve essere compreso tra [0, 2]. | Questa impostazione indica se vengono imposte limitazioni all'esposizione degli indirizzi del kernel tramite /proc e altre interfacce. |
kernel.dmesg_restrict |
Facoltativo (booleano). | Questa impostazione indica se gli utenti senza privilegi possono utilizzare dmesg(8) per visualizzare i messaggi del buffer di log del kernel. |
kernel.sysrq |
Deve essere compreso tra [0, 511]. |
Questa impostazione controlla le funzioni che possono essere richiamate tramite il tasto SysRq. I valori possibili includono:
|
Parametri di rete (net.*)
La tabella seguente descrive i parametri modificabili per il networking. Queste impostazioni ottimizzano le prestazioni e il comportamento dello stack di rete, dai buffer dei socket al monitoraggio delle connessioni.
| Parametro Sysctl | Limitazioni | Descrizione |
|---|---|---|
net.core.busy_poll |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce il timeout di polling occupato a bassa latenza per il polling e la selezione. Rappresenta il tempo approssimativo in µs per il ciclo di attesa occupato per gli eventi. |
net.core.busy_read |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce il timeout di polling occupato a bassa latenza per le letture dei socket. Rappresenta il tempo approssimativo in µs per l'attesa del ciclo occupato per i pacchetti nella coda del dispositivo. |
net.core.netdev_max_backlog |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce il numero massimo di pacchetti in coda sul lato INPUT quando l'interfaccia riceve pacchetti più velocemente di quanto il kernel possa elaborarli. |
net.core.rmem_default |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce la dimensione predefinita del buffer del socket di ricezione, in byte. |
net.core.rmem_max |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce la dimensione massima del buffer del socket di ricezione, in byte. |
net.core.wmem_default |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce l'impostazione predefinita, in byte, del buffer di invio del socket. |
net.core.wmem_max |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce la dimensione massima del buffer del socket di invio, in byte. |
net.core.optmem_max |
Qualsiasi numero intero positivo inferiore a 2147483647. | Questa impostazione definisce la dimensione massima del buffer ausiliario consentita per socket. |
net.core.somaxconn |
Il valore deve essere compreso tra [128, 2147483647]. | Questa impostazione definisce il limite del backlog socket listen(), noto nello spazio utente come SOMAXCONN. Per impostazione predefinita, questa impostazione è 128. |
net.ipv4.tcp_rmem |
{min, default, max} (ciascuno > 0, memoria in byte). | Questa impostazione definisce la dimensione minima, in byte, del buffer di ricezione utilizzato dai socket UDP nella moderazione. L'impostazione predefinita è 1 pagina. |
net.ipv4.tcp_wmem |
{min, default, max} (ciascuno > 0, memoria in byte). | Questa impostazione definisce le dimensioni minime, in byte, del buffer di invio utilizzato dai socket UDP in moderazione. L'impostazione predefinita è 1 pagina. |
net.ipv4.tcp_tw_reuse |
Deve essere compreso tra {0, 1}. | Questa impostazione definisce se consentire il riutilizzo dei socket nello stato TIME_WAIT per le nuove connessioni quando è sicuro dal punto di vista del protocollo. Il valore predefinito è 0. |
net.ipv4.tcp_max_orphans |
Deve essere compreso tra [16384, 262144]. | Questa impostazione definisce il numero massimo di socket TCP non collegati a nessun handle di file utente. |
net.ipv4.tcp_max_tw_buckets |
Deve essere compreso tra [4096, 2147483647]. | Questa impostazione definisce il numero massimo di socket timewait mantenuti contemporaneamente dal sistema. Se questo numero viene superato, il socket di attesa viene immediatamente eliminato e viene stampato un avviso. |
net.ipv4.tcp_syn_retries |
Il valore deve essere compreso tra [1, 127]. | Questa impostazione definisce il numero di volte in cui vengono ritrasmessi i SYN iniziali per un tentativo di connessione TCP attivo. |
net.ipv4.tcp_ecn |
Deve essere compreso tra [0, 2]. | Questa impostazione controlla l'utilizzo della notifica di congestione esplicita (ECN) da parte di TCP. ECN viene utilizzato solo quando entrambe le estremità della connessione TCP indicano il supporto. |
net.ipv4.tcp_mtu_probing |
Deve essere compreso tra [0, 2]. |
Questa impostazione controlla la Path MTU Discovery del livello di pacchettizzazione TCP. I valori supportati sono i seguenti:
|
net.ipv4.tcp_congestion_control |
Deve trattarsi di uno dei valori supportati della colonna Descrizione. | Questa impostazione non è supportata quando GKE Dataplane V2 è abilitato sul cluster. I seguenti valori supportati dipendono dal tipo di immagine:
|
net.ipv6.conf.all.disable_ipv6 |
Valore booleano. | La modifica di questo valore equivale alla modifica dell'impostazione conf/default/disable_ipv6 e di tutte le impostazioni disable_ipv6 per interfaccia allo stesso valore. |
net.ipv6.conf.default.disable_ipv6 |
Valore booleano. | Questa impostazione disabilita il funzionamento di IPv6. |
net.netfilter.nf_conntrack_acct |
Deve essere compreso tra {0, 1}. | Questa impostazione attiva la contabilizzazione del flusso di monitoraggio delle connessioni. Il valore predefinito è 0, il che significa che l'impostazione è disattivata. Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
net.netfilter.nf_conntrack_max |
Deve essere compreso tra [65536, 4194304]. | Questa impostazione definisce le dimensioni della tabella di monitoraggio delle connessioni. Se viene raggiunto il valore massimo, la nuova connessione non andrà a buon fine. Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
net.netfilter.nf_conntrack_buckets |
Il valore deve essere compreso tra [65536, 524288]. |
Questa impostazione definisce le dimensioni della tabella hash. L'impostazione consigliata è il risultato di quanto segue: Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
net.netfilter.nf_conntrack_tcp_timeout_close_wait |
Deve essere compreso tra [60, 3600]. |
Questa impostazione definisce il periodo, in secondi, per il quale le connessioni TCP possono rimanere nello stato Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
net.netfilter.nf_conntrack_tcp_timeout_established |
Deve essere compreso tra [600, 86400]. |
Questa impostazione definisce la durata, in secondi, delle connessioni inattive prima che vengano eliminate automaticamente dalla tabella di monitoraggio delle connessioni. Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
net.netfilter.nf_conntrack_tcp_timeout_time_wait |
Il valore deve essere compreso tra 1 e 600. |
Questa impostazione definisce il periodo, in secondi, per il quale le connessioni TCP possono rimanere nello stato Disponibile nelle versioni di GKE 1.32.0-gke.1448000 o successive. |
Parametri della memoria virtuale (vm.*)
La tabella seguente descrive i parametri modificabili per il sottosistema di memoria virtuale. Queste impostazioni gestiscono il sottosistema di memoria virtuale, che controlla il modo in cui il kernel gestisce la memoria, lo swapping e la memorizzazione nella cache del disco.
Parametro sysctl |
Limitazioni | Descrizione |
|---|---|---|
vm.max_map_count |
Il valore deve essere compreso tra [65536, 2147483647]. | Questo file definisce il numero massimo di aree della mappa della memoria che un processo può avere. |
vm.dirty_background_ratio |
Il valore deve essere compreso tra 1 e 100. | Questa impostazione definisce la percentuale di memoria di sistema che può essere riempita con pagine sporche prima che i thread di scaricamento del kernel in background inizino la riscrittura. Il valore deve essere inferiore a quello del campo vm.dirty_ratio. |
vm.dirty_background_bytes |
Il valore deve essere compreso tra [0, 68719476736]. |
Questa impostazione definisce la quantità di memoria sporca in corrispondenza della quale i thread di svuotamento del kernel in background iniziano la scrittura differita. Tieni presente che |
vm.dirty_expire_centisecs |
Deve essere compreso tra [0, 6000]. | Questa impostazione definisce l'età massima, in centesimi di secondo, in cui i dati non sincronizzati possono rimanere in memoria prima che i thread di scaricamento del kernel li scrivano su disco. |
vm.dirty_ratio |
Il valore deve essere compreso tra 1 e 100. | Questa impostazione definisce la percentuale di memoria di sistema che può essere riempita con pagine sporche prima che i processi che eseguono scritture siano costretti a bloccare e scrivere i dati sporchi in modo sincrono. |
vm.dirty_bytes |
Il valore deve essere compreso tra [0, 68719476736]. |
Questa impostazione definisce la quantità di memoria sporca in corrispondenza della quale un processo che genera scritture su disco inizia a eseguire il writeback. Il valore minimo consentito per Tieni presente che |
vm.dirty_writeback_centisecs |
Deve essere compreso tra [0, 1000]. | Questa impostazione definisce l'intervallo, in centesimi di secondo, in cui i thread di scaricamento del kernel si attivano per scrivere i dati sporchi precedenti sul disco. |
vm.overcommit_memory |
Deve essere compreso tra {0, 1, 2}. |
Questa impostazione determina la strategia del kernel per la gestione dell'overcommitment della memoria. I valori sono i seguenti:
|
vm.overcommit_ratio |
Il valore deve essere compreso tra 0 e 100. | Questa impostazione definisce la percentuale di RAM fisica consentita per l'overcommit quando il valore del campo vm.overcommit_memory è impostato su 2. |
vm.vfs_cache_pressure |
Il valore deve essere compreso tra 0 e 100. | Questa impostazione regola la preferenza del kernel per il recupero della memoria utilizzata per le cache di dentry (directory) e inode. |
vm.swappiness |
Deve essere compreso tra [0, 200]. | Questa impostazione controlla la tendenza del kernel a spostare i processi dalla memoria fisica al disco di swap. Il valore predefinito è 60. |
vm.watermark_scale_factor |
Deve essere compreso tra [10, 3000]. | Questa impostazione controlla l'aggressività di kswapd. Definisce la memoria rimanente prima che kswapd si riattivi e la memoria da liberare prima che si disattivi. Il valore predefinito è 10. |
vm.min_free_kbytes |
Deve essere compreso tra [67584, 1048576]. | Questa impostazione definisce la memoria libera minima prima dell'errore Out Of Memory. Il valore predefinito è 67584. |
Per saperne di più sui valori supportati per ogni flag sysctl, consulta la
documentazione di gcloud CLI --system-config-from-file.
Spazi dei nomi Linux
diversi
potrebbero avere valori unici per un determinato flag sysctl, ma altri potrebbero essere globali
per l'intero nodo. L'aggiornamento delle opzioni sysctl utilizzando una configurazione del sistema di nodi consente di garantire che sysctl venga applicato a livello globale sul nodo e in ogni spazio dei nomi, in modo che ogni pod abbia valori sysctl identici in ogni spazio dei nomi Linux.
Opzioni di configurazione della modalità cgroup Linux
Il runtime del container e kubelet utilizzano i
cgroup del kernel Linux per la gestione delle risorse, ad esempio per limitare la quantità di CPU o memoria a cui può accedere ogni container in un pod. Esistono
due versioni del sottosistema cgroup nel kernel: cgroupv1 e cgroupv2.
Il supporto di Kubernetes per cgroupv2 è stato introdotto come alpha nella versione 1.18 di Kubernetes, come beta nella versione 1.22 e come GA nella versione 1.25. Per saperne di più, consulta la
documentazione di Kubernetes cgroups v2.
La configurazione del sistema di nodi ti consente di personalizzare la configurazione dei cgroup dei tuoi
node pool. Puoi utilizzare cgroupv1 o cgroupv2. GKE utilizza
cgroupv2 per i nuovi node pool Standard che eseguono la versione 1.26 e successive
e cgroupv1 per i node pool che eseguono versioni precedenti alla 1.26. Per i node pool creati con il provisioning automatico dei nodi, la configurazione di cgroup dipende dalla versione iniziale del cluster, non dalla versione del pool di nodi. cgroupv1 non è supportato sulle macchine Arm.
Puoi utilizzare la configurazione del sistema dei nodi per modificare l'impostazione di un pool di nodi in modo da utilizzare cgroupv1 o cgroupv2 in modo esplicito. L'upgrade di un pool di nodi esistente che
utilizza cgroupv1 alla versione 1.26 non modifica l'impostazione in cgroupv2.
I node pool esistenti che eseguono una versione precedente alla 1.26 e che non includono una configurazione cgroup personalizzata continueranno a utilizzare cgroupv1.
Per modificare l'impostazione, devi specificare esplicitamente cgroupv2 per il pool di nodi esistente.
Ad esempio, per configurare il pool di nodi in modo che utilizzi cgroupv2, utilizza un file di configurazione del sistema di nodi come il seguente:
linuxConfig:
cgroupMode: 'CGROUP_MODE_V2'
Le opzioni cgroupMode supportate sono le seguenti:
CGROUP_MODE_V1: utilizzacgroupv1sul pool di nodi.CGROUP_MODE_V2: utilizzacgroupv2sul pool di nodi.CGROUP_MODE_UNSPECIFIED: utilizza la configurazione cgroup GKE predefinita.
Per utilizzare cgroupv2, si applicano i seguenti requisiti e limitazioni:
- Per un pool di nodi che esegue una versione precedente alla 1.26, devi utilizzare gcloud CLI versione 408.0.0 o successiva. In alternativa, utilizza gcloud beta con la versione 395.0.0 o successive.
- Il cluster e i pool di nodi devono eseguire GKE versione 1.24.2-gke.300 o successive.
- Devi utilizzare l'immagine del nodo Container-Optimized OS con Containerd o Ubuntu con Containerd.
- Se uno dei tuoi workload dipende dalla lettura del file system cgroup
(
/sys/fs/cgroup/...), assicurati che sia compatibile con l'APIcgroupv2. - Se utilizzi strumenti di monitoraggio o di terze parti, assicurati che siano
compatibili con
cgroupv2. - Se utilizzi carichi di lavoro Java (JDK), ti consigliamo di utilizzare versioni che
supportano completamente cgroupv2,
tra cui JDK
8u372, JDK 11.0.16 o versioni successive oppure JDK 15 o versioni successive.
Verifica la configurazione di cgroup
Quando aggiungi una configurazione di sistema dei nodi, GKE deve ricreare i nodi per implementare le modifiche. Dopo aver aggiunto la configurazione a un node pool e ricreato i nodi, puoi verificare la nuova configurazione.
Puoi verificare la configurazione del cgroup per i nodi in un pool di nodi utilizzando
gcloud CLI o lo strumento a riga di comando kubectl:
Interfaccia a riga di comando gcloud
Controlla la configurazione di cgroup per un pool di nodi:
gcloud container node-pools describe POOL_NAME \
--format='value(Config.effectiveCgroupMode)'
Sostituisci POOL_NAME con il nome del tuo pool di nodi.
L'output potenziale è uno dei seguenti:
EFFECTIVE_CGROUP_MODE_V1: i nodi utilizzanocgroupv1EFFECTIVE_CGROUP_MODE_V2: i nodi utilizzanocgroupv2
L'output mostra solo la nuova configurazione del cgroup dopo la ricreazione dei nodi nel pool di nodil. L'output è vuoto per i node pool Windows Server, che non supportano cgroup.
kubectl
Per utilizzare kubectl per verificare la configurazione del cgroup per i nodi in questo pool di nodi, seleziona un nodo e connettiti a esso utilizzando le seguenti istruzioni:
- Crea una shell interattiva
con qualsiasi nodo del pool di nodi. Nel comando, sostituisci
mynodecon il nome di un nodo qualsiasi nel pool di nodi. - Identifica la versione di cgroup sui nodi Linux.
Opzioni di configurazione di hugepages di Linux
Puoi utilizzare un file di configurazione del sistema di nodi per preallocare hugepages. Kubernetes supporta le hugepage preallocate come tipo di risorsa, in modo simile a CPU o memoria.
Per utilizzare hugepages, si applicano le seguenti limitazioni e requisiti:
- Per garantire che il nodo non sia completamente occupato da hugepage, le dimensioni complessive
delle hugepage allocate non possono superare quanto segue:
- Sulle macchine con meno di 30 GB di memoria: 60% della memoria totale. Ad esempio, su una macchina e2-standard-2 con 8 GB di memoria, non puoi allocare più di 4,8 GB per le pagine enormi.
- Su macchine con più di 30 GB di memoria: 80% della memoria totale. Ad esempio, sulle macchine c4a-standard-8 con 32 GB di memoria, le hugepage non possono superare 25,6 GB.
- Le hugepage da 1 GB sono disponibili solo sui tipi di macchine A3, C2D, C3, C3D, C4, C4A, C4D, CT5E, CT5LP, CT6E, H3, M2, M3, M4 o Z3.
La tabella seguente descrive le impostazioni modificabili per le hugepage Linux.
| Parametro di configurazione | Limitazioni | Valore predefinito | Descrizione |
|---|---|---|---|
hugepage_size2m |
Conteggio numeri interi. Soggetto ai limiti di allocazione della memoria descritti in precedenza. | 0 |
Questa impostazione prealloca un numero specifico di hugepage da 2 MB. |
hugepage_size1g |
Conteggio numeri interi. Soggette a entrambe le limitazioni di memoria e tipo di macchina descritte in precedenza. | 0 |
Questa impostazione prealloca un numero specifico di hugepage da 1 GB. |
Huge page trasparenti (THP)
Puoi utilizzare un file di configurazione del sistema dei nodi per abilitare il supporto di Transparent HugePage del kernel Linux. Con THP, il kernel assegna automaticamente le hugepage ai processi senza pre-allocazione manuale.
La seguente tabella descrive i parametri modificabili per THP.
| Parametro di configurazione | Valori supportati | Valore predefinito | Descrizione |
|---|---|---|---|
transparentHugepageEnabled |
|
UNSPECIFIED |
Questa impostazione controlla se THP è abilitato per la memoria anonima. |
transparentHugepageDefrag |
|
UNSPECIFIED |
Questa impostazione definisce la configurazione della deframmentazione per THP. |
THP è disponibile in GKE versione 1.33.2-gke.4655000 o successive. È abilitato per impostazione predefinita anche sui nuovi node pool TPU nella versione 1.33.2-gke.4655000 o successive di GKE. THP non è abilitato quando esegui l'upgrade dei pool di nodi esistenti a una versione supportata o successiva.