Incorporación de un grupo de nodos de Azure Spot a un clúster de Azure Kubernetes Service (AKS)

En este artículo se agrega un grupo de nodos de Spot secundarios a un clúster de Azure Kubernetes Service (AKS) existente.

Los grupos de nodos de acceso puntual son los que tienen el respaldo de un conjunto de escalado de máquinas virtuales de acceso puntual de Azure. Con las máquinas virtuales de acceso puntual en el clúster de AKS, puede aprovechar la capacidad de Azure no utilizada con un ahorro significativo en los costos. La capacidad disponible no utilizada variará en función de muchos factores, como el tamaño del nodo, la región y la hora del día.

Al implementar un grupo de nodos de acceso puntual, Azure asigna los nodos de spot si hay capacidad disponible e implementa un conjunto de escalado de spot que respalda el grupo de nodos de Spot en un único dominio predeterminado. No hay ningún Acuerdo de Nivel de Servicio para los nodos de acceso puntual. No hay garantías de alta disponibilidad. Si Azure necesita recuperar la capacidad, la infraestructura de Azure expulsará los nodos de acceso puntual.

Los nodos de Spot son ideales para cargas de trabajo que controlen las interrupciones, las finalizaciones tempranas o las expulsiones. Por ejemplo, las cargas de trabajo, como los trabajos de procesamiento por lotes, los entornos de desarrollo y pruebas, y las grandes cargas de trabajo de proceso podrían ser buenos candidatos para la programación en un grupo de nodos de acceso puntual.

Antes de empezar

  • Se presupone que tiene un conocimiento básico de los conceptos de Kubernetes y Azure Load Balancer. Para más información, consulte Conceptos básicos de Kubernetes de Azure Kubernetes Service (AKS).
  • Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Al crear un clúster para que use un grupo de nodos de Spot, este debe usar Virtual Machine Scale Sets para los grupos de nodos y el equilibrador de carga de la SKU estándar. También debe agregar otro grupo de nodos después de crear el clúster, que se trata en este tutorial.
  • Para este artículo, es necesario usar la versión 2.14 de la CLI de Azure o posterior. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Limitaciones

Al crear y administrar clústeres de AKS con un grupo de nodos de Spot se aplican las limitaciones siguientes:

  • Un grupo de nodos de acceso puntual no puede ser un grupo de nodos predeterminado, solo se puede usar como grupo secundario.
  • Los grupos de nodos y el plano de control no se pueden actualizar al mismo tiempo. Debe actualizarlos por separado o quitar el grupo de nodos de Spot para actualizar el plano de control y los grupos de nodos restantes al mismo tiempo.
  • Los grupos de nodos de Spot deben usar Virtual Machine Scale Sets.
  • No se puede cambiar ScaleSetPriority o SpotMaxPrice una vez creados.
  • Al establecer SpotMaxPrice, el valor debe ser -1 o un valor positivo con hasta cinco decimales.
  • Un grupo de nodos de acceso puntual tiene la etiqueta kubernetes.azure.com/scalesetpriority:spot, el valor taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule y los pods del sistema tienen antiafinidad.
  • Para programar cargas de trabajo en un grupo de nodos de Spot debe agregar una afinidad y una tolerancia correspondiente.

Incorporación de un grupo de nodos de Spot a un clúster de AKS

Al agregar un grupo de nodos de acceso puntual a un clúster existente, debe ser un clúster con varios grupos de nodos habilitados. Al crear un clúster de AKS con varios grupos de nodos habilitados, se crea un grupo de nodos con un priority de Regular forma predeterminada. Para agregar un grupo de nodos de acceso puntual, debe especificar Spot como el valor de priority. Para más información sobre cómo crear un clúster de AKS con varios grupos de nodos, consulte Uso de varios grupos de nodos.

  • Cree un grupo de nodos en el que el valor de priority es Spot y use para ello el comando az aks nodepool add.

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

En el comando anterior, el priority elemento de Spot convierte el grupo de nodos en un grupo de nodos de acceso puntual. El parámetro eviction-policy se establece en Delete, que es el valor predeterminado. Al establecer eviction-policy en Delete, los nodos del grupo de escalado subyacente del grupo de nodos se eliminan al ser expulsados.

También se puede establecer eviction-policy en Deallocate, que significa que los nodos del conjunto de escalado subyacente se establecen en estado stopped-deallocated durante la expulsión. Los nodos en estado stopped-deallocated se consideran también a efectos de la cuota de proceso, lo cual puede generar problemas de escalado o actualización del clúster. Los valores de priority y eviction-policy solo se pueden establecer durante la creación del grupo de nodos. Estos valores no se pueden actualizar más adelante.

