Personalizzare la configurazione dei nodi per i pool di nodi nel servizio Azure Kubernetes

La personalizzazione della configurazione dei nodi consente di modificare le impostazioni del sistema operativo o i parametri kubelet in base alle esigenze dei carichi di lavoro. Quando si crea un cluster nel servizio Azure Kubernetes o si aggiunge un pool di nodi al cluster, è possibile personalizzare un subset di impostazioni del sistema operativo e kubelet di uso comune. Per configurare altre impostazioni oltre a quelle del subset, è possibile usare un set di daemon per personalizzare le configurazioni necessarie senza rinunciare al supporto del servizio Azure Kubernetes per i nodi.

Creare un cluster nel servizio Azure Kubernetes con una configurazione del nodo personalizzata

Creare file config

Le modifiche al sistema operativo e alla configurazione di kubelet richiedono la creazione di un nuovo file di configurazione con i parametri e le impostazioni desiderate. Se il valore di un parametro non è specificato, verrà impostato il valore predefinito.

Configurazione del kubelet

Creare un file linuxkubeletconfig.json con i contenuti seguenti:

{
 "cpuManagerPolicy": "static",
 "cpuCfsQuota": true,
 "cpuCfsQuotaPeriod": "200ms",
 "imageGcHighThreshold": 90,
 "imageGcLowThreshold": 70,
 "topologyManagerPolicy": "best-effort",
 "allowedUnsafeSysctls": [
  "kernel.msg*",
  "net.*"
],
 "failSwapOn": false
}

Configurazione del sistema operativo

Creare un file linuxosconfig.json con i contenuti seguenti:

{
 "transparentHugePageEnabled": "madvise",
 "transparentHugePageDefrag": "defer+madvise",
 "swapFileSizeMB": 1500,
 "sysctls": {
  "netCoreSomaxconn": 163849,
  "netIpv4TcpTwReuse": true,
  "netIpv4IpLocalPortRange": "32000 60000"
 }
}

Creare un nuovo cluster usando file di configurazione personalizzati

Quando si crea un nuovo cluster, è possibile usare i file di configurazione personalizzati creati nei passaggi precedenti per specificare la configurazione kubelet, la configurazione del sistema operativo o entrambi.

Nota

Se si specifica una configurazione durante la creazione di un cluster, tale configurazione verrà applicata solo ai nodi nel pool di nodi iniziale. Tutte le impostazioni non configurate nel file JSON manterranno il valore predefinito. CustomLinuxOsConfig non è supportato per il tipo di sistema operativo: Windows.

Creare un nuovo cluster usando i file di configurazione personalizzati con il comando az aks create e specificando i file di configurazione. Il comando di esempio seguente crea un nuovo cluster con i file ./linuxkubeletconfig.jsone ./linuxosconfig.json personalizzati:

az aks create --name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json --linux-os-config ./linuxosconfig.json

Aggiungere un pool di nodi usando file di configurazione personalizzati

Quando si aggiunge un pool di nodi a un cluster, è possibile usare il file di configurazione personalizzato creato nel passaggio precedente per specificare la configurazione kubelet. CustomKubeletConfig è supportato per i pool di nodi Linux e Windows.

Nota

Quando si aggiunge un pool di nodi Linux a un cluster esistente, è possibile specificare la configurazione kubelet, la configurazione del sistema operativo o entrambi. Quando si aggiunge un pool di nodi Windows a un cluster esistente, è possibile specificare solo la configurazione kubelet. Se si specifica una configurazione quando si aggiunge un pool di nodi, tale configurazione verrà applicata solo ai nodi nel nuovo pool di nodi. Tutte le impostazioni non configurate nel file JSON manterranno il valore predefinito.

az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json

Altre configurazioni

Per modificare altre impostazioni del sistema operativo, è possibile usare le impostazioni seguenti:

Messaggio del giorno

Passare il flag --message-of-the-day con il percorso del file per sostituire il messaggio del giorno nei nodi Linux al momento della creazione del cluster o del pool di nodi.

az aks create --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt
Creazione del pool di nodi
az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt

Verificare che le impostazioni siano state applicate

Dopo aver applicato la configurazione personalizzata dei nodi, è possibile verificare che le impostazioni siano state applicate ai nodi connettendosi all'host e verificando che sysctl o le modifiche alla configurazione siano state apportate al file system.

