Una forma de mejorar el rendimiento de las aplicaciones basadas en contenedores es aumentar los recursos del clúster. Para ello, agrega nodos o recursos, como CPU o memoria. Sin embargo, este enfoque puede resultar costoso. Ajustar los nodos del clúster para obtener un mejor rendimiento te ayuda a optimizar el uso de recursos para tus cargas de trabajo de manera rentable. En este documento, se describe cómo usar el operador de ajuste de rendimiento para ajustar los nodos trabajadores y optimizar el rendimiento de las cargas de trabajo de Google Distributed Cloud.
Para aprovechar al máximo el hardware y el software subyacentes, los diferentes tipos de aplicaciones, en especial las de alto rendimiento, se benefician del ajuste de la configuración de nodos como la siguiente:
- CPU dedicadas para cargas de trabajo sensibles al rendimiento
- CPU reservadas para daemons y servicios estándar de Kubernetes
- Mayores tamaños de página de memoria con enormes páginas de 1 GiB (gibibyte) o 2 MiB (mebibyte)
- Distribución de la carga de trabajo según la arquitectura del sistema, como procesadores de varios núcleos y NUMA
Con el operador de ajuste de rendimiento, puedes establecer la configuración de rendimiento a nivel del nodo mediante la creación de recursos personalizados de Kubernetes que aplican los parámetros de configuración de rendimiento. Estos son los beneficios:
Interfaz de configuración única y unificada: Con el operador de ajuste de rendimiento, puedes actualizar uno o más manifiestos de
PerformanceTuningProfile
que se pueden aplicar a nodos trabajadores con selectores de nodos. No necesitas configurar cada nodo de forma individual con varios parámetros de configuración y políticas. Este enfoque te permite administrar la configuración a nivel de nodo y de contenedor de una manera única y unificada.Persistencia y confiabilidad: También obtienes toda la confiabilidad que proporciona Kubernetes con su arquitectura de alta disponibilidad. Los recursos personalizados de
PerformanceTuningProfile
se pueden actualizar en cualquier momento, y su configuración se mantiene en las operaciones principales de los clústeres, como las actualizaciones.
El operador de ajuste de rendimiento funciona mediante la organización de las siguientes funciones y herramientas de Kubernetes y del sistema operativo (SO) relacionadas con el rendimiento:
Para evitar conflictos, cuando uses el operador de ajuste de rendimiento, te recomendamos que no uses las herramientas y funciones de Kubernetes y SO mencionadas antes de forma independiente.
Requisitos previos y limitaciones
Estos son los requisitos previos y las limitaciones para usar el operador de ajuste de rendimiento:
Solo Red Hat Enterprise Linux (RHEL): El operador de ajuste de rendimiento solo es compatible con los nodos que ejecutan versiones compatibles de RHEL.
Clúster de usuario o híbrido con nodos trabajadores: El operador de ajuste de rendimiento solo es compatible con nodos trabajadores en clústeres híbridos o de usuario. No se admite el uso del operador de ajuste de rendimiento para ajustar los nodos del plano de control. El operador de ajuste de rendimiento usa un selector de nodos para determinar cómo aplicar los perfiles de ajuste. Para garantizar que los perfiles de ajuste solo se apliquen a los nodos trabajadores, el
nodeSelector
de cada recurso personalizado de perfil debe incluir la etiqueta de nodo trabajador estándarnode-role.kubernetes.io/worker: ""
. Si elnodeSelector
en un perfil de ajuste coincide con las etiquetas de un nodo del plano de control, ese nodo no se ajusta y se establece una condición de error. Para obtener más información sobre las condiciones de error, consulta Verifica el estado. Asegúrate de que el clúster funcione correctamente antes de instalar el operador de ajuste de rendimiento y aplicar perfiles de ajuste.TuneD 2.22.0: El operador de ajuste de rendimiento requiere que la versión de TuneD 2.22.0 esté preinstalada en los nodos trabajadores que deseas ajustar. Para obtener información adicional sobre TuneD, incluidas las instrucciones de instalación, consulta Cómo comenzar a usar TuneD en la documentación de Red Hat Enterprise Linux. El operador de ajuste de rendimiento usa TuneD con el perfil
cpu-partitioning
. Si no tienes este perfil, puedes instalarlo con el siguiente comando:dnf install -y tuned-profiles-cpu-partitioning
Requisitos de recursos de carga de trabajo: Para aprovechar al máximo el ajuste de rendimiento, debes conocer los requisitos de memoria y CPU (solicitudes y límites de recursos) de tus cargas de trabajo.
Recursos de nodo disponibles: Encuentra los recursos de CPU y memoria para tus nodos. Puedes obtener información detallada sobre la CPU y la memoria para tu nodo en los archivos
/proc/cpuinfo
y/proc/meminfo
, respectivamente. También puedes usarkubectl get nodes
a fin de recuperar la cantidad de recursos de procesamiento y memoria (status.allocatable
) que tiene un nodo trabajador disponibles para los Pods.Requiere vaciado: Como parte del proceso de ajuste, el operador de ajuste de rendimiento primero desvía los nodos y, luego, aplica un perfil de ajuste. Como resultado, los nodos pueden informar un estado
NotReady
durante el ajuste de rendimiento. Recomendamos que uses la estrategia de actualización progresiva (spec.updateStrategy.type: rolling
) en lugar de una actualización por lotes para minimizar la falta de disponibilidad de la carga de trabajo.Requiere reinicio: Para que se apliquen los cambios en el ajuste de nodos, el operador de ajuste de rendimiento reinicia el nodo después de aplicar el perfil de ajuste.
Instala el operador de ajuste de rendimiento
El operador de ajuste de rendimiento consta principalmente de dos controladores (un Deployment y un DaemonSet) que interactúan entre sí para ajustar los nodos según la configuración de tu perfil.
El operador de ajuste de rendimiento no está instalado con Google Distributed Cloud de forma predeterminada. Descarga
los manifiestos del operador de ajuste de rendimiento de Cloud Storage y usa kubectl apply
para
crear recursos del operador de ajuste de rendimiento en tu clúster.
Para habilitar el ajuste de rendimiento con valores predeterminados en el clúster, sigue estos pasos:
Crea un directorio
performance-tuning
en la estación de trabajo de administrador.Desde el directorio
performance-tuning
, descarga el último paquete del operador de ajuste de rendimiento del bucket de versiones de Cloud Storage:gsutil cp -r gs://anthos-baremetal-release/node-performance-tuning/0.1.0-gke.47 .
Los archivos descargados incluyen manifiestos para la Deployment
performance-tuning-operator
y el DaemonSetnodeconfig-controller-manager
. También se incluyen manifiestos para funciones relacionadas, como el control de acceso basado en funciones (RBAC) y el control de admisión dinámico.Como usuario raíz, aplica todos los manifiestos del operador de ajuste de rendimiento de forma recurrente al clúster de usuario (o híbrido):
kubectl apply -f performance-tuning --recursive –-kubeconfig USER_KUBECONFIG
Una vez que Deployment y DaemonSet se crean y ejecutan, tu única interacción es editar y aplicar los manifiestos de
PerformanceTuningProfile
.
Revisa los requisitos de recursos para tus cargas de trabajo
Antes de ajustar los nodos, debes comprender los requisitos de recursos de procesamiento y memoria de tus cargas de trabajo. Si tus nodos trabajadores tienen recursos suficientes, puedes ajustarlos para proporcionar memoria garantizada (estándar y hugepages) para tus cargas de trabajo en la clase de calidad de servicio (QoS) garantizada.
Kubernetes asigna clases de QoS a cada uno de tus Pods según las restricciones de recursos que especifiques para los contenedores asociados. Luego, Kubernetes usa clases de QoS para determinar cómo programar tus Pods y contenedores, y asignar recursos a tus cargas de trabajo. Para aprovechar al máximo el ajuste de nodos en tus cargas de trabajo, estas deben tener una configuración de límites o solicitudes de recursos de memoria o CPU.
Para que se te asigne una clase de QoS garantizada, tus Pods deben cumplir con los siguientes requisitos:
- Para cada contenedor en el Pod, haz lo siguiente:
- Especifica valores para las solicitudes de recursos de memoria (
spec.containers[].resources.requests.memory
) y los límites (spec.containers[].resources.limits.memory
). - El valor de los límites de memoria debe ser igual al valor de las solicitudes de memoria.
- Especifica valores para las solicitudes de recursos de CPU (
spec.containers[].resources.requests.cpu
) y los límites (spec.containers[].resources.limits.cpu
). - El valor de los límites de CPU debe ser igual al valor de las solicitudes de CPU.
- Especifica valores para las solicitudes de recursos de memoria (
En el siguiente extracto de especificaciones de Pods, se muestra la configuración de recursos de CPU que cumple con los requisitos de la clase de QoS garantizadas:
spec:
containers:
- name: sample-app
image: images.my-company.example/app:v4
resources:
requests:
memory: "128Mi"
cpu: "2"
limits:
memory: "128Mi"
cpu: "2"
...
Cuando recuperas los detalles del Pod con kubectl get pods
, la sección status
debe incluir la clase QoS asignada, como se muestra en el siguiente ejemplo:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-09-22T21:05:23Z"
generateName: my-deployment-6fdd69987d-
labels:
app: metrics
department: sales
pod-template-hash: 6fdd69987d
name: my-deployment-6fdd69987d-7kv42
namespace: default
...
spec:
containers:
...
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-09-22T21:05:23Z"
status: "True"
type: Initialized
...
qosClass: BestEffort
startTime: "2023-09-22T21:05:23Z"
Para obtener más información sobre las clases de QoS, consulta Clases de calidad de servicio del pod en la documentación de Kubernetes. Si deseas obtener instrucciones para configurar tus Pods y contenedores de modo que se les asigne una clase de QoS, consulta Configura la calidad de servicio para los Pods.
Requisitos de CPU
Cuando ajustas un nodo, puedes especificar un conjunto de núcleos de CPU reservados (spec.cpu.reservedCPUs
) para ejecutar daemons del sistema Kubernetes, como el entorno de ejecución de kubelet y contenedores. Este mismo conjunto de CPU reservadas también ejecuta daemons del sistema operativo, como sshd
y udev
. El resto de los núcleos de CPU se asignan como aislados. Las CPU aisladas están diseñadas para las aplicaciones vinculadas a la CPU, que requieren tiempo de CPU dedicado sin interferencia de otras aplicaciones o interrupciones de la red y otros dispositivos.
Para programar un Pod en las CPU aisladas de un nodo trabajador, haz lo siguiente:
Configurar el Pod para obtener una calidad de servicio (QoS) garantizada
Los requisitos y límites de CPU se deben especificar en números enteros. Si especificas recursos de CPU parciales en la especificación de tu Pod, como
cpu: 0.5
ocpu: 250m
(250 millicores), no se puede garantizar la programación.
Requisitos de la memoria
Cuando ajustas un nodo con el operador de ajuste de rendimiento, puedes crear páginas enormes y asociarlas con los nodos de acceso a memoria no uniforme (NUMA) en la máquina. Según la configuración del Pod y el nodo, los Pods se pueden programar con afinidad de nodos de NUMA.
Cómo crear un perfil de ajuste del rendimiento
Después de instalar el operador de ajuste de rendimiento, solo debes interactuar con el clúster que ejecuta
tus cargas de trabajo. Puedes crear recursos personalizados de PerformanceTuningProfile
directamente en el clúster de usuario o híbrido, no en el clúster de administrador. Cada recurso PerformanceTuningProfile
contiene un conjunto de parámetros que especifica la configuración de rendimiento que se aplica a un nodo.
El nodeSelector
en el recurso determina los nodos a los que se aplica el perfil de ajuste. Para aplicar un perfil a un nodo, coloca la etiqueta de par clave-valor correspondiente en el nodo. Se aplica un perfil de ajuste a los nodos que tienen todas las etiquetas especificadas en el campo nodeSelector
.
Puedes crear varios recursos PerformanceTuningProfile
en un clúster. Si más de un perfil coincide con un nodo determinado, se establece una condición de error en el status
del recurso personalizado PerformanceTuningProfile
. Para obtener más información sobre la sección status
, consulta Cómo verificar el estado.
Configura el espacio de nombres de tu recurso personalizado PerformanceTuningProfile
como kube-system
.
Para ajustar uno o más nodos trabajadores, sigue estos pasos:
Edita el manifiesto
PerformanceTuningProfile
.Para obtener información sobre cada campo del manifiesto y un manifiesto de muestra, consulta la referencia del recurso
PerformanceTuningProfile
.(Opcional) Para los nodos trabajadores a los que aplicas un perfil, agrega etiquetas para que coincidan con el par clave-valor
spec.nodeSelector
.Si no se especifica ningún par clave-valor
spec.nodeSelector
en el recurso personalizadoPerformanceTuningProfile
, el perfil se aplica a todos los nodos trabajadores.Aplica el manifiesto al clúster.
kubectl apply -f PROFILE_MANIFEST --kubeconfig KUBECONFIG
Reemplaza lo siguiente:
PROFILE_MANIFEST
: Es la ruta de acceso del archivo de manifiesto para el recurso personalizadoPerformanceTuningProfile
.KUBECONFIG
: Es la ruta de acceso del archivo kubeconfig del clúster.
Cómo quitar un perfil de ajuste
Para restablecer un nodo a su estado original no ajustado, haz lo siguiente:
Borra el recurso personalizado
PerformanceTuningProfile
del clúster.Actualiza o quita las etiquetas del nodo para que el perfil de ajuste no lo seleccione.
Si tienes varios perfiles de ajuste asociados con el nodo, repite los pasos anteriores según sea necesario.
Pausa un perfil de ajuste
Si necesitas realizar mantenimiento en tu clúster, puedes pausar de forma temporal el ajuste mediante la edición del recurso personalizado PerformanceTuningProfile
. Te recomendamos pausar el ajuste antes de realizar operaciones críticas del clúster, como una actualización del clúster.
Una aplicación de perfil incorrecta es otro caso en el que puedes pausar el ajuste. Si el proceso de ajuste no funciona correctamente, el controlador puede seguir intentando ajustar el nodo, lo que puede provocar que el nodo se reinicie una y otra vez. Si observas que el estado del nodo cambia entre el estado listo y el no listo, pausa el ajuste para que puedas recuperarte del estado dañado.
Para pausar el ajuste, haz lo siguiente:
Edita el manifiesto de recursos personalizado
PerformanceTuningProfile
para establecerspec.paused
entrue
.Usa
kubectl apply
para actualizar el recurso.
Cuando se pausa el ajuste de rendimiento, el controlador del operador de ajuste de rendimiento detiene todas sus operaciones. Pausar evita el riesgo de que las operaciones del controlador del operador del ajuste de rendimiento entren en conflicto con cualquier operación del controlador de Google Distributed Cloud.
Referencia del recurso PerformanceTuningProfile
En esta sección, se describe cada uno de los campos del recurso personalizado PerformanceTuningProfile
. Este recurso se usa con el fin de crear un perfil de ajuste para uno o más de tus nodos del clúster. Todos los campos en el recurso son mutables después de la creación del perfil. Los perfiles deben estar en el espacio de nombres kube-system
.
En el siguiente manifiesto de perfil de muestra numa
para nodos con 8 núcleos de CPU, se especifican las siguientes asignaciones de recursos:
Se reservan 4 núcleos de CPU (
0-3
) para la sobrecarga del sistema de Kubernetes.Se reservan 4 núcleos de CPU (
4-7
) solo para cargas de trabajo.La memoria de nodo se divide en páginas de 2 MiB de forma predeterminada, en lugar de las páginas estándar de 4 Ki.
Se reservan 10 páginas de memoria de 1 GiB para que las use el nodo 0 de NUMA.
Se reservan 5 páginas de memoria con un tamaño de 2 MiB para que las use el nodo 1 de NUMA.
Topology Manager usa la política del mejor esfuerzo para programar cargas de trabajo.
apiVersion: anthos.gke.io/v1alpha1
kind: PerformanceTuningProfile
metadata:
name: numa
namespace: kube-system
spec:
cpu:
isolatedCPUs: 4-7
reservedCPUs: 0-3
defaultHugepagesSize: 2M
nodeSelector:
app: database
node-role.kubernetes.io/worker: ""
pages:
- count: 10
numaNode: 0
size: 1G
- count: 5
numaNode: 1
size: 2M
topologyManagerPolicy: best-effort
Puedes recuperar la definición del recurso personalizado PerformanceTuningProfile
relacionado del grupo anthos.gke.io
en tu clúster. La definición de recurso personalizada se instala una vez que la anotación de características de vista previa se agrega al recurso del clúster autoadministrado.
Configuración de CPU
Propiedad | Descripción |
---|---|
cpu.reservedCPUs |
Obligatorio. Mutable. String. En este campo, se define un conjunto de núcleos de CPU que se reservarán para daemons del sistema de Kubernetes, como kubelet, el entorno de ejecución del contenedor y el detector de problemas de nodos. Estos núcleos de CPU también se usan para daemons del sistema operativo (SO), como sshd y udev .
El campo |
cpu.isolatedCPUs |
Opcional. Mutable. String. El campo cpu.isolatedCPUs define un conjunto de CPU que se usan exclusivamente para aplicaciones sensibles al rendimiento. El administrador de CPU programa los contenedores solo en las CPU no reservadas, de acuerdo con las clases de Calidad de servicio (QoS) de Kubernetes.
Para asegurarte de que las cargas de trabajo se ejecuten en las CPU aisladas, configura Pods con la clase de QoS garantizada y asigna un recurso de CPU al Pod o al contenedor.
Para garantizar la programación de Pods, debes especificar unidades de CPU de números enteros, no recursos de CPU parciales (cpu: "0.5" ).
apiVersion: v1 kind: Pod ... spec: containers: ... resources: limits: cpu: "1" requests: cpu: "1" ... Maximizar las CPU aisladas para las cargas de trabajo proporciona el mejor beneficio de rendimiento. Este campo toma una lista de números de CPU o rangos de números de CPU.
Asegúrate de que la lista de CPU no se superponga con la lista especificada con |
cpu.balanceIsolated |
Opcional. Mutable. Booleano. Valor predeterminado: true . En este campo, se especifica si el conjunto de CPU aislada es apto para el balanceo de cargas automático de cargas de trabajo entre CPU. Cuando configuras este campo en false , tus cargas de trabajo deben asignar cada subproceso de forma explícita a una CPU específica para distribuir la carga entre las CPU. Con asignaciones explícitas de CPU, obtienes el rendimiento más predecible para cargas de trabajo garantizadas, pero esto agrega más complejidad a tus cargas de trabajo. |
cpu.globallyEnableIRQLoadBalancing |
Obligatorio. Mutable. Booleano. Valor predeterminado: true . Este campo especifica si se debe habilitar o no el balanceo de cargas de solicitud de interrupción (IRQ) para el conjunto de CPU aislada. |
Configuración de la memoria
Propiedad | Descripción |
---|---|
defaultHugePageSize |
Opcional. Mutable. Enumeración: 1G o 2M .
Este campo define el tamaño de gigante de la página predeterminado en los parámetros de inicio del kernel.
Las enormes páginas se asignan en el momento del inicio, antes de que la memoria se fragmente.
Es importante tener en cuenta que configurar el tamaño predeterminado de largepages en 1G quita todas las 2 millones de carpetas relacionadas del nodo. Un tamaño de 1G predeterminado de 1G evita que configures 2 millones de páginas gigantes en el nodo.
|
pages |
Opcional. Mutable. Número entero. Este campo especifica la cantidad de páginas enormes que se crearán al momento del inicio. Este campo acepta un array de páginas. Comprueba la memoria disponible para tus nodos antes de especificar engrandes. No solicites más páginas gigantes de las necesarias ni reserves toda la memoria para páginas enormes. Tus cargas de trabajo también necesitan memoria estándar. |
Selección de nodos
Propiedad | Descripción |
---|---|
nodeSelector |
Obligatorio. Mutable. Este campo siempre requiere la etiqueta de nodo trabajador de Kubernetes, node-role.kubernetes.io/worker:"" , que garantiza que el ajuste de rendimiento solo se realice en los nodos trabajadores. En este campo, se incluye una etiqueta de nodo opcional como par clave-valor. Las etiquetas de par clave-valor se usan para seleccionar nodos trabajadores específicos con etiquetas que coincidan. Cuando las etiquetas nodeSelector coinciden con las de un nodo trabajador, el perfil de rendimiento se aplica a ese nodo. Si no especificas una etiqueta de par clave-valor en tu perfil, se aplicará a todos los nodos trabajadores del clúster.
Por ejemplo, el siguiente ... spec: nodeSelector: app: database node-role.kubernetes.io/worker: "" ... |
Configuración de Kubelet
Propiedad | Descripción |
---|---|
topologyManagerPolicy |
Opcional. Mutable. Enumeración: none , best-effort , restricted o single-numa-node . Valor predeterminado: best-effort .
En este campo, se especifica la política del Administrador de topologías de Kubernetes que se usa para asignar recursos para tus cargas de trabajo, según la clase de calidad de servicio (QoS) asignada. Para obtener más información sobre cómo se asignan las clases de QoS, consulta Configura la calidad de servicio para Pods.
|
Operaciones de perfil
Propiedad | Descripción |
---|---|
paused |
Opcional. Mutable. Booleano. Configura paused como true para evitar de forma temporal que los controladores DaemonSet ajusten los nodos seleccionados. |
updateStrategy |
Opcional. Mutable. Especifica la estrategia para aplicar los cambios de configuración de ajuste a los nodos seleccionados. |
updateStrategy.rollingUpdateMaxUnavailalble |
Opcional. Mutable. Número entero. Valor predeterminado: 1 . Especifica la cantidad máxima de nodos que se pueden ajustar al mismo tiempo. Este campo solo se aplica cuando type se establece en rolling . |
updateStrategy.type |
Opcional. Mutable. Enumeración: batch o rolling .
Valor predeterminado: rolling . Especifica cómo aplicar las actualizaciones de perfil a los nodos seleccionados. Si deseas aplicar la actualización a todos los nodos seleccionados al mismo tiempo, establece type en batch . De forma predeterminada, las actualizaciones se lanzan de forma secuencial en nodos individuales, una tras otra. |
Verificar el estado
Después de crear o actualizar el recurso personalizado PerformanceTuningProfile
, un controlador ajusta los nodos seleccionados según la configuración proporcionada en el recurso. Para verificar el estado de PerformanceTuningProfile
, exponemos el siguiente campo en Status
:
Propiedad | Descripción |
---|---|
conditions |
La condición representa las últimas observaciones disponibles del estado actual del recurso de perfil. |
conditions.lastTransitionTime |
Se devuelve siempre. Cadena (en formato de fecha y hora). Última vez que la condición pasó de un estado a otro. Por lo general, este tiempo indica cuándo cambió la condición subyacente. Si no se conoce esa hora, la hora indica el momento en que cambió el campo de la API. |
conditions.message |
Opcional. String. Un mensaje legible que indica los detalles sobre la transición. Es posible que este campo esté vacío. |
conditions.observedGeneration |
Opcional. Número entero. Si se establece, este campo representa la metadata.generation en la que se estableció la condición. Por ejemplo, si metadata.generation es 12 , pero status.condition[x].observedGeneration es 9 , la condición está desactualizada con respecto al estado actual de la instancia. |
conditions.reason |
Obligatorio. String. El motivo de la última transición de la condición. |
conditions.status |
Obligatorio. Estado de la condición: True , False o Unknown . |
conditions.type |
Obligatorio. El tipo es el tipo de condición: Stalled o Reconciling . |
readyNodes |
La cantidad de nodos a los que se aplicó correctamente el perfil de ajuste. |
reconcilingNodes |
La cantidad de nodos seleccionados (o seleccionados con anterioridad) que están en proceso de conciliación con el perfil de ajuste más reciente mediante el DaemonSet de nodeconfig-controller-manager . |
selectedNodes |
La cantidad de notas que se seleccionaron. Es decir, la cantidad de nodos que coinciden con el selector de nodos para este recurso personalizado PerformanceTuningProfile . |