Configuración de varios grupos de nodos mediante grupos de nodos de acceso puntual de AKS con el escalador automático de clúster

Completado

Azure proporciona instancias de máquinas virtuales de Azure que ofrecen escalabilidad a la vez que reducen los costos, y resultan idóneas para las cargas de trabajo que se pueden interrumpir. Sin embargo, estas máquinas virtuales (VM) tienen acceso a la capacidad de proceso de Azure no usada a precios más bajos y siguen admitiendo escenarios de computación de alto rendimiento.

La solución de seguimiento de drones de la empresa está implementada en Azure Kubernetes Service (AKS), como muchos servicios y aplicaciones en contenedores. Uno de estos servicios es un servicio de procesamiento por lotes que programa las rutas de vuelo de los drones. Al producirse un crecimiento repentino en la base de clientes, el servicio de procesamiento por lotes se inunda de solicitudes, lo que hace que se retrasen las entregas. Esta situación está causando retrasos y resulta frustrante para el cliente.

El escalado automático del número de réplicas del servicio de procesamiento por lotes proporciona para el procesamiento de pedidos puntuales. Pero también tendrá que implementar más nodos para mantenerse al día de las necesidades de recursos informáticos. Al analizar las tendencias en Azure Monitor, observa que estos nodos solo se usan en horas concretas del día y de una forma que no es rentable. El servicio de procesamiento por lotes no tiene estado y no guarda datos de sesión de los clientes. Decide que puede ahorrar dinero si hace lo siguiente:

  • Usa instancias de nodo de menor costo.
  • Escala de forma automática del número de nodos del grupo de nodos que se configura para el procesamiento por lotes.

Ahora se analizará la infraestructura subyacente de esta solución de reducción de costos en AKS.

¿Qué es una máquina virtual de acceso puntual de Azure?

Una máquina virtual de acceso puntual es la que permite acceder con importantes descuentos a la capacidad de proceso de Azure sin usar. Las máquinas virtuales de acceso puntual reemplazan a las máquinas virtuales de prioridad baja existentes en Azure. Puede usar máquinas virtuales de acceso puntual para ejecutar cargas de trabajo que incluyen lo siguiente:

  • Escenarios informáticos de alto rendimiento, procesamiento por lotes o aplicaciones de representación visual.

  • Aplicaciones sin estado a gran escala.

  • Entornos de desarrollo y pruebas, incluidas las cargas de trabajo de integración continua (CI) y entrega continua (CD).

Disponibilidad de la máquina virtual de acceso puntual

La disponibilidad de las máquinas virtuales de acceso puntual depende de factores como el tamaño, la capacidad, la región y la hora del día. Azure solo asigna máquinas virtuales si hay capacidad disponible. Como resultado, no hay ningún contrato de nivel de servicio (SLA) para este tipo de máquinas virtuales, y no ofrecen garantías de alta disponibilidad.

Directiva de expulsión de máquinas virtuales de acceso puntual

La directiva de expulsión predeterminada para máquinas virtuales de acceso puntual es Desasignar. Azure expulsa las máquinas virtuales de acceso puntual con un aviso de 30 segundos cuando la capacidad de una región alcance su límite. Una máquina virtual establecida con la directiva Desasignar pasa al estado detenido-desasignado cuando se expulsa. Cuando la capacidad vuelva a estar disponible, puede volver a implementar una máquina virtual expulsada. Una máquina virtual desasignada sigue contando para la cuota de CPU virtual (vCPU) puntual, y se siguen aplicando cargos por los discos asignados subyacentes.

¿Qué es un conjunto de escalado de máquinas virtuales de acceso puntual?