Parametri supportati per la configurazione personalizzata del nodo

Configurazione kubelet personalizzata

La configurazione kubelet personalizzata è supportata per i pool di nodi Linux e Windows. I parametri supportati differiscono e sono documentati di seguito.

Configurazione kubelet personalizzata per Linux

Parametro Valori/intervallo consentiti Default Descrizione
cpuManagerPolicy none, static Nessuno I criteri statici consentono ai contenitori nei pod garantiti con richieste di CPU integer di accedere a CPU esclusive nel nodo.
cpuCfsQuota true, false true Abilitare/disabilitare l'imposizione della quota CFS della CPU per i contenitori che specificano i limiti della CPU.
cpuCfsQuotaPeriod Intervallo in millisecondi (ms) 100ms Imposta il valore del periodo di quota CFS della CPU.
imageGcHighThreshold 0-100 85 Percentuale di utilizzo del disco dopo la quale viene sempre eseguita l'operazione di Garbage Collection dell'immagine. Utilizzo minimo del disco che attiverà l'operazione di Garbage Collection. Per disabilitare l'operazione di Garbage Collection delle immagini, impostare su 100.
imageGcLowThreshold 0-100, non superiore a imageGcHighThreshold 80 Percentuale di utilizzo del disco prima dell'esecuzione dell’operazione di Garbage Collection delle immagini. Utilizzo minimo del disco che può attivare l’operazione di Garbage Collection.
topologyManagerPolicy none, best-effort, restricted, single-numa-node Nessuno Ottimizzare l'allineamento dei nodi NUMA. Per altre informazioni, vedere qui.
allowedUnsafeSysctls kernel.shm*, kernel.msg*, kernel.sem, fs.mqueue.*, net.* None Elenco consentito di sysctls non sicuri o modelli sysctl non sicuri.
containerLogMaxSizeMB Dimensione in megabyte (MB) 50 Dimensioni massime (ad esempio, 10 MB) di un file di log del contenitore prima della rotazione.
containerLogMaxFiles ≥ 2 5 Numero massimo di file di log del contenitore che possono essere presenti per un contenitore.
podMaxPids Da -1 al limite PID del kernel -1 (∞) Numero massimo di ID di processo che possono essere eseguiti in un pod

Configurazione kubelet personalizzata per Windows

Parametro Valori/intervallo consentiti Default Descrizione
imageGcHighThreshold 0-100 85 Percentuale di utilizzo del disco dopo la quale viene sempre eseguita l'operazione di Garbage Collection dell'immagine. Utilizzo minimo del disco che attiverà l'operazione di Garbage Collection. Per disabilitare l'operazione di Garbage Collection delle immagini, impostare su 100.
imageGcLowThreshold 0-100, non superiore a imageGcHighThreshold 80 Percentuale di utilizzo del disco prima dell'esecuzione dell’operazione di Garbage Collection delle immagini. Utilizzo minimo del disco che può attivare l’operazione di Garbage Collection.
containerLogMaxSizeMB Dimensione in megabyte (MB) 10 Dimensioni massime (ad esempio, 10 MB) di un file di log del contenitore prima della rotazione.
containerLogMaxFiles ≥ 2 5 Numero massimo di file di log del contenitore che possono essere presenti per un contenitore.

Impostazioni di configurazione del sistema operativo personalizzate per Linux

Importante

Per semplificare la ricerca e la leggibilità, le impostazioni del sistema operativo vengono visualizzate in questo articolo in base al nome, ma devono essere aggiunte al file JSON di configurazione o all'API del servizio Azure Kubernetes usando la convenzione per l’uso di maiuscole e minuscole camelCase.

Ad esempio, se si modifica "vm.max_map_count setting", è necessario riformattare "vmMaxMapCount" nel file JSON di configurazione.

Limiti relativi all'handle di file

Quando si gestisce molto traffico, il traffico proviene in genere da un numero elevato di file locali. È possibile modificare le impostazioni del kernel e i limiti predefiniti seguenti per consentire la gestione di più traffico, a costo della memoria di sistema.

