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

Завершено

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

Решение вашей компании для отслеживания дронов развернуто в службе Azure Kubernetes (AKS) в виде множества контейнерных приложений и служб. Одна из этих служб — это служба пакетной обработки, которая планирует маршруты дронов. При резком росте клиентской базы служба пакетной обработки утонет в запросах и перестанет справляться с поставками. Эта ситуация приводит к задержкам и разочарованию клиентов.

Автоматическое масштабирование количества реплик службы пакетной обработки обеспечивает своевременную обработку заказов. Однако помимо этого также потребуется развернуть дополнительные узлы в соответствии с требованиями к вычислительным ресурсам. Вы проанализировали тенденции использования в Azure Monitor и поняли, что эти узлы применяются только в определенное время суток и экономически невыгодны. Служба пакетной обработки не поддерживает отслеживание состояния и не сохраняет данные сеансов клиентов. Вы поймете, что можно сэкономить деньги, выполнив следующие действия:

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

Рассмотрим базовую инфраструктуру для такого способа снижения затрат в AKS.

Что такое точечная виртуальная машина Azure?

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

  • Сценарии высокопроизводительных вычислений, пакетную обработку или приложения для создания визуализаций

  • Крупномасштабные приложения без отслеживания состояния

  • Среды для разработчиков и тестирования, включая рабочие нагрузки с непрерывной интеграцией (CI) и непрерывной поставкой (CD)

Доступность точечных виртуальных машин

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

Политика вытеснения точечных виртуальных машин

Политика вытеснения точечной виртуальной машины по умолчанию — Освободить. Azure освобождает виртуальные машины с уведомлением о 30 секундах, когда емкость в регионе становится ограниченной. Виртуальная машина, для которой задана политика Освободить, при вытеснении останавливается и освобождается. Когда точечная емкость снова станет доступной, вытесненную виртуальную машину можно развернуть заново. Освобожденная виртуальная машина будет и дальше учитываться в вашей квоте точечных виртуальных ЦП, а за соответствующие выделенные диски нужно будет платить.

Что такое масштабируемый набор точечных виртуальных машин?

Масштабируемый набор точечных виртуальных машин — это масштабируемый набор виртуальных машин, который поддерживает точечные виртуальные машины. Поведение этих виртуальных машин практически идентично поведению обычных виртуальных машин, однако есть одно отличие: при реализации поддержки масштабируемого набора виртуальных машин для точечных виртуальных машин в Azure можно выбрать одну из двух политик вытеснения:

  • Deallocate: функция политики Deallocate точно так же, как описано ранее.

  • Удалить: политика "Удалить" позволяет избежать затрат на диски и превышения квот. При выборе политики вытеснения "Удалить" вытесненные виртуальные машины удаляются вместе с их соответствующими дисками. Функция автомасштабирования масштабируемого набора теперь может автоматически пытаться компенсировать вытеснение виртуальной машины путем создания новых виртуальных машин. Создание виртуальных машин не гарантируется, а вот удаленные виртуальные машины не учитываются в квоте на виртуальные ЦП и не требуют затрат на диски.

    Функцию автомасштабирования рекомендуется использовать, только если в наборе масштабирования настроена политика вытеснения Удалить.

Что такое пул точечных узлов в службе Azure Kubernetes (AKS)?

Пул точечных узлов — это пул узлов пользователей, который использует масштабируемый набор точечных виртуальных машин. AKS поддерживает точечные виртуальные машины, если вы:

  • Планируете создать пулы узлов пользователей.
  • Хотите сэкономить средства за счет поддержки наборов масштабирования виртуальных машин для точечных виртуальных машин Azure.

Используйте пулы точечных узлов в следующих целях:

  • Использование незадействованной емкости в Azure.
  • Использование функций набора масштабирования с политикой вытеснения "Удалить".
  • Определение максимальной цены, которую вы готовы платить в час.
  • Включение рекомендуемого автомасштабирования кластера Kubernetes AKS при использовании пулов точечных узлов.