Un conjunto de escalado de máquinas virtuales de acceso puntual es el que admite máquinas virtuales de acceso puntual de Azure. Estas máquinas virtuales se comportan igual que las máquinas virtuales normales, pero con una diferencia: cuando se usa la compatibilidad de conjunto de escalado de máquinas virtuales con máquinas virtuales de acceso puntual en Azure, se elige entre dos directivas de expulsión:

  • Desasignar: esta directiva funciona exactamente como se ha descrito antes.

  • Eliminar: esta directiva ahorra el costo de los discos y evita alcanzar los límites de cuota. Con la directiva de expulsión Eliminar, las máquinas virtuales expulsadas se eliminan junto con sus discos subyacentes. La característica de escalado automático del conjunto de escalado ahora puede intentar compensar de forma automática la expulsión de máquinas virtuales mediante la creación de otras. Aunque no se garantiza la creación de máquinas virtuales, las máquinas virtuales expulsadas no se tienen en cuenta para la cuota de vCPU ni generan costos para los discos subyacentes.

    Un procedimiento recomendado consiste en usar la característica de escalado automático solo cuando la directiva de expulsión está establecida en Eliminar en el conjunto de escalado.

¿Qué es un grupo de nodos de acceso puntual en Azure Kubernetes Service (AKS)?

Un grupo de nodos de acceso puntual es un grupo de nodos de usuario en el que se utiliza un conjunto de escalado de máquinas virtuales de acceso puntual. AKS admite las máquinas virtuales de acceso puntual cuando:

  • Es necesario crear grupos de nodos de usuario.
  • Son necesarias las ventajas de costo que ofrece la compatibilidad con conjuntos de escalado de máquinas virtuales para máquinas virtuales de acceso puntual de Azure.

Use grupos de nodos de acceso puntual para:

  • Aprovechar la capacidad no utilizada en Azure.
  • Usar características del conjunto de escalado con la directiva de expulsión Eliminar.
  • Definir el precio máximo que quiere pagar por hora.
  • Habilitar el escalador automático de clúster de AKS Kubernetes recomendado al usar grupos de nodos de acceso puntual.

Por ejemplo, para admitir el servicio de procesamiento por lotes de la aplicación de seguimiento de drones, puede crear un grupo de nodos de usuario de acceso puntual y habilitar el escalado automático del clúster. Después, puede configurar el escalador horizontal de pod para implementar más servicios de procesamiento por lotes que coincidan con las demandas de recursos.

A medida que aumente la demanda de nodos, el escalador automático de clúster puede incrementar o disminuir el número de nodos del grupo de nodos de acceso puntual. Si se producen expulsiones de nodos, el escalador automático de clúster sigue intentando escalar verticalmente el número si todavía se necesitan nodos adicionales.

Limitaciones de los grupos de nodos de acceso puntual

Antes de decidir agregar un grupo de nodos de usuario de acceso puntual al clúster de AKS, tenga en cuenta las limitaciones siguientes:

  • El conjunto de escalado de acceso puntual subyacente solo se implementa en un único dominio de error y no ofrece ninguna garantía de alta disponibilidad.
  • El clúster de AKS necesita que se habilite la compatibilidad con varios grupos de nodos.
  • Solo puede usar los grupos de nodos de acceso puntual como grupos de nodos de usuario.
  • No se pueden actualizar los grupos de nodos de acceso puntual.
  • No se garantiza la creación de máquinas virtuales de acceso puntual. La creación de nodos de acceso puntual depende de la capacidad y la disponibilidad de cuota en la región de Azure implementada del clúster.

Recuerde que los grupos de nodos de acceso puntual solo se deben usar para cargas de trabajo que se pueden interrumpir.

Importante

En algunas suscripciones, como las de patrocinio, la capacidad de crear máquinas virtuales de acceso puntual y grupos de nodos de acceso puntual es limitada. Es posible que no pueda crear un grupo de nodos de acceso puntual para el clúster.

Adición de un grupo de nodos de acceso puntual a un clúster de AKS

Un grupo de nodos de acceso puntual no puede ser el grupo de nodos del sistema en un clúster de AKS. Primero, debe crear el clúster y, después, use el comando az aks nodepool add para agregar un nuevo grupo de nodos de usuario.

Para configurar un grupo de nodos nuevo como grupo de nodos de acceso puntual, se deben establecer varios parámetros.

Prioridad

El parámetro --priority se establece en Regular de forma predeterminada para un grupo de nodos nuevo. Establezca el valor en Spot para indicar que el grupo que se va a crear es un grupo de nodos de acceso puntual. Este valor no se puede cambiar después de la creación.

