Ejercicio: Configuración de grupos de nodos de acceso puntual con el escalador automático de clúster en un clúster de AKS

Completado

Los grupos de nodos de usuario puntuales permiten acceder a la capacidad de proceso de Azure sin usar a precios más bajos con compatibilidad con escenarios informáticos de alto rendimiento.

En el ejercicio anterior, ha creado un grupo de nodos de usuario estándar con el escalador automático de clúster para administrar la creación de nodos, y ha escalado el número de nodos de forma manual.

El siguiente paso es agregar un grupo de nodos de usuario puntual con escalado automático para reducir los costos operativos del clúster. El uso de clústeres varía en función de los recursos necesarios y no es predecible, por lo que se configuran reglas para capturar los picos y caídas. La carga de trabajo se implementa con la afinidad de nodo habilitada para que el pod esté programado en los nodos del grupo de nodos de acceso puntual.

Creación de un grupo de nodos de acceso puntual

Necesita crear un grupo de nodos independiente que admita el servicio de procesamiento por lotes. Es un grupo de nodos de acceso puntual que usa la directiva de expulsión Eliminar y un precio máximo de acceso puntual de -1.

  1. Ejecute el mismo comando az aks nodepool add que en el ejercicio anterior para agregar un nuevo grupo de nodos de acceso puntual al clúster. Tendrá que cambiar el nombre del grupo de nodos y agregar algunos parámetros más para identificar este grupo de nodos como un grupo de nodos de acceso puntual.

    Escriba los valores siguientes para establecer los parámetros del grupo de nodos:

    • Nombre: batchprocpl2
    • Prioridad: Spot
    • Directiva de expulsión: Delete
    • Precio máximo de acceso puntual: -1

    Ejecute el comando siguiente para crear el grupo de nodos de acceso puntual:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2 \
        --enable-cluster-autoscaler \
        --max-count 3 \
        --min-count 1 \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --node-vm-size Standard_DS2_v2 \
        --no-wait
    

    Recuerde que se puede producir un error en esta solicitud debido a las restricciones de capacidad de la ubicación que ha seleccionado.

  2. Ejecute el comando az aks nodepool show para mostrar los detalles del nuevo grupo de nodos de acceso puntual para el servicio de procesamiento por lotes:

    az aks nodepool show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2
    

    Este es un ejemplo de la salida del comando.

    {
    "agentPoolType": "VirtualMachineScaleSets",
    "availabilityZones": null,
    "count": 3,
    "enableAutoScaling": true,
    "enableNodePublicIp": false,
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2",
    "maxCount": 3,
    "maxPods": 110,
    "minCount": 1,
    "mode": "User",
    "name": "batchprocpl2",
    "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
    "nodeLabels": {
        "kubernetes.azure.com/scalesetpriority": "spot"
    },
    "nodeTaints": [
        "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
    ],
    "orchestratorVersion": "1.17.9",
    "osDiskSizeGb": 128,
    "osType": "Linux",
    "provisioningState": "Creating",
    "proximityPlacementGroupId": null,
    "resourceGroup": "akscostsavinggrp",
    "scaleSetEvictionPolicy": "Delete",
    "scaleSetPriority": "Spot",
    "spotMaxPrice": -1.0,
    "tags": null,
    "type": "Microsoft.ContainerService/managedClusters/agentPools",
    "upgradeSettings": {
        "maxSurge": null
    },
    "vmSize": "Standard_DS2_v2",
    "vnetSubnetId": null
    }
    

    Algunos de los valores de este resultado son claramente distintos a los que ha visto en los grupos de nodos anteriores. Ahora se revisarán estos elementos:

    • El valor de propiedad enableAutoScaling se establece en true.

    • Tanto el valor maxCount como el valor minCount están establecidos.

    • La propiedad scaleSetEvictionPolicy está establecida en Delete.

    • La propiedad scaleSetPriority está establecida en Spot.

    • La propiedad spotMaxPrice está establecida en -1.

    • nodeLabels y nodeTaints se aplican a este grupo de nodos. Estos valores se usan para programar cargas de trabajo en los nodos de este grupo de nodos.

Configuración de un espacio de nombres

  1. Ejecute el comando kubectl create namespace para crear un espacio de nombres denominado costsavings para la aplicación. Usará este espacio de nombres para facilitar la selección de las cargas de trabajo.

    kubectl create namespace costsavings
    

    Esta es la salida del comando anterior:

    namespace/costsavings created
    

Programación de un pod con afinidad de nodo de grupo de acceso puntual

Para programar que un pod se ejecute en un nodo de acceso puntual, agregue una tolerancia y una afinidad al archivo de manifiesto de implementación del pod. Cuando la tolerancia y la afinidad de nodo se corresponden con la intolerancia y la etiqueta que se aplican a los nodos de acceso puntual, el pod se programa en estos nodos.

A los nodos de un grupo de nodos de acceso puntual se les asigna una intolerancia que equivale a kubernetes.azure.com/scalesetpriority=spot:NoSchedule y una etiqueta que equivale a kubernetes.azure.com/scalesetpriority=spot. Use la información de este par clave-valor en la sección tolerations y affinity del archivo de manifiesto YAML de las cargas de trabajo. Con el segundo grupo de procesamiento por lotes configurado como grupo de nodos de acceso puntual, ya puede crear un archivo de implementación para programar cargas de trabajo para que se ejecuten en él.

  1. Cree un archivo de manifiesto para la implementación de Kubernetes denominado spot-node-deployment.yaml mediante el editor integrado:

    code spot-node-deployment.yaml
    

    Sugerencia

    En Cloud Shell se incluye un editor de archivos integrado. El editor de Cloud Shell admite características como el resaltado de lenguaje, la paleta de comandos y un explorador de archivos. Para la creación y edición sencillas de archivos, inicie el editor mediante la ejecución de code . en el terminal de Cloud Shell. Esta acción abre el editor con el directorio de trabajo activo establecido en el terminal. Para abrir el archivo de manifiesto directamente para su edición rápida, ejecute code spot-node-deployment.yaml. Este comando abre el editor sin el explorador de archivos.

  2. Pegue el texto siguiente en el archivo:

    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"
    
  3. Presione Ctrl+S para guardar el archivo y, después, Ctr+Q para cerrar el editor.

  4. Ejecute el comando kubectl apply para aplicar la configuración e implementarla en el espacio de nombres costsavings:

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    Esta es la salida del comando anterior:

    pod/nginx created
    
  5. Puede obtener más información sobre el pod en ejecución si usa la marca -o wide al ejecutar el comando kubectl get pods. En este caso, quiere ver en qué nodo está programado el pod. Asegúrese de consultar los pods en el espacio de nombres costsavings.

    kubectl get pods --namespace costsavings -o wide
    

    La salida debe ser similar a la siguiente:

    NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                                   NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          43s   10.244.3.3   aks-batchprocpl2-25254417-vmss000000   <none>           <none>
    

    Observe el nombre del nodo, aks-batchprocpl2-25254417-vmss000000. Este nodo forma parte del grupo de nodos de acceso puntual batchprocpl2 que ha creado antes.