Например, для поддержки службы пакетной обработки приложения для отслеживания дронов можно создать пул точечных узлов пользователей и включить автомасштабирование кластера. Затем можно настроить горизонтальное масштабирование pod для развертывания дополнительных служб пакетной обработки для соответствия требованиям ресурсов.

По мере роста потребности в узлах средство автомасштабирования кластера сможет увеличивать и уменьшать количество узлов в пуле точечных узлов. Если вытеснение узлов происходит, средство автомасштабирования кластера продолжает пытаться увеличить число узлов, если дополнительные узлы по-прежнему необходимы.

Ограничения пула точечных узлов

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

  • Базовый масштабируемый набор точечных виртуальных машин развертывается только в одном домене сбоя и не дает гарантий высокого уровня доступности.
  • Кластер AKS должен поддерживать несколько пулов узлов.
  • Пулы точечных узлов можно использовать только как пулы узлов пользователей.
  • Невозможно обновить пулы точечных узлов.
  • Создание точечных виртуальных машин не гарантируется. Точечные узлы создаются при наличии емкости и доступности квоты в том регионе Azure, где развернут кластер.

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

Внимание

В некоторых подписках, например спонсорских, возможность создания точечных виртуальных машин и пулов точечных узлов ограничена. В этом случае вы не сможете создать пул точечных узлов для своего кластера.

Добавление пула точечных узлов в кластер AKS

Пул точечных узлов не может быть системным пулом узлов в кластере AKS. Сначала необходимо создать кластер, а затем использовать az aks nodepool add команду для добавления нового пула узлов пользователей.

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

Приоритет

У нового пула узлов параметр --priority по умолчанию получает значение Regular. Установите значение Spot, чтобы указать, что этот новый пул будет пулом точечных узлов. После создания пула изменить это значение нельзя.

Политика вытеснения

Пул точечных узлов должен использовать масштабируемый набор виртуальных машин. Напомним, что пул точечных узлов использует точечный масштабируемый набор. Delete Установите для --eviction-policy разрешения масштабируемого набора удалить узел и базовый выделенный диск, используемый узлом. Это значение невозможно изменить после создания.

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

Максимальная цена для точечного узла

Пулы точечных узлов оптимизируют затраты путем ограничения максимальной суммы, которую вы готовы платить за точечный узел в час. Чтобы настроить допустимое значение, используйте параметр --spot-max-price. По достижении этого значения вновь создаваемые точечные узлы будут вытесняться.

Это значение можно задать для любого положительного значения до пяти десятичных разрядов или задать для него значение -1. --spot-max-price Задание значения, которое -1 влияет на пул узлов следующим образом:

  • Узлы не вытеснили на основе цены узла.
  • Стоимость новых узлов зависит от текущей цены на точечные узлы или цену на стандартный узел, используя любой из них меньше.

Например, если задать значение 0,98765, максимальная цена для узла в долларах США составляет 0,98765 в час. Если расходы на этот узел превысят эту сумму, он будет вытеснен.

Включение средства автомасштабирования кластера

Рекомендуется включить автомасштабирование кластера, используя параметр --enable-cluster-autoscaler. Если средство автомасштабирования кластера не используется, возникает риск того, что из-за ограничений емкости Azure узлы будут вытесняться и в конце концов количество узлов в пуле узлов сократится до нуля.

Минимальное число узлов

Укажите минимальное количество узлов, присвоив значение от 1 до 100 параметру --min-count. Минимальное количество узлов необходимо указывать, если используется средство автомасштабирования кластера.

Максимальное число узлов

Укажите максимальное количество узлов, присвоив значение от 1 до 100 параметру --max-count. Максимальное количество узлов необходимо указывать, если используется средство автомасштабирования кластера.

Пример конфигурации

Ниже приведен пример az aks nodepool add команды, которая добавляет пул точечных узлов с максимальным количеством 3 и минимального количества 1. Обратите внимание на использование --enable-cluster-autoscaler функции точечных узлов.

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

Развертывание объектов pod в пулах точечных узлов

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

Что такое отметка?

Отметка применяется к узлу, чтобы указать, что на этом узле можно планировать только определенные объекты pod. Точечным узлам присваивается метка kubernetes.azure.com/scalesetpriority:spot.

