Share via


Uso de Azure Spot Virtual Machines en un clúster de Red Hat OpenShift en Azure (ARO)

En este artículo se proporcionan los detalles necesarios que permiten configurar el clúster de Red Hat OpenShift en Azure (ARO) para que use Azure Spot Virtual Machines.

El uso de máquinas virtuales de acceso puntual de Azure permite aprovechar las ventajas de nuestra capacidad no utilizada con un importante ahorro en los costos. Siempre que Azure necesite recuperar la capacidad, la infraestructura de esta plataforma expulsará las máquinas virtuales de acceso puntual de Azure. Para más información sobre las instancias de Spot, consulte Spot Virtual Machines.

Antes de empezar

Antes de empezar, asegúrese de que tiene implementado un clúster de Red Hat Openshift en Azure. Si necesita un clúster de ARO, consulte el artículo de inicio rápido de ARO para obtener un clúster público, o el tutorial de clústeres privados para un clúster privado. Los pasos para configurar el clúster para usar máquina virtual de acceso puntual son los mismos para los clústeres tanto privados como públicos.

Un clúster de ARO siempre debe tener al menos tres nodos de trabajo que no sean máquinas virtuales de acceso puntual y tres nodos de control. Un clúster de ARO no puede tener ningún nodo de control basado en vm de acceso puntual.

Adición de máquinas virtuales de acceso puntual

La administración de máquinas en Red Hat Openshift en Azure se realiza mediante MachineSet. Los recursos MachineSet son grupos de máquinas. MachineSets son para máquinas como ReplicaSets para pods. Si necesita más máquinas o debe reducirlas verticalmente, cambie el campo Réplicas del conjunto de máquinas para satisfacer sus necesidades de proceso. Para más información, consulte nuestra documentación de OpenShift MachineSet

El uso de máquinas virtuales de Spot se especifica agregando el campo spotVMOptions dentro de la especificación de plantilla de un MachineSet. Para crear este MachineSet, haremos lo siguiente:

  1. Obtenga una copia de un MachineSet que se ejecuta en el clúster.
  2. Cree una configuración de MachineSet modificada.
  3. Implementación de este MachineSet en el clúster

En primer lugar, conéctese al clúster de OpenShift mediante la CLI.

oc login $apiServer -u kubeadmin -p <kubeadmin password>

A continuación, enumerará los MachineSets en el clúster. Un clúster predeterminado tendrá 3 MachineSets implementados:

oc get machinesets -n openshift-machine-api

Este es un resultado de ejemplo de este comando:

NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus2   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus3   1         1         1       1           2d22h

A continuación, describirá la implementación de MachineSet. Reemplace <el conjunto> de máquinas por uno de los conjuntos de máquinas enumerados anteriormente y generarlo en un archivo.

oc get machineset <machineset> -n openshift-machine-api -o yaml > spotmachineset.yaml

Deberá cambiar los parámetros siguientes en MachineSet:

  • metadata.name
  • spec.selector.matchLabels.machine.openshift.io/cluster-api-machineset
  • spec.template.metadata.labels.machine.openshift.io/cluster-api-machineset
  • spec.template.spec.providerSpec.value.spotVMOptions (Agregue este campo y esta establezca en {}).

A continuación se muestra un ejemplo abreviado de YAML de Spot MachineSet que resalta los cambios clave que debe realizar al basar un nuevo MachineSet de spot en un MachineSet de trabajo existente, incluida cierta información adicional para el contexto. (El ejemplo no representa un machineSet completo y funcional; muchos campos se han omitido a continuación).

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  name: aro-cluster-abcd1-spot-eastus
spec:
  replicas: 2
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: aro-cluster-abcd1
      machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
  template:
    metadata:
        machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
    spec:
      providerSpec:
        value:
          spotVMOptions: {}
      taints:
        - effect: NoExecute
          key: spot
          value: 'true'

Una vez actualizado el archivo, hay que aplicarlo.

oc create -f spotmachineset.yaml

Para validar que MachineSet se ha creado correctamente, ejecute el siguiente comando:

oc get machinesets -n openshift-machine-api

Esta es una salida de ejemplo. El MachineSet está listo una vez que tenga las máquinas en el estado "Listo".

  NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus2           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus3           1         1         1       1           3d1h
spot                                       1         1         1       1           2m47s

Programación de cargas de trabajo interrumpibles

Se recomienda agregar un taint a los nodos spot para evitar que los nodos no interrumpibles se programen en ellos y agregar tolerancias de este taint a los pods que quiera programar en ellos. Puede contaminar los nodos a través de la especificación MachineSet.

Por ejemplo, puede agregar el siguiente código YAML a spec.template.spec:

     taints:
        - effect: NoExecute
          key: spot
          value: 'true'

Esto impide que los pods se programen en el nodo resultante, a menos que tengan tolerancia para spot='true' taint y expulsarían los pods que carecen de esa tolerancia.

Para obtener más información sobre la aplicación de intolerancias y tolerancias, lea Control de la colocación de pods mediante intolerancias de nodo.

Quota

Las máquinas pueden entrar en un estado con errores debido a problemas de cuota si la cuota para el tipo de máquina que está usando es demasiado baja durante un breve momento, incluso si finalmente debería ser suficiente (por ejemplo, un nodo sigue eliminando cuando se crea otro). Por este problema, se recomienda establecer la cuota del tipo de máquina que va a usar para que las instancias de acceso puntual sean ligeramente superiores a las necesarias (quizás en 2*n, donde n es el número de núcleos usados por una máquina). Esta sobrecarga evitaría tener que solucionar las máquinas con errores, lo que, aunque es relativamente simple, sigue siendo una intervención manual.

Preparación para el nodo

Como se explica en la documentación de vm de Spot vinculada anteriormente, las máquinas virtuales entran en estado de aprovisionamiento desasignado cuando ya no están disponibles o ya no están disponibles en el precio máximo especificado.

Esto se manifestará en OpenShift como nodos No listos. Las máquinas seguirán en buen estado, en la fase Aprovisionadas como nodo.

Volverán a estar listos una vez que las máquinas virtuales estén disponibles de nuevo.

Solucionar problemas

Nodo bloqueado en estado No listo, máquina virtual subyacente desasignada

Si un nodo está bloqueado durante un largo período de tiempo en estado No listo después de desasignar su máquina virtual, puede intentar eliminarlo o eliminar su objeto de máquina de OpenShift correspondiente.

Máquina de acceso puntual bloqueada en estado de Error

Si una máquina (objeto de OpenShift) que usa una máquina virtual de acceso puntual está bloqueada en un estado de Error, intente eliminarla manualmente. Si no se puede eliminar debido a un 403 porque la máquina virtual ya no existe, edite la máquina y quite los finalizadores.