El comando anterior también habilita el escalador automático de clúster, recomendamos que se usen los grupos de nodos de acceso puntual. En función de las cargas de trabajo que se ejecuten en el clúster, el escalador automático de clúster escala y reduce verticalmente el número de nodos del grupo. En el caso de los grupos de nodos de Spot, el escalador automático de clúster escala verticalmente el número de nodos después de una expulsión si aún se necesitan más nodos. Si cambia el máximo de nodos que puede tener un grupo, también debe ajustar el valor de maxCount relativo al escalador automático de clúster. Si no usa un escalador automático de clúster, en la expulsión el grupo de acceso puntual disminuirá a 0 y requerirá una operación manual para recibir otros nodos de Spot.

Importante

Programe solo las cargas de trabajo en grupos de nodos de Spot que puedan controlar las interrupciones, como los trabajos de procesamiento por lotes y los entornos de prueba. Recomendamos que configure los valores de taint y toleration en el grupo de nodos de acceso puntual para asegurarse de que en un grupo de nodos de acceso puntual solo estén programadas las cargas de trabajo que pueden controlar las expulsiones de nodos. Por ejemplo, el comando anterior agrega el valor taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule para que, en este nodo, solo se programen los pods con el valor de tolerancia correspondiente.

Comprobación del grupo de nodos de Spot

  • Utilice el comando az aks nodepool show para comprobar que el grupo de nodos se ha agregado y confirme que el valor de scaleSetPriority es Spot.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

Programar un pod para que se ejecute en el nodo de acceso puntual

Para programar un pod para que se ejecute en un nodo de acceso puntual, puede agregar una tolerancia y una afinidad de nodos que se corresponda con la intolerancia aplicada al nodo de acceso puntual.

En el ejemplo siguiente se muestra una parte de un archivo YAML que define una tolerancia que corresponde al valor kubernetes.azure.com/scalesetpriority=spot:NoSchedule y una afinidad de nodos que corresponde a la etiqueta kubernetes.azure.com/scalesetpriority=spot usada en el paso anterior con las reglas de afinidad de los nodos requiredDuringSchedulingIgnoredDuringExecution y preferredDuringSchedulingIgnoredDuringExecution:

spec:
  containers:
  - name: spot-example
  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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Cuando implementa un pod con esta tolerancia y afinidad de nodos, Kubernetes lo programa correctamente en los nodos con el valor y la etiqueta aplicadas. En este ejemplo, se aplican las siguientes reglas:

  • El nodo debe tener una etiqueta con la clave kubernetes.azure.com/scalesetpriority y el valor de esa etiqueta debe ser spot.
  • El nodo tiene preferiblemente una etiqueta con la clave another-node-label-key y el valor de esa etiqueta debe ser another-node-label-value.

Para más información, consulte Asignación de pods a nodos.

Actualización de un grupo de nodos de Spot

Cuando actualiza un grupo de nodos de acceso puntual, AKS emite internamente un cordón y un aviso de expulsión, pero no se aplica ninguna purga. No hay nodos de sobrecarga disponibles para las actualizaciones del grupo de nodos de Spot. Fuera de estos cambios, el comportamiento al actualizar los grupos de nodos de acceso puntual es coherente con otros tipos de grupos de nodos.

Para más información sobre la actualización, consulte Actualización de un clúster de Azure Kubernetes Service (AKS).

Precio máximo de un grupo de Spot

Los precios de las instancias de Spot varían en función de la región y la SKU. Para más información, consulte la información de precios para Linux y Windows.

La variabilidad en los precios permite establecer un precio máximo, en dólares estadounidenses (USD), con un máximo de 5 decimales. Por ejemplo, el valor 0.98765 correspondería a un precio máximo de 0,98765 USD por hora. Si establece el precio máximo en -1, la instancia no se expulsará según el precio. Siempre que haya capacidad y cuota disponibles, el precio de la instancia será el menor de entre el actual de acceso puntual y el de una instancia estándar.

Pasos siguientes

En este artículo ha aprendido a agregar un grupo de nodos de Spot a un clúster de AKS. Para más información sobre cómo controlar pods en grupos de nodos, consulte Best practices for advanced scheduler features in AKS (Procedimientos recomendados para las características avanzadas del programador en AKS).