Directiva de expulsión

Un grupo de nodos de acceso puntual debe usar un conjunto de escalado de máquinas virtuales. Recuerde que el grupo de nodos de acceso puntual usa un conjunto de escalado de acceso puntual. Establezca --eviction-policy en Delete para permitir que el conjunto de escalado quite el nodo y el disco asignado subyacente que usa el nodo. No se puede cambiar este valor después de la creación.

Puede establecer la directiva de expulsión en Deallocate, cuando estos nodos se expulsan, siguen contando en la cuota de proceso para escalar o actualizar el clúster.

Precio máximo del nodo de acceso puntual

Los grupos de nodos de acceso puntual optimizan los costos al limitar la cantidad máxima que está dispuesto a pagar por nodo puntual por hora. Para establecer la cantidad segura, use el parámetro --spot-max-price. Los nodos de acceso puntual recién creados se expulsan cuando se alcanza este valor.

Puede establecer este valor en cualquier cantidad positiva de hasta cinco decimales, o bien en -1. Si el valor --spot-max-price se establece en -1, el grupo de nodos se verá afectado del siguiente modo:

  • Los nodos no se expulsan en función del precio del nodo.
  • El costo de los nodos nuevos se basa en el precio actual de los nodos de acceso puntual, o bien el precio de un nodo estándar, lo que sea menor.

Por ejemplo, si establece el valor en 0.98765, el precio máximo de un nodo será de 0.98765 USD por hora. Cuando el consumo del nodo supere esta cantidad, se expulsará.

Habilitación del escalador automático de clúster

Se recomienda habilitar el escalador automático de clúster mediante el parámetro --enable-cluster-autoscaler. Si no usa el escalador automático de clúster, corre el riesgo de que el número de nodos descienda a cero en el grupo de nodos a medida que se expulsan los nodos debido a las restricciones de capacidad de Azure.

Número mínimo de nodos

Establezca el número mínimo de nodos en un valor entre 1 y 100 mediante el parámetro --min-count. Al habilitar el escalador automático de clúster, se necesita un número mínimo de nodos.

Número máximo de nodos

Establezca el número máximo de nodos en un valor entre 1 y 100 mediante el parámetro --max-count. Al habilitar el escalador automático de clúster, se necesita un número máximo de nodos.

Configuración de ejemplo

Este es un comando az aks nodepool add de ejemplo que agrega un grupo de nodos de acceso puntual con un recuento máximo de 3 y un recuento mínimo de 1. Observe el uso de --enable-cluster-autoscaler para habilitar las características del nodo de acceso puntual.

az aks nodepool add \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name spotpool01 \
    --enable-cluster-autoscaler \
    --max-count 3 \
    --min-count 1 \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --no-wait

Implementación de pods en grupos de nodos de acceso puntual

Al implementar cargas de trabajo en Kubernetes, puede proporcionar información al programador para especificar en qué nodos se pueden ejecutar las cargas de trabajo y en cuáles no. La programación de la carga de trabajo se controla mediante la configuración de taints, la tolerancia o la afinidad de nodo. Los nodos de acceso puntual se configuran con una etiqueta y un taint específicos.

¿Qué es un taint?

Un taint se aplica a un nodo para indicar que en él solo se pueden programar pods concretos. Los nodos de acceso puntual se configuran con una etiqueta establecida en kubernetes.azure.com/scalesetpriority:spot.

¿Qué es la tolerancia?

La tolerancia es una especificación que se aplica a un pod para permitir (aunque no obligar) que se programe un pod en un nodo con la intolerancia correspondiente. Los nodos de acceso puntual se configuran con un taint de nodo establecido en kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Nota:

Las intolerancias y las tolerancias no garantizan que un pod se coloque en un nodo específico. Por ejemplo, si un nodo no tiene ninguna intolerancia, es posible que el pod con la tolerancia se programe en el nodo sin intolerancia. La especificación de una afinidad con intolerancias y tolerancias puede solucionar este problema.

¿Qué es la afinidad de nodo?

