Упражнение. Настройка пулов точечных узлов с помощью автомасштабирования кластера в кластере AKS

Завершено

Пулы узлов пользователей Spot позволяют использовать неиспользуемую вычислительную емкость Azure по сниженным ценам, включая сценарии высокопроизводительных вычислений.

В предыдущем упражнении вы создали стандартный пул узлов пользователей, использовали автомасштабирование кластера для управления созданием узлов и масштабировали количество узлов вручную.

Следующим шагом является добавление пула точечных узлов пользователей с автоматическим масштабированием, чтобы снизить эксплуатационные затраты кластера. Использование кластера зависит от необходимых ресурсов и не предсказуемо, поэтому вы настраиваете правила для отслеживания пиков и спадов. Рабочая нагрузка развертывается с включенной аффинностью узлов, чтобы pod планировался на узлах в пуле эпизодических узлов.

Создание пула точечных узлов

Необходимо создать отдельный пул узлов, поддерживающий службу пакетной обработки. Этот пул узлов — это пул точечных узлов, использующий политику удаления и максимальную цену -1.

  1. Выполните ту же команду az aks nodepool add, что и в предыдущем упражнении, чтобы добавить новый пул точечных узлов в кластер. Необходимо изменить имя пула узлов и добавить несколько дополнительных параметров, чтобы определить этот пул узлов в качестве пула точечных узлов.

    Введите следующие значения, чтобы задать параметры пула узлов:

    • Имя: batchprocpl2
    • Приоритет: Spot
    • Политика выселения: Delete
    • Спотовая максимальная цена: -1

    Выполните следующую команду, чтобы создать пул точечных узлов:

    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
    

    Имейте в виду, что этот запрос может завершиться ошибкой из-за ограничений по пропускной способности в выбранной вами локации.

  2. Выполните команду az aks nodepool show, чтобы отобразить сведения о новом пуле точечных узлов для службы пакетной обработки:

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

    Ниже приведен пример выходных данных команды.

    {
    "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
    }
    

    В этом результате несколько значений отличаются от того, что вы видели в предыдущих пулах узлов. Давайте рассмотрим следующие элементы:

    • Значение свойства enableAutoScaling установлено в true.

    • Устанавливаются значения maxCount и minCount.

    • Для свойства scaleSetEvictionPolicy задано значение Delete.

    • Для свойства scaleSetPriority задано значение Spot.

    • Для свойства spotMaxPrice задано значение -1.

    • К этому пулу узлов применяются nodeLabels и nodeTaints. Эти значения используются для планирования рабочих нагрузок на узлах в пуле узлов.

Настройка пространства имен

  1. Выполните команду kubectl create namespace, чтобы создать пространство имен с именем costsavings для приложения. Это пространство имен будет использоваться для упрощения выбора рабочих нагрузок.

    kubectl create namespace costsavings
    

    Ниже приведены выходные данные предыдущей команды:

    namespace/costsavings created
    

Планирование pod с сопоставлением точечных узлов

Вы можете запланировать запуск pod на спотовом узле, добавив терпимость и аффинити в файл манифеста развертывания pod. Когда толерации и узловая аффинность соответствуют наложенным на точечные узлы загрязнениям и меткам, модуль (pod) планируется на этих узлах.

Узлы в пуле точечных узлов назначаются запятой, равные kubernetes.azure.com/scalesetpriority=spot:NoSchedule и метке, равной kubernetes.azure.com/scalesetpriority=spot. Используйте сведения в этой паре "ключ-значение" в разделе tolerations и affinity файла манифеста YAML для рабочих нагрузок. С помощью второго пула пакетной обработки, настроенного в качестве пула точечных узлов, теперь можно создать файл развертывания для планирования рабочих нагрузок для выполнения на нем.

  1. Создайте файл манифеста для развертывания Kubernetes с именем spot-node-deployment.yaml с помощью встроенного редактора:

    code spot-node-deployment.yaml
    

    Совет

    Cloud Shell включает интегрированный редактор файлов. Редактор Cloud Shell поддерживает такие функции, как выделение языка, палитра команд и проводник. Для простого создания и редактирования файлов запустите редактор, выполнив code . в терминале Cloud Shell. Это действие открывает редактор с активным рабочим каталогом, заданным в терминале. Чтобы открыть файл манифеста непосредственно для быстрого редактирования, выполните code spot-node-deployment.yaml. Эта команда открывает редактор без проводника файлов.

  2. Вставьте следующий текст в файл:

    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. Нажмите клавиши CTRL+S , чтобы сохранить файл, а затем нажмите клавиши CTRL+Q, чтобы закрыть редактор.

  4. Выполните команду kubectl apply, чтобы применить конфигурацию и развернуть приложение в пространстве имен costsavings:

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

    Ниже приведены выходные данные предыдущей команды:

    pod/nginx created
    
  5. Дополнительные сведения о работающем модуле pod можно получить с помощью флага -o wide при выполнении команды kubectl get pods. В этом случае необходимо увидеть, на каком узле запланирован модуль pod. Убедитесь, что вы запросили pod в пространстве имен costsavings.

    kubectl get pods --namespace costsavings -o wide
    

    Выходные данные должны выглядеть следующим образом:

    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>
    

    Обратите внимание на имя узла, aks-batchprocpl2-25254417-vmss000000. Этот узел является частью созданного ранее пула точечных узлов batchprocpl2.