En esta página, se explica cómo preparar una carga de trabajo para programarla en nodos Arm en un clúster de GKE Standard. Para obtener más información sobre cómo programar cargas de trabajo de Arm con Autopilot, consulta Implementa cargas de trabajo de Autopilot en la arquitectura Arm.
Para programar con éxito una carga de trabajo en un nodo Arm, debes tener lo siguiente:
- Una imagen de contenedor compatible con Arm. Para obtener orientación sobre cómo verificar esto, consulta ¿Mi carga de trabajo está lista para Arm?.
- Asigna los nodos en los que se pueden programar tus cargas de trabajo compatibles con Arm. Para crear los recursos necesarios, consulta Crea clústeres y grupos de nodos con nodos Arm.
- Un clúster en una región o zona de Google Cloud que tenga máquinas virtuales (VMs) disponibles de Arm. Para obtener una tabla filtrable de tipos de máquinas y plataformas, consulta Regiones y zonas disponibles.
Descripción general
De forma predeterminada, GKE programa las cargas de trabajo solo en nodos basados en x86 (series de máquinas de Compute Engine con procesadores Intel o AMD) mediante la colocación de un taint (kubernetes.io/arch=arm64:NoSchedule
) en todos los nodos Arm. Este taint evita que las cargas de trabajo compatibles con x86 se programen de forma involuntaria en los nodos Arm. Si quieres implementar una carga de trabajo en un nodo Arm, usa los campos descritos en esta página para guiar al programador a fin de que envíe la carga de trabajo al tipo de nodo deseado.
Usa uno de los siguientes campos:
- Un selector de nodos
- Una regla de afinidad de nodos
Cuando usas un selector de nodos o una regla de afinidad de nodo, GKE solo programará tus cargas de trabajo compatibles con Arm cuando hayas declarado que la imagen de contenedor de la carga de trabajo puede ejecutarse en la arquitectura del nodo.
Si programas una carga de trabajo compatible con Arm con un selector de nodos o con una regla de afinidad de nodo como se describe en las siguientes secciones, GKE agrega automáticamente una tolerancia en la configuración de la carga de trabajo para que los pods puedan ejecutarse en los nodos Arm.
Esta tolerancia agregada a la carga de trabajo coincide con el taint (kubernetes.io/arch=arm64:NoSchedule
) agregado a todos los nodos Arm para permitir que tu carga de trabajo se programe en nodos Arm.
En algunas situaciones, como cuando tienes imágenes de varias arquitecturas que se pueden ejecutar en cualquier nodo, te recomendamos que agregues esta tolerancia de forma manual a la configuración de la carga de trabajo. Para obtener instrucciones, consulta Usa la tolerancia para programar cargas de trabajo multiarquitectura en cualquier arquitectura.
Usa un selector de nodos para programar una carga de trabajo Arm
Agrega el siguiente selector de nodos a la especificación:
nodeSelector:
kubernetes.io/arch: arm64
El selector de nodos especifica que esta carga de trabajo solo debe programarse en los nodos con la etiqueta arm64
, que tienen todos los nodos Arm en clústeres de GKE.
Cuando este selector de nodos se incluye en la configuración de la carga de trabajo, GKE agrega la tolerancia para que coincida con el taint a fin de permitir que la carga de trabajo se programe en nodos Arm.
Usa una regla de afinidad de nodos para programar una carga de trabajo Arm
También puedes usar la afinidad de nodos para programar tu carga de trabajo.
Programa la carga de trabajo en una sola arquitectura
Agrega la siguiente afinidad de nodos a la especificación:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
La regla de afinidad de nodos especifica que la carga de trabajo solo debe programarse en nodos con la etiqueta arm64
, que tienen todos los nodos Arm en clústeres de GKE.
Cuando esta regla de afinidad de nodo se incluye en la configuración de la carga de trabajo, GKE agrega la tolerancia para que coincida con el taint a fin de permitir que la carga de trabajo se programe en nodos Arm.
Programa la carga de trabajo en arquitecturas x86 y Arm
Si deseas programar una carga de trabajo en arquitecturas x86 (procesadores Intel y AMD) y Arm, puedes especificarlo de diferentes maneras.
Usa la tolerancia para programar cargas de trabajo multiarquitectura en cualquier arquitectura
Si tienes una imagen multiarquitectura que deseas programar en un tipo de arquitectura disponible en un clúster estándar, solo debes agregar la tolerancia a la especificación de la carga de trabajo. No necesitas el selector de nodos ni las reglas de afinidad de nodos que se describen en esta página, ya que la carga de trabajo se puede programar para todos los tipos de arquitectura.
Agrega la tolerancia:
tolerations:
- key: kubernetes.io/arch
operator: Equal
value: arm64
effect: NoSchedule
Con esta tolerancia, GKE podría programar una carga de trabajo en nodos con cualquier tipo de arquitectura.
Por ejemplo, si tienes un clúster con los siguientes grupos de nodos:
- my-t2a-node-pool, using t2a-standard-16 VMs (
arm64
). - my-c2-node-pool, using c2-standard-8 VMs (
amd64
). - my-t2d-node-pool, using t2-standard-48 VMs (
amd64
).
Si implementas en este clúster una carga de trabajo que usa una imagen multiarquitectura y la tolerancia arm64
en la configuración de la carga de trabajo, GKE puede programar la carga de trabajo en todos los grupos de nodos.
Usa la regla de afinidad de nodos para programar cargas de trabajo de varias arquitecturas en cualquier arquitectura
Si quieres que una carga de trabajo se programe en nodos de distintos tipos de arquitectura, incluidos x86 y Arm, también puedes usar una regla de afinidad de nodos. Con las reglas de afinidad de nodos, puedes especificar con exactitud qué tipos de arquitectura deseas programar en la carga de trabajo. Se recomienda este enfoque para programar cargas de trabajo en clústeres de Autopilot. Para obtener más información, consulta Implementa cargas de trabajo de Autopilot en la arquitectura de Arm.
Con las cargas de trabajo basadas en x86, no necesitas estos selectores de nodos, reglas de afinidad de nodos ni tolerancias para que se programe la carga de trabajo. Si tienes una imagen que solo deseas programar en nodos basados en x86, no necesitas usar estos campos.
Para programar cargas de trabajo en cualquier tipo de arquitectura, enumera arm64
y amd64
en la sección values
del campo de afinidad de nodos. amd64
incluye todos los nodos que usan procesadores x86.
En el siguiente ejemplo, se especifica que esta carga de trabajo podría programarse en nodos con procesadores Arm o procesadores x86:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
- amd64
Las etiquetas para cada tipo de arquitectura son las siguientes:
arm64
para nodos que usan procesadores ARM (por ejemplo, Tau T2A).amd64
para nodos que usan procesadores AMD (por ejemplo, Tau T2D) o nodos que usan procesadores Intel (por ejemplo, C2).
Por ejemplo, si tienes un clúster con los siguientes grupos de nodos y la regla de afinidad de nodos determinada, haz lo siguiente:
- my-t2a-node-pool, using t2a-standard-16 VMs (
arm64
). - my-c2-node-pool, using c2-standard-8 VMs (
amd64
). - my-t2d-node-pool, using t2-standard-48 VMs (
amd64
).
Si implementas en este clúster una carga de trabajo que usa una imagen multiarquitectura y la afinidad de nodos con arm64
incluida en la lista values
, GKE agrega la tolerancia en la configuración de la carga de trabajo y podría programar la carga de trabajo en todos los grupos de nodos.
Implementa la carga de trabajo
Ahora que especificaste dónde se deben programar tus cargas de trabajo compatibles con Arm, puedes implementar tu carga de trabajo.
Cuando implementas una carga de trabajo en un clúster de GKE, las instrucciones son las mismas en todos los tipos de arquitectura. Puedes implementar una carga de trabajo compatible con Arm como lo harías con cualquier otra carga de trabajo, siempre que hayas completado los pasos de los requisitos previos. Para ver ejemplos de implementación de cargas de trabajo, consulta las siguientes páginas:
- Implementa una aplicación de Linux sin estado.
- Implementa una aplicación con estado.
- Ejecuta un trabajo.
Soluciona problemas
Para obtener información sobre la solución de problemas y errores comunes, consulta Solución de problemas de cargas de trabajo de Arm.