Ejercicio: configuración de varios nodos y habilitación de la escala a cero en un clúster de AKS

Completado

Azure Kubernetes Service le permite crear diferentes grupos de nodos para hacer coincidir cargas de trabajo específicas con los nodos que se ejecutan en cada grupo de nodos.

Recuerde del ejemplo de seguimiento de drones que el equipo desarrolló un nuevo servicio de modelado predictivo que procesa la información de las rutas de vuelo bajo condiciones climatológicas extremas y crea rutas de vuelo óptimas. Este servicio requiere compatibilidad con máquinas virtuales basadas en GPU y solo se ejecuta en días concretos de la semana. El equipo quiere asegurarse de que no se usan máquinas virtuales cuando el servicio no se ejecuta.

Aquí creará un clúster de Kubernetes administrado por Azure Kubernetes Service (AKS). A continuación, configurará el clúster para admitir varios grupos de nodos y permitir que los clústeres escalen los nodos de los grupos de nodos. A continuación, agregará un segundo grupo de nodos para admitir cargas de trabajo de usuario con un recuento dinámico de nodos. Por último, escalará el número de nodos a cero para reducir el coste de los nodos usados en el clúster de AKS.

Creación de un grupo de recursos

  1. Inicie sesión en Azure Cloud Shell con la cuenta de Azure. Seleccione la versión Bash de Cloud Shell.

  2. Los valores que cree aquí se reutilizarán en todos los ejercicios de este módulo. Guarde la salida para su uso futuro.

  3. Elija una región para hospedar el grupo de recursos. Las características de los ejercicios posteriores no están disponibles en todas las regiones. Por este motivo, se recomienda usar eastus como región. Si decide usar un valor diferente, cambie el valor de REGION_NAME.

    Ejecute los comandos siguientes para registrar las variables:

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    Sugerencia

    Puede usar el botón Copiar para copiar los comandos en el Portapapeles. Para pegarlos, haga clic con el botón derecho en una nueva línea en el terminal de Cloud Shell y seleccione Pegar, o bien use el método abreviado de teclado Mayús+Insert (⌘+V en macOS).

    Es posible comprobar cada valor mediante la ejecución del comando echo. Por ejemplo: echo $REGION_NAME.

  4. Anote AKS_CLUSTER_NAME. A lo largo de los ejercicios, usará este valor más adelante para la limpieza y la configuración del clúster.

    echo $AKS_CLUSTER_NAME
    
  5. Cree un grupo de recursos denominado rg-akscostsaving. Implementará todos los recursos que cree en estos ejercicios en este grupo de recursos. Un único grupo de recursos facilita la limpieza de los recursos después de finalizar el módulo.

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

Creación del clúster de AKS

Con el grupo de recursos creado, puede crear clústeres de AKS en el grupo. El primer paso es obtener la versión de Kubernetes en la región seleccionada. Esta versión se establece para configurar el clúster.

  1. Para obtener la versión de Kubernetes, ejecute el comando az aks get-versions. La consulta siguiente devuelve una versión de Kubernetes que no es de versión preliminar. Almacene ese valor en una variable de Bash denominada VERSION. Ejecute el comando siguiente para recuperar y almacenar el número de versión:

    VERSION=$(az aks get-versions \
        --location $REGION_NAME \
        --query "values[?isPreview==null].version | [-1]" \
        --output tsv)
    echo $VERSION
    
  2. Ejecute el comando az aks create para crear el clúster de AKS. El clúster se ejecuta con dos nodos en el grupo de nodos del sistema. Este comando puede tardar unos minutos en finalizar.

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    El comando az aks create tiene varios parámetros que permiten precisar la configuración del clúster de Kubernetes. Hay dos parámetros importantes a la hora de configurar la correcta compatibilidad del clúster con el escalado y la presencia de varios grupos de nodos:

    Parámetro y valor Descripción
    --load-balancer-sku standard El equilibrador de carga predeterminado que admite AKS es basic. El equilibrador de carga basic no se admite cuando se usan varios grupos de nodos. Establezca el valor en standard.
    --vm-set-type VirtualMachineScaleSets Para usar las características de escalado de AKS, se necesitan conjuntos de escalado de máquinas virtuales. Este parámetro habilita la compatibilidad con los conjuntos de escalado.

    Observe que dos nodos del grupo de nodos predeterminado se han configurado con el parámetro --node-count 2. Recuerde la descripción anterior de que los servicios esenciales del sistema se ejecutan en este grupo de nodos del sistema. Es importante que los clústeres de producción usen al menos --node-count 3 para la confiabilidad en el funcionamiento del clúster. Solo usamos dos nodos para las consideraciones de costo en este ejercicio.

  3. Ejecute el comando az aks nodepool list para mostrar los grupos de nodos del clúster nuevo:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Este es un ejemplo del resultado del comando:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Observe que el grupo de nodos mode se establece en System y que el valor de name se asigna automáticamente.

Adición de un grupo de nodos

  1. El clúster tiene un grupo de nodos único. Agregue un segundo grupo de nodos mediante la ejecución del comando az aks nodepool add. Ejecute el comando en este paso para crear un grupo de nodos de usuario con tres nodos y el nombre batchprocpl. Tenga en cuenta que los nombres de los grupos de nodos deben empezar con una letra minúscula y solo pueden contener caracteres alfanuméricos. Los nombres de los grupos de nodos están limitados a 12 caracteres en Linux y a 6 caracteres en Windows.

    Ejecute el comando siguiente:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. Ejecute el comando az aks nodepool list para mostrar el grupo de nodos nuevo en el clúster:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Este es un ejemplo del resultado del comando:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Observe que el la opción mode del grupo de nodos nuevo se establece en User y que el valor de name es batchprocpl.

Escalado del recuento de nodos del grupo de nodos a cero

Ejecute el comando az aks nodepool scale para escalar manualmente los nodos de un grupo de nodos.

Ejecute el comando az aks nodepool scale y use el parámetro --node-count para establecer el valor del recuento de nodos en 0.

Este es un ejemplo del comando:

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

Este es un ejemplo del resultado del comando:

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

Observe que el valor del parámetro del grupo de nodos count está establecido en 0 y que el valor enableAutoScaling se establece en null. Para programar cargas de trabajo, debe aumentar manualmente el número de nodos de este grupo de nodos, ya que su creación no se produce automáticamente de forma predeterminada.

Configuración del contexto de Kubernetes

En el resultado del comando anterior, el número de grupos de nodos se establece en 0. Para confirmar los nodos disponibles en el clúster, ejecute el comando kubectl get nodes.

  1. Ejecute kubectl para interactuar con el servidor de API del clúster. Tiene que configurar un contexto de clúster de Kubernetes para permitir la conexión de kubectl. El contexto contiene la dirección del clúster, un usuario y un espacio de nombres. Ejecute el comando az aks get-credentials para configurar el contexto de Kubernetes en Cloud Shell.

    Para recuperar las credenciales del clúster, ejecute este comando:

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    Este es un ejemplo del resultado del comando.

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. Enumere los nodos de los grupos de nodos.

    kubectl get nodes
    

    Este es un ejemplo del resultado del comando:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    Observe que, aunque el comando az aks nodepool list muestra dos grupos de nodos, solo hay dos nodos disponibles en el clúster, ambos de nodepool1.

Para optimizar costos en AKS al administrar las demandas de carga de trabajo directamente, una buena estrategia es:

  • Escalar manualmente el recuento de nodos de los grupos de nodos.
  • Escale los grupos de nodos de usuario caros basados en NV a cero.

Veamos una estrategia en la que es necesario escalar los nodos, pero no controlar directamente la demanda.