Desempenho de Ajuste para Nós do Trabalhador Red Hat CoreOS
Satellite
- Sistemas operacionais de nó do trabalhador suportado
- Red Hat CoreOS (
RHCOS)
Você pode ajustar o desempenho do nó de trabalho Red Hat CoreOS ativando a fixação da CPU, o acesso não uniforme à memória (NUMA) e páginas enormes. Essas configurações podem beneficiar os aplicativos que têm requisitos rigorosos de desempenho. No entanto, essas personalizações podem causar problemas de agendamento de carga de trabalho.
Em vez de ajustar o desempenho do nó de trabalho com arquivos MachineConfig em Red Hat OpenShift, você pode modificar o host com um arquivo daemonset. Para obter mais informações, consulte Alteração do MTU do Calico ou Ajuste do desempenho dos nós de trabalho do Red Hat CoreOS.
Implementando o Node Feature Discovery Operator
Satellite
Antes de ativar o NUMA, pinning de CPU e páginas enormes em seus nós do trabalhador, você deve implementar o Node Feature Discovery Operator. Para obter mais informações, consulte Node Operador de descoberta de recursos.
Como ativar o acesso de memória não uniforme (NUMA), pinning de CPU e páginas enormes em seus nós do trabalhador
Satellite
Antes de começar, certise-se de ter implantado o Node Feature Discovery Operator.
-
Salve o seguinte arquivo
DaemonSetem um arquivo chamadocustomize.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 -
Edite os valores
DaemonSetpara ajustar o desempenho.
NUMBER_OF_HUGEPAGES-
Digite o número de páginas enormes que você deseja alocar. Por exemplo:
2048. Se você não quiser ativar páginas enormes, digite0. Quanto mais páginas enormes você alocar, a memória menos geral está disponível para suas aplicações. TOPOLOGY_MANAGER_POLICY_VALUE-
Digite a política do gerenciador de topologia que você deseja usar. A política
best-efforté recomendada para garantir a disponibilidade máxima de agendamento. No entanto, você pode usar outras políticas para validação de requisitos mais rígidos e, ao mesmo tempo, reduzir a disponibilidade de agendamento de carga de trabalho. Para obter mais informações, consulte Topology Manager.Você pode editar a seção
nodeSelectorpara apenas aplicar a configuração em um subconjunto de seus nós do trabalhador.
- Aplique o arquivo de configuração “
DaemonSet” executando o comando a seguir.kubectl replace --force -f customize.yaml - Verifique se os pods entraram no estado
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Depois que os pods estiverem em execução, reinicialize cada nó do trabalhador.
- Implemente um pod de depuração no seu nó de trabalho.
oc debug node/NODE_NAME ``` 1. Após o início da sessão de depuração, execute o comando a seguir. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Repita essas etapas para cada nó de trabalho que você deseja reiniciar.
Como ativar pinning de CPU e páginas enormes em seus nós do trabalhador
Satellite
Antes de começar, certise-se de ter implantado o Node Feature Discovery Operator.
-
Salve o seguinte arquivo
DaemonSetem um arquivo chamadocpu-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 -
Edite os valores
DaemonSetpara ajustar o desempenho.
NUMBER_OF_HUGEPAGES-
Digite o número de páginas enormes que você deseja alocar. Por exemplo:
2048. Se você não quiser ativar páginas enormes, digite0. Quanto mais páginas enormes você alocar, a memória menos geral está disponível para suas aplicações.Você pode editar a seção
nodeSelectorpara apenas aplicar a configuração em um subconjunto de seus nós do trabalhador.
- Aplique o arquivo de configuração “
DaemonSet” executando o comando a seguir.kubectl replace --force -f cpu-pinnning.yaml - Verifique se os pods entraram no estado
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide - Depois que os pods estiverem em execução, reinicialize cada nó do trabalhador.
- Implemente um pod de depuração no seu nó de trabalho.
oc debug node/NODE_NAME ``` 1. Após o início da sessão de depuração, execute o comando a seguir. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Repita essas etapas para cada nó de trabalho que você deseja reiniciar.
Ativando pacotes kernel-devel
Satellite
Pode ser necessário ativar os pacotes kernel-devel para usar os serviços ou o armazenamento do Satellite, como o Fusion do Spectrum Scale.
Conclua as etapas a seguir para ativar o kernel-devel, aplicando um mapa de configuração customizado e uma configuração de máquina aos nós do trabalhador:
-
Execute o comando a seguir para aplicar o arquivo de configuração de rede (
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 -
Aguarde a implantação dos recursos. Isso pode levar 5 minutos ou mais.
-
Revise os detalhes do mapa de configuração para confirmar que a implementação foi bem-sucedida..
- Confirme se o campo
config-validation="valid"está presente
kubectl get cm -n ibm-machine-config user-ignition-config-97-kerneldevel -o yaml | grep config-validation ``` 1. Confirme se o `user-ignition-config-97-kerneldevel` está presente no mapa de configuração ```sh {: pre} kubectl get cm -n ibm-machine-config -l ibm-cloud.kubernetes.io/nodepoolfeedback="true" -o yaml | grep user-ignition-config-97-kerneldevel ``` - Confirme se o campo
-
Incluir nós do trabalhador em seu cluster. Os nós do trabalhador que você inclui têm o
kernel-develativado -
Verifique se
kernel-develestá ativado..- Inicie um pod de depuração em um de seus nós
oc debug node/NODEIP ``` 1. Execute o seguinte comando ` `nsenter` `. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- rpm -qa | grep kernel-devel ``` -
Opcional: se você não precisar mais do
kernel-devel, será possível removê-lo executando o comando a seguir:kubectl delete cm -n ibm-machine-config user-ignition-config-97-kerneldevel
Removendo customizações de desempenho
Satellite
Se você deseja remover customizações dos nós do trabalhador e reajustá-las para as configurações padrão, aplique o seguinte DaemonSet.
-
Salve o seguinte arquivo
DaemonSetem um arquivo chamadoremove-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 -
Aplique o
DaemonSetao seu cluster executando o comando a seguir.kubectl replace --force -f remove-custom.yaml -
Verifique se os pods entraram no estado
Running.kubectl get pods -n kube-system -l app=ibm-user-custom-configurator -o wide -
Depois que os pods estiverem em execução, reinicialize cada nó do trabalhador.
- Implemente um pod de depuração no seu nó de trabalho.
oc debug node/NODE_NAME ``` 1. Após o início da sessão de depuração, execute o comando a seguir. ```sh {: pre} nsenter -t 1 -m -u -i -n -p -- reboot ``` 1. Repita essas etapas para cada nó de trabalho que você deseja reiniciar.