Что такое допуск?

Допуск — это спецификация, применяемая к группе pod, позволяющая, но не требующая, чтобы pod была запланирована на узле с соответствующей отметкой. Точечным узлам присваивается отметка kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Примечание.

Отметки и допуски не гарантируют, что группа pod будет размещена на определенном узле. Например, если узел не имеет отметок, возможно, что модуль pod с допуском может быть запланирован на неуправляемом узле. Определение сходства с отметками и допусками может решить эту проблему.

Что такое сходство узлов?

Сходство узлов позволяет описывать, какие объекты pod планируются на том или ином узле. Сходство указывается с помощью меток, определенных на узле. Например, в AKS системные pod настраиваются с запретом близости для точечных узлов, чтобы объекты pod не планировались на этих узлах.

Определение допуска в файле манифеста pod

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

Свойство Description
key Определяет пару "ключ-значение" отметки узла, указанную на узле. Например, в пуле точечных узлов пара "ключ-значение" выглядит как kubernetes.azure.com/scalesetpriority:spot. Ключ — kubernetes.azure.com/scalesetpriority.
operator Обеспечивает совпадение допуска и отметки. Оператор по умолчанию — Equal. Для соотнесения с допуском можно также использовать параметр Exists. Однако при использовании Exists не указывается следующее свойство (value).
value Представляет часть значения пары "ключ-значение", указанной на узле. Например, в пуле точечных узлов с парой "ключ-значение" вида kubernetes.azure.com/scalesetpriority:spot используется значение spot.
effect Это значение показывает, каким образом планирование для объекта pod обрабатывается в системе. Предусмотрено три варианта: NoSchedule, PreferNoSchedule и NoExecute. NoSchedule гарантирует, что система не может запланировать модуль pod. PreferNoSchedule дает системе возможность попытаться избежать планирования объекта pod. NoExecute либо удаляет объекты pod, уже запущенные на узле c отметкой, либо не планирует их вообще.

Определение сходства узлов в файле манифеста pod

Сходство определяется путем создания записи affinity в файле манифеста рабочей нагрузки. В этой записи задаются следующие свойства для каждой метки узла, которой должна соответствовать рабочая нагрузка.

Свойство Description
nodeAffinity Описывает правила планирования сходства узлов для pod.
requiredDuringSchedulingIgnoredDuringExecution Если требования к сопоставлению, указанные в этом поле, не выполняются во время планирования, модуль pod не может быть запланирован на узел. Если требования к сопоставлению, указанные в этом поле, перестают выполняться в какой-то момент во время выполнения модуля pod (например, из-за обновления), система может попытаться вытеснить модуль pod с узла.
nodeSelectorTerms Список условий селектора узлов. Термины, возвращаемые любым из фильтров, а не все фильтры.
matchExpressions Список требований к селектору узлов по меткам узла.
key Ключ метки, к которому применяется селектор. Ключ — kubernetes.azure.com/scalesetpriority.
operator Представляет связь ключа с набором значений. Допустимые операторы: In, NotIn, Exists, DoesNotExist Gt и Lt.
values Представляет часть значения в паре "ключ — значение" метки узла, указанной на узле. В пуле точечных узлов с парой "ключ — значение" вида kubernetes.azure.com/scalesetpriority:spot используется значение spot.

Ниже показан пример рабочей нагрузки с допуском и сходством, добавленными для пулов точечных узлов.

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"

Проверьте свои знания

1.

Предположим, у вас есть служба без отслеживания состояния, которая обрабатывает заказы в сети и выполняется в кластере службы Azure Kubernetes (AKS). Вы решили оптимизировать затраты на вычислительные ресурсы в кластере AKS, используя в этом кластере пул точечных узлов. Как добавить пулы точечных узлов в кластер AKS?

2.

Какая политика вытеснения является наиболее экономичной при настройке пула точечных узлов в службе, описанной в предыдущем вопросе?

3.

Как обеспечить планирование рабочих нагрузок на узлах пула точечных узлов пользователей в службах, описываемых в предыдущих вопросах?