La afinidad de nodo se usa describir qué pods se programan en un nodo. La afinidad se especifica mediante etiquetas definidas en el nodo. Por ejemplo, en AKS, los pods del sistema se configuran con antiafinidad hacia los nodos de acceso puntual para impedir que se programen en estos nodos.

Definición de la tolerancia en un archivo de manifiesto de pod

La tolerancia de taint de los nodos se especifica con la creación de una entrada de diccionario tolerations en el archivo de manifiesto de la carga de trabajo. En este diccionario, se establecen las propiedades siguientes para cada taint de nodo que la carga de trabajo tiene que tolerar en esta sección:

Propiedad Descripción
key Identifica un par clave-valor de taint de nodo especificado en el nodo. Por ejemplo, en un grupo de nodos de acceso puntual, el par clave-valor es kubernetes.azure.com/scalesetpriority:spot. La clave es kubernetes.azure.com/scalesetpriority.
operator Permite que la tolerancia coincida con un taint. El operador predeterminado es Equal. También puede especificar Exists para que coincida con la tolerancia. Pero si usa Exists, no especifique la propiedad siguiente (value).
value Representa la parte de valor del par clave-valor del taint de nodo especificado en el nodo. Por ejemplo, en un grupo de nodos de acceso puntual con un par clave-valor de kubernetes.azure.com/scalesetpriority:spot, el valor es spot.
effect Indica cómo se controla la programación de un pod en el sistema. Hay tres opciones: NoSchedule, PreferNoSchedule y NoExecute. NoSchedule garantiza que el sistema no programará el pod. PreferNoSchedule permite que el sistema intente no programar el pod. NoExecute expulsa los pods que ya se ejecutan en el nodo con taint, o bien no programa el pod en absoluto.

Definición de afinidad de nodo en el archivo de manifiesto de un pod

Puede especificar la afinidad si crea una entrada affinity en el archivo de manifiesto de la carga de trabajo. En esta entrada, establecerá las propiedades siguientes para cada etiqueta de nodo con la que debe coincidir una carga de trabajo:

Propiedad Descripción
nodeAffinity Describe las reglas de programación de afinidad de nodo para el pod.
requiredDuringSchedulingIgnoredDuringExecution Si los requisitos de afinidad que especifica este campo no se cumplen en el momento de la programación, el pod no se programará en el nodo. Si los requisitos de afinidad que especifica este campo dejan de cumplirse en algún momento durante la ejecución del pod (por ejemplo, debido a una actualización), el sistema puede optar por intentar expulsar el pod de su nodo.
nodeSelectorTerms Lista de términos del selector de nodos. Los términos devueltos coinciden con cualquiera de los filtros, en lugar de todos los filtros.
matchExpressions Lista de requisitos del selector de nodos por etiquetas del nodo.
key Clave de etiqueta a la que se aplica el selector. La clave es kubernetes.azure.com/scalesetpriority.
operator Representa la relación de una clave con un conjunto de valores. Los operadores válidos son In, NotIn, Exists, DoesNotExistGt y Lt
values Representa la parte de valor del par clave-valor de la etiqueta de nodo que se especifica en el nodo. En un grupo de nodos de acceso puntual con un par clave-valor de kubernetes.azure.com/scalesetpriority:spot, el valor es spot.

Este es un ejemplo de una carga de trabajo con una tolerancia y afinidad agregadas para los grupos de nodos de acceso puntual.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"

Comprobar los conocimientos

1.

Imagine que tiene un servicio sin estado que procesa pedidos en línea y se ejecuta en un clúster de Azure Kubernetes Service (AKS). Decide usar grupos de nodos de acceso puntual en el clúster de AKS para optimizar sus costos de proceso. ¿Cómo se agregan grupos de nodos de acceso puntual a un clúster de AKS?

2.

En el caso del servicio descrito en la pregunta anterior, ¿qué directiva de expulsión es la opción más rentable para configurar el grupo de nodos de acceso puntual?

3.

Para el servicio descrito en las preguntas anteriores, ¿cómo se asegura de que hay cargas de trabajo programadas en los nodos del grupo de nodos de usuario de acceso puntual?