Impostazione Valori/intervallo consentiti Default Descrizione
fs.file-max 8192 - 12000500 709620 Numero massimo di handle di file allocati dal kernel Linux. Se si aumenta questo valore è possibile aumentare il numero massimo consentito di file aperti.
fs.inotify.max_user_watches 781250 - 2097152 1048576 Numero massimo di espressioni di controllo file consentite dal sistema. Ogni espressione di controllo è di circa 90 byte in un kernel a 32 bit e di circa 160 byte in un kernel a 64 bit.
fs.aio-max-nr 65536 - 6553500 65536 aio-nr mostra il numero corrente di richieste di I/O asincrone a livello di sistema. aio-max-nr consente di modificare il valore massimo che può acquisire aio-nr.
fs.nr_open 8192 - 20000500 1048576 Numero massimo di handle di file che un processo può allocare.

Socket e ottimizzazione della rete

Per i nodi dell'agente, che devono gestire un numero molto elevato di sessioni simultanee, è possibile usare il subset di opzioni TCP e di rete seguenti che è possibile modificare per ogni pool di nodi.

Impostazione Valori/intervallo consentiti Default Descrizione
net.core.somaxconn 4096 - 3240000 16384 Numero massimo di richieste di connessione che possono essere accodate per qualsiasi socket di ascolto specificato. Limite superiore per il valore del parametro backlog passato alla funzione listen(2). Se l'argomento backlog è maggiore di somaxconn, viene troncato automaticamente a questo limite.
net.core.netdev_max_backlog 1000 - 3240000 1000 Numero massimo di pacchetti, accodati sul lato INPUT, quando l'interfaccia riceve pacchetti più velocemente di quanto il kernel possa elaborarli.
net.core.rmem_max 212992 - 134217728 212992 Dimensione massima del buffer del socket di ricezione in byte.
net.core.wmem_max 212992 - 134217728 212992 Dimensione massima del buffer del socket di invio in byte.
net.core.optmem_max 20480 - 4194304 20480 Dimensioni massime del buffer ausiliario (buffer di memoria delle opzioni) consentite per socket. In alcuni casi la memoria dell'opzione socket viene usata per archiviare strutture aggiuntive relative all'utilizzo del socket.
net.ipv4.tcp_max_syn_backlog 128 - 3240000 16384 Numero massimo di richieste di connessione in coda che non hanno ancora ricevuto un riconoscimento dal client di connessione. Se questo numero viene superato, il kernel inizierà a eliminare le richieste.
net.ipv4.tcp_max_tw_buckets 8000 - 1440000 32768 Numero massimo di socket timewait mantenuti contemporaneamente dal sistema. Se questo numero viene superato, il socket di attesa del tempo viene eliminato immediatamente e viene stampato un avviso.
net.ipv4.tcp_fin_timeout 5 - 120 60 Il periodo di tempo in cui una connessione orfana (a cui nessuna applicazione fa più riferimento) rimarrà nello stato FIN_WAIT_2 prima che venga interrotta sul lato locale.
net.ipv4.tcp_keepalive_time 30 - 432000 7200 Frequenza con cui TCP invia messaggi keepalive quando keepalive è abilitato.
net.ipv4.tcp_keepalive_probes 1 - 15 9 Il numero di probe keepalive inviati da TCP fino a quando non decide che la connessione non viene interrotta.
net.ipv4.tcp_keepalive_intvl 10 - 90 75 Frequenza con cui vengono inviati i probe. Se moltiplicato per tcp_keepalive_probes, indica il tempo necessario per terminare una connessione che non risponde, dopo l'avvio dei probe.
net.ipv4.tcp_tw_reuse 0 o 1 0 Consente di riutilizzare i socket TIME-WAIT per le nuove connessioni quando non ci sono problemi di sicurezza a livello di protocollo.
net.ipv4.ip_local_port_range Primo: 1024 - 60999 e Ultimo: 32768 - 65535] Primo: 32768 e Ultimo: 60999 Intervallo di porte locale utilizzato dal traffico TCP e UDP per scegliere la porta locale. Costituito da due numeri: il primo numero rappresenta la prima porta locale consentita per il traffico TCP e UDP nel nodo dell'agente, il secondo è l'ultimo numero di porta locale.
net.ipv4.neigh.default.gc_thresh1 128 - 80000 4096 Numero minimo di voci che possono essere presenti nella cache ARP. L'operazione di Garbage Collection non verrà attivata se il numero di voci è inferiore a questa impostazione.
net.ipv4.neigh.default.gc_thresh2 512 - 90000 8192 Numero software massimo di voci che possono essere presenti nella cache ARP. Questa impostazione è probabilmente la più importante, poiché l’operazione di Garbage Collection ARP verrà attivata circa 5 secondi dopo che è stato raggiunto questo limite software massimo.
net.ipv4.neigh.default.gc_thresh3 1024 - 100000 16384 Numero hardware massimo di voci nella cache ARP.
net.netfilter.nf_conntrack_max 131072 - 2097152 131072 nf_conntrack è un modulo che tiene traccia delle voci di connessione per NAT in Linux. Il modulo nf_conntrack usa una tabella hash per registrare il record di connessione stabilita del protocollo TCP. nf_conntrack_max è il numero massimo di nodi nella tabella hash, ovvero il numero massimo di connessioni supportate dal modulo nf_conntrack o le dimensioni della tabella di rilevamento delle connessioni.
net.netfilter.nf_conntrack_buckets 65536 - 524288 65536 nf_conntrack è un modulo che tiene traccia delle voci di connessione per NAT in Linux. Il modulo nf_conntrack usa una tabella hash per registrare il record di connessione stabilita del protocollo TCP. nf_conntrack_buckets è la dimensione della tabella hash.

