Ottimizzazione delle prestazioni
Se hai specifici requisiti di ottimizzazione delle prestazioni, puoi modificare le impostazioni predefinite per alcuni componenti cluster in IBM Cloud® Kubernetes Service.
Se scegli di modificare le impostazioni predefinite, lo fai a tuo proprio rischio. Sei responsabile dell'esecuzione di test sulle eventuali impostazioni modificate e per qualsiasi eventuale interruzione causata dalle impostazioni modificate nel tuo ambiente.
Impostazioni del nodo di lavoro predefinito
Per impostazione predefinita, i nodi worker hanno il sistema operativo e l'hardware di calcolo del tipo di nodo worker scelto al momento della creazione del pool worker.
Personalizzazione del sistema operativo
L'elenco dei sistemi operativi supportati per versione del cluster è disponibile nelle informazioni sulla versione di Kubernetes. Il cluster non può combinare sistemi operativi o utilizzare sistemi operativi differenti.
Per ottimizzare i tuoi nodi di lavoro, considera le seguenti informazioni.
- Aggiornamenti di immagine e versione: gli aggiornamenti del nodo di lavoro, come le patch di sicurezza per l'immagine o le versioni di Kubernetes, vengono forniti da IBM per te. Tuttavia, scegli quando applicare gli aggiornamenti ai nodi di lavoro. Per ulteriori informazioni, vedi Aggiornamento di cluster, nodi di lavoro e componenti cluster.
- Modifiche temporanee: se esegui l'accesso a un pod o utilizzi qualche altro processo per modificare l'impostazione di un nodo di lavoro, le modifiche sono temporanee. Le operazioni del ciclo di vita del nodo di lavoro, come l'autorecovery, il ricaricamento, l'aggiornamento o la sostituzione di un nodo di lavoro, modificano le modifiche alle impostazioni predefinite.
- Modifiche persistenti: per rendere persistenti le modifiche tra le operazioni del ciclo di vita del nodo di lavoro, crea una serie di daemon che utilizzi un contenitore
init. Per ulteriori informazioni, vedi Modifica delle impostazioni del nodo di lavoro predefinito per ottimizzare le prestazioni.
Le modifiche al sistema operativo non sono supportate. Se si modificano le impostazioni predefinite, si è responsabili del debug e della risoluzione dei problemi che potrebbero verificarsi.
Modifiche hardware
Per modificare l'hardware di calcolo, come la CPU e la memoria per nodo di lavoro, scegli tra le seguenti opzioni.
- Crea un pool di lavoro. Le istruzioni variano a seconda del tipo di infrastruttura per il cluster, ad esempio classica, VPC o Satellite. Per ulteriori informazioni, vedi Aggiunta di nodi di lavoro ai cluster Classic o Aggiunta di nodi di lavoro ai cluster VPC.
- Aggiorna il flavor nel tuo cluster creando un pool di nodi di lavoro e rimuovendo il pool di nodi di lavoro precedente.
Modifica delle impostazioni del kernel del nodo di lavoro per ottimizzare le prestazioni
I nodi di lavoro del cluster sono configurati per un livello di stabilità, ottimizzazione e prestazioni che si prevede soddisfi le esigenze della maggior parte dei carichi di lavoro. Di solito, non è consigliabile modificare le impostazioni del kernel del proprio nodo di lavoro, poiché tali modifiche possono creare problemi insoliti e indesiderati. Tuttavia, se il tuo carico di lavoro ha requisiti di ottimizzazione delle prestazioni altamente univoci che richiedono modifiche alle impostazioni del kernel, è possibile applicare un set di daemon Kubernetes personalizzato per modificare la configurazione del kernel. Comprendere che queste modifiche possono avere conseguenze negative significative e che è possibile implementare modifiche alla configurazione delle impostazioni del kernel a proprio rischio.
Se si modifica la configurazione delle impostazioni del kernel, assicurarsi di documentare e salvare le modifiche esatte apportate. Se si apre un ticket di supporto per eventuali problemi relativi al cluster, è necessario specificare queste modifiche. Queste modifiche di configurazione potrebbero essere responsabili del problema e potrebbe essere richiesto di ripristinare le modifiche come parte dell'indagine del problema. In questo caso, l'utente è responsabile del ripristino delle modifiche di configurazione del kernel implementate.
La modifica delle impostazioni kernel predefinite può avere effetti negativi sul cluster. Apporta queste modifiche a tuo rischio e pericolo.
Puoi modificare le impostazioni kernel predefinite applicando un Kubernetes DaemonSet personalizzato con un Contenitore init al tuo cluster. Il daemon set modifica le impostazioni di tutti i nodi di lavoro esistenti e le applica a qualsiasi nuovo nodo di lavoro che venga creato nel cluster. Il contenitore
init garantisce che queste modifiche si verifichino prima che altri pod siano pianificati nel nodo di lavoro. Nessun pod è interessato.
Per eseguire l'esempio " initContainer" con privilegi, è necessario disporre del ruolo di accesso al servizio IAM "Manager IBM Cloud " per tutti gli spazi dei nomi. Dopo che i contenitori per le distribuzioni sono stati inizializzati, i privilegi vengono eliminati.
Prima di iniziare: Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.
-
Salva la seguente serie di daemon in un file denominato
worker-node-kernel-settings.yaml. Nella sezionespec.template.spec.initContainers, aggiungi i campi e i valori per i parametrisysctlche vuoi ottimizzare. Questa serie di daemon di esempio modifica il numero massimo predefinito di connessioni consentite nell'ambiente tramite l'impostazionenet.core.somaxconne l'intervallo di porte temporanee tramite l'impostazionenet.ipv4.ip_local_port_range.apiVersion: apps/v1 kind: DaemonSet metadata: name: kernel-optimization namespace: kube-system labels: tier: management app: kernel-optimization spec: selector: matchLabels: name: kernel-optimization template: metadata: labels: name: kernel-optimization spec: hostNetwork: true hostPID: true hostIPC: true initContainers: - command: - sh - -c - sysctl -w net.ipv4.tcp_syn_retries="5"; sysctl -w net.ipv4.tcp_fin_timeout="15"; image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: Always name: sysctl resources: {} securityContext: privileged: true capabilities: add: - NET_ADMIN volumeMounts: - name: modifysys mountPath: /sys containers: - resources: requests: cpu: 0.01 image: us.icr.io/armada-master/network-alpine:latest name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done volumes: - name: modifysys hostPath: path: /sys -
Applica la serie di daemon ai tuoi nodi di lavoro. Le modifiche vengono applicate immediatamente.
kubectl apply -f worker-node-kernel-settings.yaml
Per ripristinare i valori predefiniti dei parametri " sysctl " dei nodi di lavoro, segui questi passaggi.
- Elimina la serie di daemon. Gli
initContainersche applicavano le impostazioni personalizzate vengono rimossi.kubectl delete ds kernel-optimization - Riavvia tutti i nodi di lavoro nel cluster. I nodi di lavoro tornano online con i valori predefiniti applicati.
Ottimizzazione delle prestazioni dei pod
Se hai richieste di carico di lavoro specifiche per le prestazioni, puoi modificare le impostazioni predefinite per i parametri sysctl del kernel Linux sugli spazi dei nomi della rete di pod.
Per ottimizzare le impostazioni del kernel per i pod delle app, è possibile inserire una initContainer patch nel
file YAML di pod/ds/rs/deployment per ogni distribuzione. L'initContainer viene aggiunto a ciascuna distribuzione dell'applicazione che si trova nello spazio dei nomi della rete di pod per cui vuoi ottimizzare le
prestazioni.
Prima di iniziare, assicurati di disporre del ruolo di accesso al servizio IAM "Manager IBM Cloud " per tutti gli spazi dei nomi, al fine di
poter eseguire l'esempio " initContainer" con privilegi. Dopo che i contenitori per le distribuzioni sono stati inizializzati, i privilegi vengono eliminati.
-
Salva la seguente patch
initContainerin un file denominatopod-patch.yamle aggiungi i campi e i valori per i parametrisysctlche vuoi ottimizzare. QuestoinitContainerdi esempio modifica il numero massimo predefinito di connessioni consentite nell'ambiente tramite l'impostazionenet.core.somaxconne l'intervallo di porte temporanee tramite l'impostazionenet.ipv4.ip_local_port_range.spec: template: spec: initContainers: - command: - sh - -c - sysctl -e -w net.core.somaxconn=32768; sysctl -e -w net.ipv4.ip_local_port_range="1025 65535"; image: alpine:3.6 imagePullPolicy: IfNotPresent name: sysctl resources: {} securityContext: privileged: true -
Applica la patch a ciascuna delle tue distribuzioni.
kubectl patch deployment <deployment_name> --patch pod-patch.yaml -
Se hai modificato il valore
net.core.somaxconnnelle impostazioni del kernel, la maggior parte delle applicazioni può utilizzare automaticamente il valore aggiornato. Tuttavia, alcune applicazioni potrebbero richiedere che tu modifichi manualmente il valore corrispondente nel codice dell'applicazione in modo che corrisponda al valore del kernel. Ad esempio, se stai ottimizzando le prestazioni di un pod su cui viene eseguita un'applicazione NGINX, devi modificare il valore del campobacklognel codice dell'applicazione NGINX in modo che corrisponda. Per ulteriori informazioni, consulta questo post sul blog “ NGINX ”.
Ottimizzazione delle impostazioni di rete keepalive sysctl
Se un pod ha connessioni TCP di lunga durata che vengono occasionalmente scollegate quando sono inattive per un certo periodo di tempo, potrebbe essere utile modificare le impostazioni di keepalive di sysctl per il pod.
Attualmente non esiste un modo per impostare queste sysctl impostazioni keepalive su tutti i pod per impostazione predefinita in un cluster. Il modo migliore per modificare le impostazioni su tutti i pod è utilizzare un initContainer privilegiato. Esamina il seguente esempio di come configurare un initContainer per una distribuzione in uno spazio dei nomi test-ns.
Distribuire il seguente esempio initContainer. Ricordati di modificare la sezione containers: nei tuoi contenitori dell'applicazione. Il initContainer quindi imposta le impostazioni sysctl per tutti i contenitori regolari nel pod perché condividono tutti lo stesso spazio dei nomi di rete.
kubectl apply -f - << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-sysctl
namespace: test-ns
labels:
run: test-sysctl
spec:
replicas: 2
selector:
matchLabels:
run: test-sysctl
template:
metadata:
labels:
run: test-sysctl
spec:
initContainers:
- command:
- sh
- -c
- sysctl -e -w net.ipv4.tcp_keepalive_time=40; sysctl -e -w net.ipv4.tcp_keepalive_intvl=15; sysctl -e -w net.ipv4.tcp_keepalive_probes=6;
image: us.icr.io/armada-master/alpine:latest
imagePullPolicy: IfNotPresent
name: sysctl-init
resources: {}
securityContext:
privileged: true
containers:
- name: test-sysctl
image: us.icr.io/armada-master/alpine:latest
command: ["sleep", "2592000"]
EOF
Regolazione delle risorse del provider di metriche del cluster
Il tuo cluster ha un servizio di metrica fornito dalla distribuzione metrics-server nello spazio dei nomi kube-system. Le richieste di risorse metrics-server si basano sul numero di nodi nel cluster e sono
ottimizzate per i cluster con 30 o meno pod per nodo di lavoro. Il servizio di metrica corrisponde ai limiti di memoria e CPU delle richieste di risorse.
I contenitori del servizio metriche possono essere "esauriti" se le richieste di memoria sono troppo basse. È possibile che rispondano molto lentamente o che non riescano a eseguire le analisi di disponibilità e di attività, a causa della limitazione della CPU se le richieste di CPU sono troppo basse.
L'utilizzo della memoria è determinato dal numero di pod nel cluster. L'utilizzo della CPU è determinato dal numero di richieste per le metriche (HPA, kubectl top nodes / pods e così via) e dalle richieste di rilevamento API. metrics-server fornisce un'API Kubernetes, in modo che client come kubectl che utilizzano il rilevamento API effettuino un certo carico su metrics-server anche se non utilizzano le metriche.
I seguenti sintomi potrebbero indicare la necessità di regolare le risorse metrics-server:
-
Il sito
metrics-serversi riavvia frequentemente. -
L'eliminazione di uno spazio dei nomi provoca il blocco dello spazio dei nomi in uno stato
Terminatingekubectl describe namespaceinclude una condizione che segnala un errore di rilevamento dell'API delle metriche. -
kubectl top pods,kubectl top nodes, altri comandi dikubectlo applicazioni che utilizzano le API Kubernetes per registrare gli errori di Kubernetes, come ad esempio:
The server is currently unable to handle the request (get pods.metrics.k8s.io)
Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
-
HorizontalPodAutoscalers ) non scalano le distribuzioni.
-
Eseguendo
kubectl get apiservices v1beta1.metrics.k8s.iosi ottiene uno stato come:
NAME SERVICE AVAILABLE AGE
v1beta1.metrics.k8s.io kube-system/metrics-server False (FailedDiscoveryCheck) 139d
Modificare la mappa di configurazione metrics-server-config
Sia la CPU che la memoria hanno impostazioni regolabili "base" e "per nodo" utilizzate per calcolare una richiesta totale.
baseCPUcpuPerNodebaseMemorymemoryPerNode
Dove:
cpuRequest = baseCPU + cpuPerNode * number_of_nodes
memoryRequest = baseMemory + memoryPerNode * number_of_nodes
Il numero di nodi in questi calcoli proviene da un insieme di "dimensioni bucket" e ha una dimensione minima di 16 nodi.
La CPU è richiesta in core, con valore come 1 o valori frazionari come 100m (100 millicore).
La memoria è richiesta in byte con un suffisso facoltativo di:
- base 2 1Ki = 1024):
Ki(kilobyte),Mi(megabyte),Gi(gigabyte). - metrica 1k = 1000):
k,M,G.
Se si prevede che il numero di nodi in un cluster aumenti (o semplicemente cambi) nel corso del tempo, è possibile che si desideri modificare l'impostazione "per nodo". Se il numero di nodi è statico, regolare l'impostazione "base".
Alla fine, i valori di CPU e memoria totali vengono impostati nelle richieste di risorse di distribuzione metrics-server.
Puoi modificare le risorse predefinite modificando la mappa di configurazione del provider di metriche. Non modificare le richieste di risorse o i limiti direttamente nella distribuzione metrics-server, i valori vengono sovrascritti
dal contenitore metrics-server-nanny.
La configmap metrics-server-config predefinita è:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
kubernetes.io/cluster-service: "true"
name: metrics-server-config
namespace: kube-system
data:
NannyConfiguration: |-
apiVersion: nannyconfig/v1alpha1
kind: NannyConfiguration
Questo esempio mostra una ConfigMap con tutti i valori definiti.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
kubernetes.io/cluster-service: "true"
name: metrics-server-config
namespace: kube-system
data:
NannyConfiguration: |-
apiVersion: nannyconfig/v1alpha1
kind: NannyConfiguration
baseCPU: 200m
cpuPerNode: 1m
baseMemory: 40Mi
memoryPerNode: 6Mi
I valori predefiniti sono:
baseCPU: 200m
cpuPerNode: 1m
baseMemory: 40Mi
memoryPerNode: 6Mi
Modifica la configmap
È possibile modificare ConfigMap con il comando kubectl edit:
kubectl edit cm metrics-server-config -n kube-system
Aggiungere o modificare i campi che si desidera modificare, quindi salvare la ConfigMap e uscire dall'editor.
Il metrics-server fornito da IBM Cloudmonitora la ConfigMap per le modifiche e aggiorna automaticamente le richieste della risorsa di distribuzione. Il metrics-server può impiegare fino a 10 minuti per rilevare
la modifica e implementare una nuova serie di pod in base alle impostazioni aggiornate.
Ripristinare le impostazioni predefinite
Per ripristinare le impostazioni predefinite di metrics-server, eliminare la mappa di configurazione. Viene ricreato in pochi minuti.
kubectl delete cm metrics-server-config -n kube-system
Determinazione delle risorse da ottimizzare
Utilizza il comando kubectl describe pod per ottenere la definizione del pod, le informazioni sullo stato e gli eventi recenti:
kubectl get pod -n kube-system -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-9fb4947d6-s6sgl 3/3 Running 0 2d4h
kubectl describe pod -n kube-system metrics-server-9fb4947d6-s6sgl
Output di esempio
Containers:
metrics-server:
Container ID: containerd://fe3d07c9a2541242d36da8097de3896f740c1363f6d2bfd01b8d96a641192b1b
Image: us.icr.io/armada-master/metrics-server:v0.4.4
Image ID: us.icr.io/armada-master/metrics-server@sha256:c2c63900d0e080c2413b5f35c5a59b5ed3b809099355728cf47527aa3f35477c
Port: 4443/TCP
Host Port: 0/TCP
Command:
/metrics-server
--metric-resolution=45s
--secure-port=4443
--tls-cert-file=/etc/metrics-server-certs/tls.crt
--tls-private-key-file=/etc/metrics-server-certs/tls.key
State: Running
Started: Fri, 10 Sep 2021 17:31:39 +0000
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Fri, 10 Sep 2021 05:59:51 +0000
Finished: Fri, 10 Sep 2021 17:31:37 +0000
Ready: True
Restart Count: 36
Se Last State mostra un Reason di OOMKilled, aumentare le richieste di memoria in metrics-server-config ConfigMap in 100Mi incrementa o aumenta fino a quando il server delle metriche non
è stabile e viene eseguito per diverse ore o più a lungo senza essere OOMkilled.
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Se Last state mostra un Reason di Error ed Eventi come quelli nel seguente esempio, aumentare le richieste CPU in metrics-server-config ConfigMap in 100m incrementi o più fino a quando il
server delle metriche è stabile e viene eseguito per diverse ore o più a lungo senza essere interrotto a causa dei timeout dell'analisi.
Last State: Terminated
Reason: Error
Exit Code: 137
Events:
Warning Unhealthy 46m (x5 over 80m) kubelet Liveness probe failed: Get "https://198.18.68.236:4443/livez": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 26m (x65 over 89m) kubelet Liveness probe failed: Get "https://198.18.68.236:4443/livez": net/http: TLS handshake timeout
Warning Unhealthy 21m (x10 over 76m) kubelet Readiness probe failed: Get "https://198.18.68.236:4443/readyz": net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Warning Unhealthy 115s (x93 over 90m) kubelet Readiness probe failed: Get "https://198.18.68.236:4443/readyz": net/http: TLS handshake timeout
Potrebbe essere necessario ripetere questo processo alcune volte per raggiungere una configurazione stabile, modificando prima le richieste di memoria e quindi le richieste di CPU.
Abilitazione di pagine di grandi dimensioni
Infrastruttura classica Nuvola privata virtuale
È possibile abilitare la pianificazione Kubernetes HugePages nei cluster che eseguono Kubernetes versione 1.19
o successiva. L'unica dimensione di pagina supportata è 2 MB per pagina, che è la dimensione predefinita del gate della funzione Kubernetes.
La programmazione di pagine enormi è una funzione beta di IBM Cloud Kubernetes Service ed è soggetta a modifiche.
Per impostazione predefinita, la CPU dei tuoi nodi di lavoro assegna la RAM in blocchi o pagine di 4 KB. Quando la tua app richiede più RAM, il sistema deve continuare a cercare più pagine, il che può rallentare l'elaborazione. Con pagine enormi, puoi aumentare la dimensione della pagina a 2 MB per aumentare le prestazioni per le tue applicazioni ad alta intensità di RAM come i database per l'intelligenza artificiale (AI), l'internet delle cose (IoT) o i carichi di lavoro di machine learning. Per ulteriori informazioni sulle pagine di dimensioni notevoli, consultare la documentazione del kernel di Linux.
Puoi riavviare il nodo di lavoro e la configurazione delle pagine di notevoli dimensioni persiste. Tuttavia, la configurazione delle pagine enormi non persiste in nessun'altra operazione del ciclo di vita del nodo worker. Devi ripetere i passi di abilitazione ogni volta che aggiorni, ricarichi, sostituisci o aggiungi i nodi di lavoro.
- Ruolo di accesso della piattaforma Operatore e ruolo di accesso del servizio Gestore per il cluster in IAM IBM Cloud
Prima di iniziare: Accedi al tuo account. Se applicabile, specifica il gruppo di risorse appropriato. Imposta il contesto per il tuo cluster.
-
Creare un file di configurazione
hugepages-ds.yamlper abilitare le pagine di grandi dimensioni. Il seguente YAML di esempio usa una serie di daemon per eseguire il pod su ogni nodo di lavoro nel tuo cluster. Puoi impostare l'assegnazione di pagine di dimensioni notevoli disponibili nel nodo di lavoro utilizzando il parametrovm.nr_hugepages. Questo esempio assegna 512 pagine a 2 MB per pagina, per 1 GB di RAM totale assegnata esclusivamente per le pagine di grandi dimensioni.Si desidera abilitare le pagine di grandi dimensioni solo per alcuni nodi di lavoro, come ad esempio un pool di nodi di lavoro che si utilizza per le applicazioni ad uso intensivo di RAM? Label e taint il pool di nodi di lavoro, quindi aggiungi le regole di affinità alla serie di daemon in modo che i pod vengano distribuiti solo ai nodi di lavoro nel pool di nodi di lavoro che specifichi.
apiVersion: apps/v1 kind: DaemonSet metadata: name: hugepages-enablement namespace: kube-system labels: tier: management app: hugepages-enablement spec: selector: matchLabels: name: hugepages-enablement template: metadata: labels: name: hugepages-enablement spec: hostPID: true initContainers: - command: - sh - -c # Customize allocated Hugepages by providing the value - "echo vm.nr_hugepages=512 > /etc/sysctl.d/90-hugepages.conf" image: alpine:3.6 imagePullPolicy: IfNotPresent name: sysctl resources: {} securityContext: privileged: true volumeMounts: - name: modify-sysctld mountPath: /etc/sysctl.d containers: - resources: requests: cpu: 0.01 image: alpine:3.6 # once the init container completes, keep the pod running for worker node changes name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done volumes: - name: modify-sysctld hostPath: path: /etc/sysctl.d -
Applica il file che hai creato in precedenza.
kubectl apply -f hugepages-ds.yaml -
Verificare che i pod siano in esecuzione.
kubectl get pods -
Riavviare il kubelet che viene eseguito su ciascun nodo di lavoro riavviando i nodi di lavoro. Non ricaricare il nodo di lavoro per riavviare kubelet. Ricaricando il nodo di lavoro prima che il kubelet si rilevi sull'abilitazione delle pagine di grandi dimensioni, l'abilitazione non riesce.
- Elenca i nodi di lavoro nel tuo cluster.
ibmcloud ks worker ls -c CLUSTER_NAME_OR_ID ``` 2. Riavviare i nodi di lavoro. Puoi riavviare più nodi di lavoro includendo più opzioni `-w` ma assicurati di lasciare abbastanza nodi di lavoro in esecuzione contemporaneamente per le tue applicazioni per evitare un'interruzione. ```sh {: pre} ibmcloud ks worker reboot -c CLUSTER_NAME_OR_ID -w WORKER1_ID -w WORKER2_ID ``` -
Crea un pod di test
hugepages-test.yamlche monta le pagine di notevoli dimensioni come un volume e utilizza i limiti per le risorse e le richieste per impostare la quantità di risorse di pagine di notevoli dimensioni utilizzate dal pod. Nota: se hai utilizzato etichette, corruzioni e regole di affinità per abilitare le pagine di grandi dimensioni solo su nodi di lavoro selezionati, includi queste stesse regole nel tuo pod di test.apiVersion: v1 kind: Pod metadata: name: hugepages-example spec: containers: - name: hugepages-example image: fedora:34 command: - sleep - inf volumeMounts: - mountPath: /hugepages-2Mi name: hugepage-2mi resources: limits: hugepages-2Mi: 100Mi memory: 100Mi requests: memory: 100Mi volumes: - name: hugepage-2mi emptyDir: medium: HugePages-2Mi -
Applica il file.pod che hai creato in precedenza.
kubectl apply -f hugepages-pod.yaml -
Verifica che il tuo pod utilizzi le risorse di pagine di grandi dimensioni.
- Controlla che il tuo pod sia Running. Il pod non viene eseguito se non sono disponibili nodi di lavoro con pagine di notevoli dimensioni.
kubectl get pods ``` 2. Accedi al pod. ```sh {: pre} kubectl exec -it <pod> /bin/sh ``` 3. Verifica che il tuo pod possa visualizzare le dimensioni delle pagine di dimensioni notevoli. ```sh {: pre} ls /sys/kernel/mm/hugepages ``` Output di esempio ```sh {: screen} hugepages-1048576kB hugepages-2048kB ``` -
Facoltativo: rimuovere la serie di daemon di abilitazione. Tieni presente che devi ricreare la serie di daemon se hai bisogno di aggiornare, ricaricare, sostituire o aggiungere nodi di lavoro con pagine di grandi dimensioni in un secondo momento.
kubectl -n kube-system delete daemonset hugepages-enablement -
Ripeti questi passi ogni volta che aggiorni, ricarichi, sostituisci o aggiungi nodi di lavoro.
Per risolvere i problemi dei nodi di lavoro con pagine di grandi dimensioni, puoi solo riavviare il nodo di lavoro. La configurazione delle pagine di dimensioni notevoli non persiste in altre operazioni del ciclo di vita del nodo di lavoro, come l'aggiornamento, il ricaricamento, la sostituzione o l'aggiunta di nodi di lavoro. Per rimuovere la configurazione delle pagine di notevoli dimensioni dal cluster, è possibile aggiornare, ricaricare o sostituire tutti i nodi di lavoro.
Modifica dell'unità massima di trasmissione (MTU) per i cluster che utilizzano Calico
È possibile aumentare o ridurre il valore della Maximum Transmission Unit (MTU) del nodo di lavoro e del plug-in Calico per soddisfare i requisiti di throughput di rete del proprio ambiente.
Tutti i nodi worker VPC supportano un MTU massimo di 9000 e anche i nodi worker bare metal classici supportano un MTU massimo di 9000. I server virtuali classici supportano solo l'MTU standard di 1500, quindi se il cluster ha nodi worker di server virtuali classici, non aumentare l'MTU del nodo worker o di Calico.
La modifica dei valori dell'unità di trasmissione massima (MTU) può avere risultati inaspettati, soprattutto in ambienti di rete complessi. Per evitare interruzioni del flusso di lavoro, si consiglia di testare queste modifiche su un cluster di sviluppo prima di apportarle ai cluster di produzione.
Per impostazione predefinita, il plug-in di rete Calico nel cluster IBM Cloud Kubernetes Service ha un MTU di 1450 byte per i cluster Satellite e di 1480 byte per i cluster Satellite. Nella maggior parte dei casi, questo valore predefinito della MTU Calico è sufficiente per evitare la caduta e la frammentazione dei pacchetti. Poiché la maggior parte degli host utilizza un valore MTU di 1500, questi valori predefiniti forniscono ai cluster Satellite 50 byte in più per le intestazioni VXLAN e ai cluster Satellite Satellite 20 byte in più per le intestazioni IP utilizzate in alcuni tipi di traffico di rete tra cluster di pod. Si noti che tutti i nodi worker del cluster devono utilizzare lo stesso valore di MTU Calico.
Esamina i seguenti casi in cui potresti dover modificare la MTU predefinita di Calico:
- Se è necessario migliorare il throughput della rete pod-to-pod e i nodi del cluster sono in grado di utilizzare un MTU dell'host più elevato, è possibile aumentare sia l'MTU dell'host che quello di Calico. Questo si chiama "jumbo frame". L'MTU tipico dei jumbo frame è 9000. In questo caso, è possibile impostare l'interfaccia di rete privata dell'host su un valore MTU di 9000 e l'MTU di Calico su un valore leggermente inferiore: 8950 per i cluster Satellite e 8980 per i cluster Satellite. Si noti che alcuni hardware o risorse dei provider cloud, come le macchine virtuali Azure, potrebbero non supportare jumbo frame o supportare solo un valore MTU fino a 4000.
- Se hai una connessione VPN configurata per il tuo cluster, alcune connessioni VPN richiedono una MTU Calico inferiore rispetto al valore predefinito. Verificare con il fornitore del servizio VPN se è necessario impostare un valore MTU inferiore Calico.
- Prima di iniziare
- Se i tuoi nodi di lavoro eseguono ancora il valore MTU predefinito, aumenta il valore MTU per i tuoi nodi di lavoro prima di aumentare il valore MTU per il plug-in Calico. Ad esempio, è possibile applicare il seguente set di demoni per modificare
l'MTU dei nodi worker a 9000 byte. Tieni presente che i nomi dell'interfaccia utilizzati nel comando
ip linkvariano a seconda del tipo di nodi di lavoro.- Comando di esempio per i nodi di lavoro Bare Metal:
ip link set dev bond0 mtu 9000;ip link set dev bond1 mtu 9000; - Esempio di comando nodi worker VPC:
ip link set dev ens3 mtu 9000;
- Comando di esempio per i nodi di lavoro Bare Metal:
-
Esegui i seguenti comandi per accedere a un nodo cluster worker e inviare un ping da un nodo all'altro. Poiché l'MTU del nodo è impostato solo su 1500 o 1480, questo tentativo è destinato a fallire. Nei passaggi successivi, è possibile eseguire nuovamente questi comandi per verificare che le modifiche siano state apportate con successo.
- Elenca i nodi nel tuo cluster. Salvare i nomi e gli indirizzi IP di due nodi sani.
kubectl get nodes -o wide ``` 1. Accedi a uno dei nodi. Specificare il nome del nodo. ```sh {: pre} kubectl debug --image=us.icr.io/armada-master/network-alpine -it node/<NODE_NAME> -- sh ``` 1. Eseguire il comando per eseguire il ping da un nodo all'altro. Specificare l'indirizzo IP del nodo di cui non si è fatto riferimento nel passaggio precedente. ```sh {: pre} ping -c1 -Mdo -s 8972 <OTHER_HOST_IP> ``` -
Modificare l'MTU del nodo con il seguente esempio di daemonset. Questo valore MTU si applica al traffico da nodo a nodo. Modificare la riga
- ip link set dev ens3 mtu <MTU_VALUE>per includere il proprio valore MTU (l'esempio utilizza un valore MTU di 9000). Si noti che potrebbe essere necessario cambiare il nome dell'interfaccia 'ens3se ens3 non è appropriato per i propri nodi.apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: set-host-mtu name: set-host-mtu namespace: kube-system spec: selector: matchLabels: name: set-host-mtu template: metadata: labels: name: set-host-mtu spec: containers: - args: - | while true; do sleep 100000; done command: - /bin/sh - -c image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: IfNotPresent name: sleepforever resources: requests: cpu: 10m hostNetwork: true initContainers: - command: - sh - -c - ip link set dev ens3 mtu 9000 image: us.icr.io/armada-master/network-alpine:latest imagePullPolicy: IfNotPresent name: set-host-mtu securityContext: capabilities: add: - NET_ADMIN privileged: true volumeMounts: - mountPath: /sys name: modifysys restartPolicy: Always terminationGracePeriodSeconds: 2 tolerations: - operator: Exists volumes: - hostPath: path: /sys type: "" name: modifysys updateStrategy: rollingUpdate: maxSurge: 0 maxUnavailable: 1 type: RollingUpdate -
Applicare il daemonset per modificare il valore MTU del nodo.
kubectl apply -f <file_name> -
Eseguite nuovamente i comandi per accedere a un nodo e per eseguire il ping da un host all'altro, utilizzando un pacchetto di grandi dimensioni. Ora che è stato aumentato il valore MTU del nodo, il comando '
pingdovrebbe avere successo.kubectl debug --image=us.icr.io/armada-master/network-alpine -it node/<NODE_NAME> -- shping -c1 -Mdo -s 8972 <OTHER_HOST_IP> -
Prendete tempo per testare il vostro cluster con il nuovo valore di MTU dei nodi. Prima di continuare a modificare il valore MTU di Calico, si consiglia di verificare che le applicazioni continuino a funzionare come previsto.
-
Eseguire il comando per aggiornare i valori MTU di Calico in modo che anche il traffico pod-to-pod possa utilizzare l'MTU più grande. Per i cluster Satellite Core OS, il valore MTU di Calico deve essere inferiore di 50 byte rispetto al valore MTU del nodo. Per tutti gli altri cluster, il valore MTU di Calico deve essere inferiore di 20 byte. Ad esempio, se si è specificato 9000 per l'MTU del nodo, l'MTU di Calico deve essere 8950 per i cluster Satellite Core OS o 8980 per tutti gli altri cluster.
kubectl patch installation.operator.tigera.io default --type='merge' -p '{"spec":{"calicoNetwork":{"mtu":<MTU_VALUE>}}}'Si può anche modificare la risorsa direttamente eseguendo '
kubectl edit installation.operator.tigera.io default. -
Applicare queste modifiche a tutti i nodi riavviando con cura tutti i nodi. Assicurarsi di aver testato questo processo su un cluster di sviluppo prima di continuare con questa fase, poiché queste modifiche potrebbero causare interruzioni del carico di lavoro. Per riavviare i nodi, si consiglia di cordonare, svuotare e riavviare i nodi uno alla volta.
Se si completano questi passaggi su un cluster di produzione, si deve usare lo stesso processo utilizzato per l'aggiornamento o la sostituzione dei nodi di produzione. Si consiglia vivamente di testare l'intero processo su un cluster di prova prima di completare questi passaggi su un cluster di produzione.
Durante il processo di riavvio, alcuni pod utilizzano il nuovo MTU più grande e altri hanno ancora l'MTU originale, più piccolo. In genere, questo scenario non causa problemi perché entrambe le parti negoziano la dimensione massima corretta dei pacchetti. Tuttavia, se si bloccano i pacchetti ICMP, la negoziazione potrebbe non funzionare e il cluster potrebbe avere problemi di connessione al pod fino al completamento di tutti i riavvii. È fondamentale che questo processo venga prima testato su un cluster di sviluppo.
Disabilitare il plug-in della mappa delle porte in Calico
Il plugin portmap per la CNI (container network interface) Calico ti consente di utilizzare una hostPort per esporre i tuoi pod dell'applicazione in una porta specifica sul nodo di lavoro. Per evitare problemi di prestazioni
di iptables, rimuovi il plug-in "port map" dalla configurazione CNI " Calico " del tuo cluster.
Quando nel cluster sono presenti molti servizi, ad esempio più di 500, oppure molti porti sui servizi, ad esempio più di 50 porti per servizio su 10 o più servizi, vengono generate numerose regole iptables per le politiche di rete “ Calico ”
e “ Kubernetes ” relative a tali servizi. L'utilizzo di un numero elevato di regole iptables può causare problemi di prestazioni per il plug-in port map e potrebbe impedire futuri aggiornamenti delle regole iptables o provocare il riavvio
del container calico-node qualora non venga ricevuto alcun blocco per effettuare gli aggiornamenti delle regole iptables entro un determinato periodo di tempo. Per evitare questi problemi di prestazioni, è possibile disabilitare
il plug-in di mappatura delle porte rimuovendolo dalla configurazione CNI di Calico del proprio cluster.
Se è necessario utilizzare hostPorts, non disabilitare il plug-in della mappa di porte.
-
Modifica la risorsa di installazione Calico
default.kubectl edit installation default -n calico-system -
Nella sezione
spec.calicoNetwork, modifica il valore dihostPortsconDisabled.... spec: calicoNetwork: hostPorts: Disabled ipPools: - cidr: 172.30.0.0/16 encapsulation: IPIPCrossSubnet natOutgoing: Enabled nodeSelector: all() mtu: 1480 nodeAddressAutodetectionV4: interface: (^bond0$|^eth0$|^ens6$|^ens3$) kubernetesProvider: OpenShift registry: us.icr.io/armada-master/ variant: Calico status: variant: Calico -
Salva e chiudi il file. Le tue modifiche vengono applicate automaticamente.