Leistung für Red Hat CoreOS-Workerknoten optimieren
Satellite
- Unterstützte Betriebssysteme für Workerknoten
- Red Hat CoreOS (
RHCOS)
Sie können die Leistung Ihrer Red Hat CoreOS Worker Nodes optimieren, indem Sie CPU-Pinning, ungleichmäßigen Speicherzugriff (NUMA) und große Seiten aktivieren. Diese Konfigurationen können für Anwendungen mit strengen Leistungsanforderungen von Vorteil sein. Diese Anpassungen können jedoch zu Problemen bei der Arbeitslastplanung führen.
Anstatt die Leistung der Arbeitsknoten mit MachineConfig Dateien in Red Hat OpenShift zu optimieren, können Sie den Host mit einer daemonset Datei ändern. Weitere Informationen finden Sie unter Ändern der Calico MTU oder Tuning der Leistung für Red Hat CoreOS Worker Nodes.
Erkennungsoperator für Node Feature implementieren
Satellite
Bevor Sie NUMA, CPU-Pinning und Huge Pages auf Ihren Workerknoten aktivieren können, müssen Sie Node Feature Discovery Operator bereitstellen. Weitere Informationen finden Sie unter Node Feature Discovery Operator.
Uneinheitlichen Speicherzugriff (NUMA), CPU-Pinning und Huge Pages auf Ihren Workerknoten aktivieren
Satellite
Stellen Sie zunächst sicher, dass Sie den Node Feature Discovery Operator implementiert haben.
-
Speichern Sie die folgende Datei
DaemonSetin einer Datei namenscustomize.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 -
Bearbeiten Sie die Werte für
DaemonSet, um die Leistung zu optimieren.
NUMBER_OF_HUGEPAGES-
Geben Sie die Anzahl der Huge Pages ein, die Sie zuordnen wollen. Beispiel:
2048. Wenn Sie Huge Pages nicht aktivieren möchten, geben Sie0ein. Je mehr Huge Pages Sie zuordnen, desto weniger Gesamtspeicher steht Ihren Anwendungen zur Verfügung. TOPOLOGY_MANAGER_POLICY_VALUE-
Geben Sie die zu verwendende Topologiemanager-Richtlinie ein. Die Richtlinie
best-effortwird empfohlen, um eine maximale Verfügbarkeit von Terminen zu gewährleisten. Sie können jedoch auch andere Richtlinien für eine strengere Anforderungsüberprüfung verwenden und dabei die Verfügbarkeit der Workload-Planung reduzieren. Weitere Informationen finden Sie unter Topologie-Manager.Sie können den Abschnitt
nodeSelectorbearbeiten, um die Konfiguration nur auf eine Untergruppe Ihrer Workerknoten anzuwenden.
- Führen Sie den folgenden Befehl aus, um die „
DaemonSet“ anzuwenden.kubectl replace --force -f customize.yaml - Überprüfen Sie, dass die Pods in den Zustand
Runningeingetreten sind.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Nachdem die Pods ausgeführt werden, starten Sie jeden Workerknoten neu.
- Stellen Sie einen Debug-Pod auf Ihrem Worker-Knoten bereit.
oc debug node/NODE_NAME ``` 1. Führen Sie nach dem Start der Debugsitzung den folgenden Befehl aus. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Wiederholen Sie diese Schritte für jeden Worker-Knoten, den Sie neu starten möchten.
CPU-Pinning und Huge Pages auf Ihren Workerknoten aktivieren
Satellite
Stellen Sie zunächst sicher, dass Sie den Node Feature Discovery Operator implementiert haben.
-
Speichern Sie die folgende Datei
DaemonSetin einer Datei namenscpu-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 -
Bearbeiten Sie die Werte für
DaemonSet, um die Leistung zu optimieren.
NUMBER_OF_HUGEPAGES-
Geben Sie die Anzahl der Huge Pages ein, die Sie zuordnen wollen. Beispiel:
2048. Wenn Sie Huge Pages nicht aktivieren möchten, geben Sie0ein. Je mehr Huge Pages Sie zuordnen, desto weniger Gesamtspeicher steht Ihren Anwendungen zur Verfügung.Sie können den Abschnitt
nodeSelectorbearbeiten, um die Konfiguration nur auf eine Untergruppe Ihrer Workerknoten anzuwenden.
- Führen Sie den folgenden Befehl aus, um die „
DaemonSet“ anzuwenden.kubectl replace --force -f cpu-pinnning.yaml - Überprüfen Sie, dass die Pods in den Zustand
Runningeingetreten sind.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Nachdem die Pods ausgeführt werden, starten Sie jeden Workerknoten neu.
- Stellen Sie einen Debug-Pod auf Ihrem Worker-Knoten bereit.
oc debug node/NODE_NAME ``` 1. Führen Sie nach dem Start der Debugsitzung den folgenden Befehl aus. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Wiederholen Sie diese Schritte für jeden Worker-Knoten, den Sie neu starten möchten.
kernel-devel-Pakete aktivieren
Satellite
Möglicherweise müssen Sie kernel-devel-Pakete für die Verwendung von Satellite-Services oder -Speicher wie Spectrum Scale Fusion aktivieren.
Führen Sie die folgenden Schritte aus, um kernel-devel zu aktivieren, indem Sie eine angepasste Konfigurationszuordnung und eine Maschinenkonfiguration auf Ihre Workerknoten anwenden.
-
Führen Sie den folgenden Befehl aus, um die „
MachineConfig“ anzuwenden.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 -
Warten Sie, bis die Ressourcen bereitgestellt sind. Dies kann 5 Minuten oder länger dauern.
-
Überprüfen Sie die Details der Konfigurationszuordnung, um sicherzustellen, dass die Implementierung erfolgreich war.
- Vergewissern Sie sich, dass das Feld
config-validation="valid"vorhanden ist.
kubectl get cm -n ibm-machine-config user-ignition-config-97-kerneldevel -o yaml | grep config-validation ``` 1. Stellen Sie sicher, dass `user-ignition-config-97-kerneldevel` in der Konfigurationsübersicht vorhanden ist. ```sh {: pre} kubectl get cm -n ibm-machine-config -l ibm-cloud.kubernetes.io/nodepoolfeedback="true" -o yaml | grep user-ignition-config-97-kerneldevel ``` - Vergewissern Sie sich, dass das Feld
-
Fügen Sie Ihrem Cluster Worker-Knoten hinzu. Für Workerknoten, die Sie hinzufügen, ist
kernel-develaktiviert. -
Stellen Sie sicher, dass „
kernel-devel“ aktiviert ist.- Starten Sie einen Debug-Pod auf einem Ihrer Knoten.
oc debug node/NODEIP ``` 1. Führen Sie den folgenden Befehl „ `nsenter` “ aus. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- rpm -qa | grep kernel-devel ``` -
Optional: Wenn Sie
kernel-develnicht mehr benötigen, können Sie es entfernen, indem Sie den folgenden Befehl ausführen:kubectl delete cm -n ibm-machine-config user-ignition-config-97-kerneldevel
Leistungsanpassungen entfernen
Satellite
Wenn Sie Anpassungen von Ihren Workerknoten entfernen und auf die Standardkonfigurationen zurücksetzen wollen, wenden Sie die folgende DaemonSet an.
-
Speichern Sie die folgende Datei
DaemonSetin einer Datei namensremove-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 -
Wenden Sie die „
DaemonSet“ auf Ihren Cluster an, indem Sie den folgenden Befehl ausführen.kubectl replace --force -f remove-custom.yaml -
Überprüfen Sie, ob die Pods in den Status
Runningeingetreten sind.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide -
Nachdem die Pods ausgeführt werden, starten Sie jeden Workerknoten neu.
- Stellen Sie einen Debug-Pod auf Ihrem Worker-Knoten bereit.
oc debug node/NODE_NAME ``` 1. Führen Sie nach dem Start der Debugsitzung den folgenden Befehl aus. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Wiederholen Sie diese Schritte für jeden Worker-Knoten, den Sie neu starten möchten.