Limiti del ruolo di lavoro

Analogamente ai limiti del descrittore di file, il numero di ruoli di lavoro o thread che un processo può creare è limitato da un'impostazione del kernel e dai limiti utente. Il limite utente per il servizio Azure Kubernetes è illimitato.

Impostazione Valori/intervallo consentiti Default Descrizione
kernel.threads-max 20 - 513785 55601 I processi possono attivare thread di lavoro. Il numero massimo di tutti i thread che è possibile creare viene impostato con l'impostazione kernel.threads-max del kernel.

Memoria virtuale

È possibile usare le impostazioni seguenti per ottimizzare il funzionamento del sottosistema di memoria virtuale (VM) del kernel Linux e dei writeout dati dirty su disco.

Impostazione Valori/intervallo consentiti Default Descrizione
vm.max_map_count 65530 - 262144 65530 Questo file contiene il numero massimo di aree della mappa di memoria che un processo può includere. Le aree della mappa di memoria vengono usate come effetto collaterale della chiamata di malloc, direttamente da mmap, mprotecte madvise, nonché durante il caricamento di librerie condivise.
vm.vfs_cache_pressure 1 - 100 100 Questo valore percentuale controlla la tendenza del kernel a recuperare la memoria, usata per la memorizzazione nella cache di oggetti directory e inode.
vm.swappiness 0 - 100 60 Questo controllo viene usato per definire l'aggressività con cui il kernel scambia le pagine di memoria. I valori più elevati aumentano l'aggressività, i valori inferiori riducono il numero di pagine scambiate. Il valore 0 indica al kernel di non avviare lo scambio fino a quando il numero di pagine gratuite e supportate da file è minore del limite massima in una zona.
swapFileSizeMB 1 MB - Dimensioni del disco temporaneo (/dev/sdb) None SwapFileSizeMB specifica le dimensioni in MB di un file di scambio creato nei nodi dell'agente dal pool di nodi.
transparentHugePageEnabled always, madvise, never always Transparent Hugepages è una funzionalità del kernel Linux progettata per migliorare le prestazioni rendendo più efficiente l'uso dell'hardware di mapping della memoria del processore. Se la funzionalità è abilitata, il kernel tenta di allocare hugepages quando possibile e qualsiasi processo Linux riceverà pagine da 2 MB se l'area mmap è allineata naturalmente a 2 MB. In alcuni casi, quando hugepages sono abilitati a livello di sistema, le applicazioni finiscono talvolta per allocare più risorse di memoria. Un'applicazione può essere associata a un’area mmap di grandi dimensioni, ma usarne solo 1 byte. In tal caso è possibile che per nessun motivo valido venga allocata una pagina di 2 MB anziché una pagina di 4k. Questo scenario è il motivo per cui è possibile disabilitare hugepages a livello di sistema o solo all'interno di MADV_HUGEPAGE madvise delle aree.
transparentHugePageDefrag always, defer, defer+madvise, madvise, never madvise Questo valore controlla se il kernel deve usare in modo aggressivo la compattazione della memoria per rendere più hugepages disponibile.

Passaggi successivi