Ottimizzazione delle prestazioni per i nodi di lavoro Red Hat CoreOS
Satellite
- Sistemi operativi del nodo di lavoro supportati
- Red Hat CoreOS (
RHCOS)
È possibile ottimizzare le prestazioni del nodo worker Red Hat CoreOS abilitando il pinning della CPU, l'accesso non uniforme alla memoria (NUMA) e le pagine enormi. Queste configurazioni possono essere vantaggiose per le applicazioni che hanno requisiti di prestazioni rigorosi. Tuttavia, queste personalizzazioni potrebbero causare problemi di programmazione del carico di lavoro.
Invece di regolare le prestazioni dei nodi worker con i file MachineConfig in Red Hat OpenShift, è possibile modificare l'host con un file daemonset. Per ulteriori informazioni, vedere Modifica dell'MTU di Calico o Ottimizzazione delle prestazioni per i nodi worker di Red Hat CoreOS.
Distribuzione di Node Feature Discovery Operator
Satellite
Prima di poter abilitare NUMA, il blocco della CPU e le pagine di grandi dimensioni sui tuoi nodi di lavoro, devi distribuire l'operatore di rilevamento della funzione Node. Per ulteriori informazioni, vedere Node Feature Discovery Operator.
Abilitazione dell'accesso alla memoria non uniforme (NUMA), del blocco CPU e delle pagine di grandi dimensioni sui tuoi nodi di lavoro
Satellite
Prima di cominciare, assicurarsi di aver distribuito Node Feature Discovery Operator.
-
Salvare il seguente
DaemonSetin un file denominatocustomize.yaml.--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ibm-user-custom-configurator-privileged roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:openshift:scc:privileged subjects: - kind: ServiceAccount name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: ibm-user-custom-configurator namespace: kube-system data: 89-hugepages.conf: | vm.nr_hugepages=<<NUMBER_OF_HUGEPAGES>> configure.sh: | #!/usr/bin/env bash set -x cp -f /scripts/ibm-user-custom-configuration.sh /host-usr-local-bin/ibm-user-custom-configuration.sh chmod 0755 /host-usr-local-bin/ibm-user-custom-configuration.sh cp -f /scripts/ibm-user-custom-configuration.service /host-etc-systemd-dir/ibm-user-custom-configuration.service chmod 0644 /host-etc-systemd-dir/ibm-user-custom-configuration.service if [[ -f /scripts/89-hugepages.conf ]]; then cp -f /scripts/89-hugepages.conf /host-etc-systctld-dir/89-hugepages.conf fi nsenter -t 1 -m -u -i -n -p -- systemctl daemon-reload nsenter -t 1 -m -u -i -n -p -- systemctl enable ibm-user-custom-configuration.service nsenter -t 1 -m -u -i -n -p -- systemctl start ibm-user-custom-configuration.service ibm-user-custom-configuration.sh: | #!/usr/bin/env bash set -x GIGABYTES_RESERVED_MEMORY=$(echo $SYSTEM_RESERVED_MEMORY | awk -F 'Gi' '{print $1}') GIGABYTES_RESERVED_MEMORY_ROUNDED_UP=$(echo $GIGABYTES_RESERVED_MEMORY | awk '{print int($1+0.999)}') sed -i "s/SYSTEM_RESERVED_MEMORY=.*/SYSTEM_RESERVED_MEMORY=${GIGABYTES_RESERVED_MEMORY_ROUNDED_UP}Gi/g" /etc/node-sizing.env TOTAL_NUMA_MEMORY_TO_ALLOCATE=$(echo "$GIGABYTES_RESERVED_MEMORY_ROUNDED_UP" "1024" | awk '{print $1 * $2 + 100}') if cat /etc/kubernetes/kubelet.conf | jq -r .; then cat >/tmp/ibm-user-config.conf.json <<EOF { "topologyManagerPolicy": "<<TOPOLOGY_MANAGER_POLICY_VALUE>>", "memoryManagerPolicy": "Static", "cpuManagerPolicy": "static", "reservedMemory": [ { "numaNode": 0, "limits": { "memory": "${TOTAL_NUMA_MEMORY_TO_ALLOCATE}Mi" } } ] } EOF if ! cat /tmp/ibm-user-config.conf.json | jq -r .; then exit 1 fi if ! jq -s '.[0] * .[1]' /tmp/ibm-user-config.conf.json /etc/kubernetes/kubelet.conf > /etc/kubernetes/tmp-kubelet.conf; then exit 1 fi mv -f /etc/kubernetes/tmp-kubelet.conf /etc/kubernetes/kubelet.conf else cat >/tmp/ibm-user-config.conf <<EOF #START USER CONFIG topologyManagerPolicy: <<TOPOLOGY_MANAGER_POLICY_VALUE>> memoryManagerPolicy: Static cpuManagerPolicy: static reservedMemory: - numaNode: 0 limits: memory: ${TOTAL_NUMA_MEMORY_TO_ALLOCATE}Mi #END USER CONFIG EOF sed -i '/#START USER CONFIG/,/#END USER CONFIG/d' /etc/kubernetes/kubelet.conf cat /tmp/ibm-user-config.conf >>/etc/kubernetes/kubelet.conf fi ibm-user-custom-configuration.service: | [Unit] Description=Add custom user config to kubelet Before=kubelet.service After=kubelet-auto-node-size.service [Service] Type=oneshot RemainAfterExit=yes EnvironmentFile=/etc/node-sizing.env ExecStart=/usr/local/bin/ibm-user-custom-configuration.sh [Install] WantedBy=multi-user.target --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: ibm-user-custom-configurator name: ibm-user-custom-configurator namespace: kube-system spec: selector: matchLabels: app: ibm-user-custom-configurator template: metadata: labels: app: ibm-user-custom-configurator spec: nodeSelector: feature.node.kubernetes.io/memory-numa: "true" ibm-cloud.kubernetes.io/os: RHCOS tolerations: - operator: "Exists" hostPID: true serviceAccount: ibm-user-custom-configurator initContainers: - name: configure image: "registry.access.redhat.com/ubi8/ubi:8.6" command: ['/bin/bash', '-c', 'mkdir /cache && cp /scripts/configure.sh /cache && chmod +x /cache/configure.sh && /bin/bash /cache/configure.sh'] securityContext: privileged: true volumeMounts: - mountPath: /scripts name: script-config - mountPath: /host-etc-systemd-dir name: etc-systemd-dir - mountPath: /host-usr-local-bin name: usr-local-bin - mountPath: /host-etc-systctld-dir name: etc-systctld-dir containers: - name: pause image: us.icr.io/armada-master/pause:3.2 volumes: - name: etc-systemd-dir hostPath: path: /etc/systemd/system - name: etc-systctld-dir hostPath: path: /etc/sysctl.d - name: usr-local-bin hostPath: path: /usr/local/bin - name: script-config configMap: name: ibm-user-custom-configurator -
Modificare i valori
DaemonSetper regolare le prestazioni.
NUMBER_OF_HUGEPAGES-
Immettere il numero di pagine di dimensioni notevoli che si desidera assegnare. Ad esempio:
2048. Se non si desidera abilitare le pagine di grandi dimensioni, immettere0. Maggiore è il numero di pagine di grandi dimensioni assegnate, minore è la quantità di memoria complessiva disponibile per le applicazioni. TOPOLOGY_MANAGER_POLICY_VALUE-
Immettere il criterio di gestione della topologia che si desidera utilizzare. Il criterio
best-effortè consigliato per garantire la massima disponibilità di pianificazione. Tuttavia, è possibile utilizzare altri criteri per la convalida di requisiti più severi, riducendo al contempo la disponibilità di pianificazione del carico di lavoro. Per ulteriori informazioni, vedere Topology Manager.Puoi modificare la sezione
nodeSelectorper applicare la configurazione solo a un sottoinsieme dei tuoi nodi di lavoro.
- Applicare l'
DaemonSete eseguendo il seguente comando.kubectl replace --force -f customize.yaml - Verifica che i pod siano entrati nello stato
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Dopo che i pod sono in esecuzione, riavvia ogni nodo di lavoro.
- Distribuisci un pod di debug sul nodo di lavoro.
oc debug node/NODE_NAME ``` 1. Una volta avviata la sessione di debug, eseguire il seguente comando. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Ripeti questi passaggi per ogni nodo di lavoro che desideri riavviare.
Abilitazione del blocco della CPU e delle pagine di grandi dimensioni sui nodi di lavoro
Satellite
Prima di cominciare, assicurarsi di aver distribuito Node Feature Discovery Operator.
-
Salvare il seguente
DaemonSetin un file denominatocpu-pinning.yaml.--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ibm-user-custom-configurator-privileged roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:openshift:scc:privileged subjects: - kind: ServiceAccount name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: ibm-user-custom-configurator namespace: kube-system data: 89-hugepages.conf: | vm.nr_hugepages=<<NUMBER_OF_HUGEPAGES>> configure.sh: | #!/usr/bin/env bash set -x cp -f /scripts/ibm-user-custom-configuration.sh /host-usr-local-bin/ibm-user-custom-configuration.sh chmod 0755 /host-usr-local-bin/ibm-user-custom-configuration.sh cp -f /scripts/ibm-user-custom-configuration.service /host-etc-systemd-dir/ibm-user-custom-configuration.service chmod 0644 /host-etc-systemd-dir/ibm-user-custom-configuration.service if [[ -f /scripts/89-hugepages.conf ]]; then cp -f /scripts/89-hugepages.conf /host-etc-systctld-dir/89-hugepages.conf fi nsenter -t 1 -m -u -i -n -p -- systemctl daemon-reload nsenter -t 1 -m -u -i -n -p -- systemctl enable ibm-user-custom-configuration.service nsenter -t 1 -m -u -i -n -p -- systemctl start ibm-user-custom-configuration.service ibm-user-custom-configuration.sh: | #!/usr/bin/env bash set -x if cat /etc/kubernetes/kubelet.conf | jq -r .; then cat >/tmp/ibm-user-config.conf.json <<EOF { "cpuManagerPolicy": "static" } EOF if ! cat /tmp/ibm-user-config.conf.json | jq -r .; then exit 1 fi if ! jq -s '.[0] * .[1]' /tmp/ibm-user-config.conf.json /etc/kubernetes/kubelet.conf > /etc/kubernetes/tmp-kubelet.conf; then exit 1 fi mv -f /etc/kubernetes/tmp-kubelet.conf /etc/kubernetes/kubelet.conf else cat >/tmp/ibm-user-config.conf <<EOF #START USER CONFIG cpuManagerPolicy: static #END USER CONFIG EOF sed -i '/#START USER CONFIG/,/#END USER CONFIG/d' /etc/kubernetes/kubelet.conf cat /tmp/ibm-user-config.conf >>/etc/kubernetes/kubelet.conf fi ibm-user-custom-configuration.service: | [Unit] Description=Add custom user config to kubelet Before=kubelet.service After=kubelet-auto-node-size.service [Service] Type=oneshot RemainAfterExit=yes EnvironmentFile=/etc/node-sizing.env ExecStart=/usr/local/bin/ibm-user-custom-configuration.sh [Install] WantedBy=multi-user.target --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: ibm-user-custom-configurator name: ibm-user-custom-configurator namespace: kube-system spec: selector: matchLabels: app: ibm-user-custom-configurator template: metadata: labels: app: ibm-user-custom-configurator spec: nodeSelector: ibm-cloud.kubernetes.io/os: RHCOS tolerations: - operator: "Exists" hostPID: true serviceAccount: ibm-user-custom-configurator initContainers: - name: configure image: "registry.access.redhat.com/ubi8/ubi:8.6" command: ['/bin/bash', '-c', 'mkdir /cache && cp /scripts/configure.sh /cache && chmod +x /cache/configure.sh && /bin/bash /cache/configure.sh'] securityContext: privileged: true volumeMounts: - mountPath: /scripts name: script-config - mountPath: /host-etc-systemd-dir name: etc-systemd-dir - mountPath: /host-usr-local-bin name: usr-local-bin - mountPath: /host-etc-systctld-dir name: etc-systctld-dir containers: - name: pause image: us.icr.io/armada-master/pause:3.2 volumes: - name: etc-systemd-dir hostPath: path: /etc/systemd/system - name: etc-systctld-dir hostPath: path: /etc/sysctl.d - name: usr-local-bin hostPath: path: /usr/local/bin - name: script-config configMap: name: ibm-user-custom-configurator -
Modificare i valori
DaemonSetper regolare le prestazioni.
NUMBER_OF_HUGEPAGES-
Immettere il numero di pagine di dimensioni notevoli che si desidera assegnare. Ad esempio:
2048. Se non si desidera abilitare le pagine di grandi dimensioni, immettere0. Maggiore è il numero di pagine di grandi dimensioni assegnate, minore è la quantità di memoria complessiva disponibile per le applicazioni.Puoi modificare la sezione
nodeSelectorper applicare la configurazione solo a un sottoinsieme dei tuoi nodi di lavoro.
- Applicare l'
DaemonSete eseguendo il seguente comando.kubectl replace --force -f cpu-pinnning.yaml - Verifica che i pod siano entrati nello stato
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Dopo che i pod sono in esecuzione, riavvia ogni nodo di lavoro.
- Distribuisci un pod di debug sul nodo di lavoro.
oc debug node/NODE_NAME ``` 1. Una volta avviata la sessione di debug, eseguire il seguente comando. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Ripeti questi passaggi per ogni nodo di lavoro che desideri riavviare.
Abilitazione dei pacchetti kernel-devel
Satellite
Potresti dover abilitare i pacchetti kernel-devel per utilizzare i servizi Satellite o l'archiviazione come Spectrum Scale Fusion.
Completa la seguente procedura per abilitare kernel-devel applicando una mappa di configurazione personalizzata e la configurazione della macchina ai tuoi nodi di lavoro.
-
Eseguire il seguente comando per applicare l'
MachineConfig.ibmcloud ks cluster config --cluster CLUSTERID cat >"/tmp/kernel-devel-payload.yaml" <<EOF apiVersion: v1 kind: List metadata: name: pvg-machine-config-tester annotations: items: - apiVersion: v1 kind: Namespace metadata: name: ibm-machine-config - apiVersion: v1 data: config: |+ apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: name: 97-kerneldevel labels: machineconfiguration.openshift.io/role: worker spec: config: ignition: version: 3.2.0 extensions: - kernel-devel kind: ConfigMap metadata: labels: ibm-cloud.kubernetes.io/user-specified-config: "true" name: user-ignition-config-97-kerneldevel namespace: ibm-machine-config EOF kubectl apply -f /tmp/kernel-devel-payload.yaml -
Attendere il completamento della distribuzione delle risorse. Questa operazione potrebbe richiedere 5 minuti o più.
-
Esaminare i dettagli della mappa di configurazione per confermare che la distribuzione è stata eseguita correttamente.
- Confermare che il campo
config-validation="valid"sia presente.
kubectl get cm -n ibm-machine-config user-ignition-config-97-kerneldevel -o yaml | grep config-validation ``` 1. Confermare che `user-ignition-config-97-kerneldevel` sia presente nella mappa di configurazione. ```sh {: pre} kubectl get cm -n ibm-machine-config -l ibm-cloud.kubernetes.io/nodepoolfeedback="true" -o yaml | grep user-ignition-config-97-kerneldevel ``` - Confermare che il campo
-
Aggiungi dei nodi di lavoro al tuo cluster. I nodi di lavoro che aggiungi hanno
kernel-develabilitato. -
Verificare che
kernel-develsia abilitato.- Avviare un pod di debug su uno dei nodi.
oc debug node/NODEIP ``` 1. Esegui il seguente comando `nsenter`. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- rpm -qa | grep kernel-devel ``` -
Facoltativo: se non hai più bisogno di
kernel-devel, puoi rimuoverlo eseguendo questo comando.kubectl delete cm -n ibm-machine-config user-ignition-config-97-kerneldevel
Rimozione delle personalizzazioni delle prestazioni
Satellite
Se vuoi rimuovere le personalizzazioni dai tuoi nodi di lavoro e reimpostarle sulle configurazioni predefinite, applica il seguente DaemonSet.
-
Salvare il seguente
DaemonSetin un file denominatoremove-custom.yaml.--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ibm-user-custom-configurator-privileged roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:openshift:scc:privileged subjects: - kind: ServiceAccount name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: ibm-user-custom-configurator namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: ibm-user-custom-configurator namespace: kube-system data: 89-hugepages.conf: | vm.nr_hugepages=0 configure.sh: | #!/usr/bin/env bash set -x cp -f /scripts/ibm-user-custom-configuration.sh /host-usr-local-bin/ibm-user-custom-configuration.sh chmod 0755 /host-usr-local-bin/ibm-user-custom-configuration.sh cp -f /scripts/ibm-user-custom-configuration.service /host-etc-systemd-dir/ibm-user-custom-configuration.service chmod 0644 /host-etc-systemd-dir/ibm-user-custom-configuration.service if [[ -f /scripts/89-hugepages.conf ]]; then cp -f /scripts/89-hugepages.conf /host-etc-systctld-dir/89-hugepages.conf fi nsenter -t 1 -m -u -i -n -p -- systemctl daemon-reload nsenter -t 1 -m -u -i -n -p -- systemctl enable ibm-user-custom-configuration.service nsenter -t 1 -m -u -i -n -p -- systemctl start ibm-user-custom-configuration.service ibm-user-custom-configuration.sh: | #!/usr/bin/env bash set -x if cat /etc/kubernetes/kubelet.conf | jq -r .; then if ! jq 'del(.topologyManagerPolicy, .memoryManagerPolicy, .cpuManagerPolicy, .reservedMemory)' /etc/kubernetes/kubelet.conf > /etc/kubernetes/tmp-kubelet.conf; then exit 1 fi mv -f /etc/kubernetes/tmp-kubelet.conf /etc/kubernetes/kubelet.conf else sed -i '/#START USER CONFIG/,/#END USER CONFIG/d' /etc/kubernetes/kubelet.conf fi ibm-user-custom-configuration.service: | [Unit] Description=Add custom user config to kubelet Before=kubelet.service After=kubelet-auto-node-size.service [Service] Type=oneshot RemainAfterExit=yes EnvironmentFile=/etc/node-sizing.env ExecStart=/usr/local/bin/ibm-user-custom-configuration.sh [Install] WantedBy=multi-user.target --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: ibm-user-custom-configurator name: ibm-user-custom-configurator namespace: kube-system spec: selector: matchLabels: app: ibm-user-custom-configurator template: metadata: labels: app: ibm-user-custom-configurator spec: nodeSelector: ibm-cloud.kubernetes.io/os: RHCOS tolerations: - operator: "Exists" hostPID: true serviceAccount: ibm-user-custom-configurator initContainers: - name: configure image: "registry.access.redhat.com/ubi8/ubi:8.6" command: ['/bin/bash', '-c', 'mkdir /cache && cp /scripts/configure.sh /cache && chmod +x /cache/configure.sh && /bin/bash /cache/configure.sh'] securityContext: privileged: true volumeMounts: - mountPath: /scripts name: script-config - mountPath: /host-etc-systemd-dir name: etc-systemd-dir - mountPath: /host-usr-local-bin name: usr-local-bin - mountPath: /host-etc-systctld-dir name: etc-systctld-dir containers: - name: pause image: us.icr.io/armada-master/pause:3.2 volumes: - name: etc-systemd-dir hostPath: path: /etc/systemd/system - name: etc-systctld-dir hostPath: path: /etc/sysctl.d - name: usr-local-bin hostPath: path: /usr/local/bin - name: script-config configMap: name: ibm-user-custom-configurator -
Applica
DaemonSetal tuo cluster immettendo il seguente comando.kubectl replace --force -f remove-custom.yaml -
Verificare che i pod siano entrati nello stato
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide -
Dopo che i pod sono in esecuzione, riavvia ogni nodo di lavoro.
- Distribuisci un pod di debug sul nodo di lavoro.
oc debug node/NODE_NAME ``` 1. Una volta avviata la sessione di debug, eseguire il seguente comando. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Ripeti questi passaggi per ogni nodo di lavoro che desideri riavviare.