En este documento, se describe cómo configurar clústeres y VMs para admitir cargas de trabajo de alto rendimiento y baja latencia con las eficiencias de procesamiento del acceso a la memoria no uniforme (NUMA). Hay instrucciones para ajustar la configuración de Kubernetes para los nodos del clúster. Este documento también incluye instrucciones para configurar máquinas virtuales (VMs) con afinidad de NUMA para que se programen y aprovechen los nodos de NUMA.
Con una VM compatible con NUMA, toda la comunicación dentro de la VM es local para el nodo NUMA. La VM compatible con NUMA evita las transacciones de datos hacia y desde recursos remotos que pueden degradar el rendimiento de la VM.
Configura los nodos para usar NUMA
En las siguientes secciones, se describe cómo configurar los componentes críticos de Kubernetes para ajustar el nodo y asegurarse de que pueda programar contenedores compatibles con NUMA. Estos nodos NUMA están optimizados para mejorar el rendimiento de la CPU y la memoria. Sigue las instrucciones para cada nodo en el que desees ejecutar VMs compatibles con NUMA.
Actualiza la configuración de kubelet
Como parte de la configuración del nodo para admitir la afinidad del nodo NUMA, debes hacer los siguientes cambios en la configuración de kubelet:
- Habilita CPU Manager con una política de
static - Habilita el Administrador de memoria con una política de
Static - Habilita el administrador de topología con la topología
restricted.
Para configurar kubelet en tu nodo trabajador, haz lo siguiente:
Busca el archivo
kubeleten tu nodo trabajor y ábrelo para editarlo:edit /etc/default/kubeletSi no ves el archivo
kubelet, créalo con el siguiente comando:echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubeletEste comando crea el archivo
kubeletcon una secciónKUBELET_EXTRA_ARGS=""vacía.Para habilitar CPU Manager con una política
static, agrega la marca--cpu-manager-policy=statica la secciónKUBELET_EXTRA_ARGS=""del archivo:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Para habilitar el Administrador de memoria con una política
Static, agrega la marca--memory-manager-policy=Statica la secciónKUBELET_EXTRA_ARGS=""del archivo:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
Para habilitar el Administrador de topología con una política
restricted, agrega la marca--topology-manager-policy=restricteda la secciónKUBELET_EXTRA_ARGS=""del archivo:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
Verifica la cantidad actual de memoria reservada por Google Distributed Cloud:
cat /var/lib/kubelet/kubeadm-flags.envEl resultado debe verse de la siguiente manera:
KUBELET_KUBEADM_ARGS="--anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --feature-gates=SeccompDefault=true --kube-reserved=cpu=100m,memory=3470Mi --max-pods=110 --node-ip=192.168.1.190 --node-labels=baremetal.cluster.gke.io/k8s-ip=192.168.1.190,baremetal.cluster.gke.io/namespace=cluster-user001,baremetal.cluster.gke.io/node-pool=node-pool-1,cloud.google.com/gke-nodepool=node-pool-1 --pod-infra-container-image=gcr.io/anthos-baremetal-release/pause-amd64:3.1-gke.5 --provider-id=baremetal://192.168.1.190 --read-only-port=10255 --rotate-server-certificates=true --seccomp-default=true"
El parámetro de configuración
--kube-reserved=cpu=100m,memory=3470Miindica que Google Distributed Cloud reservó 3,470 mebibytes de memoria en el nodo.Establece la marca
--reserved-memoryen la secciónKUBELET_EXTRA_ARGSdel archivokubeleten 100 mebibytes más que la memoria reservada actual para tener en cuenta el umbral de expulsión. Si no hay memoria reservada, puedes omitir este paso.Por ejemplo, con la memoria reservada de
3470Midel ejemplo del paso anterior, reservas3570Mide memoria en el archivokubelet:KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
Quita los archivos de estado de CPU y memoria del directorio
/var/lib:rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_stateReinicia kubelet:
systemctl start kubelet
Para obtener más información sobre esta configuración de políticas, consulta la siguiente documentación de Kubernetes:
- Políticas de administración de CPU
- Configuración del Administrador de memoria
- Política restringida del Administrador de topología
Configura el nodo para que use páginas enormes
Una vez que habilites el Administrador de memoria con la política Static, puedes agregar hugepages para mejorar aún más el rendimiento de la carga de trabajo del contenedor en tus nodos NUMA.
Como su nombre lo indica, las hugepages te permiten especificar páginas de memoria más grandes que el estándar de 4 kibibytes (KiB). El entorno de ejecución de VM en GDC admite hugepages de 2 mebibytes (MiB) y 1 gibibyte (GiB). Puedes configurar páginas enormes para un nodo en el tiempo de ejecución o para cuando se inicie la máquina del nodo. Te recomendamos que configures páginas grandes en cada nodo en el que desees ejecutar VMs compatibles con NUMA.
Para configurar la cantidad de páginas enormes de un tamaño específico en tu nodo de NUMA en el tiempo de ejecución, usa el siguiente comando:
echo HUGEPAGE_QTY > \ /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepagesReemplaza lo siguiente:
HUGEPAGE_QTY: Es la cantidad de páginas enormes que se asignarán del tamaño especificado.NUMA_NODE: Es el nodo NUMA, comonode0, al que asignas páginas grandes.HUGEPAGE_SIZE: Es el tamaño de las páginas enormes en kibibytes,2048(2 MiB) o1048576(1 GiB).
Configura una VM para usar el nodo NUMA
Una vez que los nodos del clúster estén optimizados para NUMA, podrás crear VMs compatibles con NUMA. Las VMs compatibles con NUMA se programan en nodos de NUMA.
Para crear una VM compatible con NUMA, sigue estos pasos:
Sigue las instrucciones para crear una VM a partir de un manifiesto.
Usa los siguientes parámetros de configuración de
computepara configurar tu VM de modo que sea compatible con NUMA:spec.compute.guaranteed: Estableceguaranteedentrue. Con este parámetro de configuración, el Podvirt-launcherse configura para ubicarse en la clase de Calidad de servicio (QoS) garantizada de Kubernetes.spec.compute.advancedCompute:dedicatedCPUPlacement: EstablecededicatedCPUPlacemententrue. Este parámetro de configuración fija las CPU virtuales a las CPU físicas del nodo.hugePageSize: EstablecehugePageSizeen2Mio1Gipara especificar el tamaño de las páginas enormes que usará tu VM, ya sea de 2 MiB o 1 GiB.numaGuestMappingPassthrough: Incluye una estructura vacía ({}) para este parámetro de configuración. Este parámetro de configuración establece la afinidad de NUMA para que tu VM se programe solo en nodos de NUMA.
En el siguiente ejemplo de manifiesto de VirtualMachine, se muestra cómo podría verse una configuración de VM compatible con NUMA:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: vm1 spec: compute: cpu: vcpus: 2 guaranteed: true advancedCompute: dedicatedCPUPlacement: true hugePageSize: 2Mi numaGuestMappingPassthrough: {} memory: capacity: 256Mi interfaces: - name: eth0 networkName: pod-network default: true disks: - virtualMachineDiskName: disk-from-gcs boot: true readOnly: true