Возможно, вы уже слышали, что Azure сотрудничает с Ampere чтобы использовать процессоры на базе ARM для виртуальных машин в Azure. Это очень интересно, поскольку дает вам возможность развертывать рабочие нагрузки на высокопроизводительных и энергоэффективных виртуальных машинах, и эти характеристики в конечном итоге приводят к отличному соотношению цена-качество (снижение затрат 🥳).

Итак… готовы ли вы развернуть свои рабочие нагрузки в пулах узлов ARM64 в AKS? Я точно не был, когда пытался развернуть azure-voting-app-redis приложение к моему кластеру.

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


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

Добавить пул узлов ARM64 в существующий кластер AKS очень просто; вы просто добавляете новый пул узлов. Самый быстрый способ сделать это — ввести следующую команду Azure CLI:

$ az aks nodepool add \
    --resource-group <RESOURCE_GROUP_NAME> \
    --cluster-name <AKS_CLUSTER_NAME> \
    --name <ARM64_NODEPOOL_NAME> \
    --node-count <ARM64_NODEPOOL_COUNT> \
    --node-vm-size <ARM64_NODEPOOL_VM_SIZE>
Войти в полноэкранный режим

Выйти из полноэкранного режима

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


Выбор артикула

Семейства виртуальных машин на базе Azure ARM включают:

📝 ПРИМЕЧАНИЕ

Если вы собираетесь использовать виртуальные машины с эфемерные диски ОС для вашего пула узлов вам нужно будет выбрать номер SKU виртуальной машины, который предлагает диск временного хранилища. Обычно это обозначается строчными буквами d в SKU (пример: Standard_D2pds_v5).

💡 КОНЧИК

Прежде чем пытаться развернуть пул узлов, рекомендуется выполнить следующую команду Azure CLI, чтобы проверить, доступен ли SKU в вашем регионе:

$ az vm list-sizes \
    --location eastus \
    --query "[? contains(name, 'Standard_D2pds_v5')]" \
    --output table
Войти в полноэкранный режим

Выйти из полноэкранного режима


Заражение системного пула узлов

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

Вы можете испортить существующие пулы узлов с помощью команды Azure CLI следующим образом:

$ az aks nodepool update \
    --resource-group <RESOURCE_GROUP_NAME> \
    --cluster-name <AKS_CLUSTER_NAME> \
    --name <SYSTEM_NODEPOOL_NAME> \
    --node-taints "CriticalAddonsOnly=true:NoSchedule"
Войти в полноэкранный режим

Выйти из полноэкранного режима


Мультиплатформенные образы контейнеров

Следующее, что нужно учитывать, — поддерживают ли ваши образы контейнеров архитектуру ARM64.

Как указано выше, моя попытка развернуть azure-voting-app (который используется во многих руководствах по быстрому запуску AKS) не удалось, так как он поддерживает только архитектуру AMD64.

Это привело меня к копанию слоев образа через Docker Hub и манифестам Dockerfile на GitHub, чтобы выяснить, где можно использовать AMD64.


Исследование Dockerfile

Вы можете использовать интерфейс командной строки Docker для проверки манифеста образа контейнера. Я взглянул на образ контейнера (mcr.microsoft.com/azuredocs/azure-vote-front:v1) используется в Краткое руководство пользователя и подтвердил, что не поддерживает архитектуру ARM64.

Пример:

$ docker manifest inspect mcr.microsoft.com/azuredocs/azure-vote-front:v1
Войти в полноэкранный режим

Выйти из полноэкранного режима


Возможные решения

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

Есть несколько вариантов сделать это:

  1. Создать Dockerfile для каждой платформы соберите каждую версию, а затем создайте манифест для представления образа контейнера как единого образа с несколькими вариантами (ниже мы увидим, как это выглядит).
  2. Создать сингл Dockerfile и использовать Докер Билдкс для создания образов контейнеров для каждой платформы, которую я хочу поддерживать, с помощью --platform флаг и указание целевых платформ linux/amd64 а также linux/arm64.

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

Я выбрал вариант Docker Buildx, так как мне не хотелось поддерживать несколько файлов Dockerfile. azure-vote-app это приложение Python/Flask, поэтому я мог бы обойтись одним Dockerfile.

Но… Docker Buildx не будет волшебно заставить все работать.

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

Вот как mcr.microsoft.com/azuredocs/azure-vote-front:v1 образ контейнера составлен

Итак, что это значит? Ну, это значит, что я не мог использовать оригинал Докерфайл и необходимо было создать его с нуля на основе python:3.6-buster 😓

После небольшого заимствования кода, слияния и повышения версии Python до версии 3.9 был создан новый мультиплатформенный совместимый манифест, и можно найти файл Dockerfile. здесь.

Большой привет @tiangolo чьи образы контейнеров использовались в руководстве по началу работы с AKS все эти годы! 🎉


Создание и публикация мультиплатформенного образа с помощью docker buildx

С новым Докерфайля использовал docker buildx build команду для сборки и отправки в мой Реестр контейнеров Azure.

# create a new builder
$ docker buildx create --name mybuilder --driver docker-container --bootstrap --use

# log into azure container registry
$ az acr login --name cloudnativeadvocates

# build and push to azure container registry
$ docker buildx build --platform linux/amd64,linux/arm64 --tag cloudnativeadvocates.azurecr.io/azure-vote-front:v1 --push .
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь, если вы проверите манифест на наличие cloudnativeadvocates.azurecr.io/azure-vote-front:v1.0.0 изображение, вы увидите, что оно поддерживает несколько платформ.

$ docker manifest inspect cloudnativeadvocates.azurecr.io/azure-vote-front:v1.0.0
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 6579,
         "digest": "sha256:0c13642cc335967d8a382ce39ce5b20338cefc47a404ac373a0f73ad13d1260a",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 6579,
         "digest": "sha256:682111c0a5f11e35355e8f30bd2134e03646aa3a8403baf200bf34481e8b1fed",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      }
   ]
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Автоматизируйте сборку

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


Обновление Кубернета deployment проявляется

Последнее, что следует учитывать, это использование nodeSelector в спецификация модуля развертывания. Многоязычная архитектура означает, что у нас будут компоненты, написанные на разных языках и скомпилированные для разных операционных систем и архитектур. Итак, установив значение kubernetes.io/arch: "arm64" Это хорошая идея, чтобы гарантировать, что ваши рабочие нагрузки ARM64 не будут пытаться планироваться на узлах, отличных от ARM64.


Резюме

Я надеюсь, что это поможет вам подготовиться к использованию высокопроизводительных и экономичных пулов узлов на базе ARM в AKS. Как уже отмечалось, развернуть пулы узлов на базе ARM64 несложно. Что может быть непросто, так это убедиться, что ваш образ контейнера и все его базовые уровни будут поддерживать несколько платформ. Таким образом, вам может потребоваться переписать файл Dockerfile в дополнение к изменению процесса сборки контейнера. Оттуда вы должны добавить taint в пул системных узлов и nodeSelector в спецификацию вашего модуля, чтобы гарантировать, что приложение запланировано для соответствующих узлов.

Если у вас есть какие-либо отзывы или вопросы, пожалуйста, обращайтесь в комментариях ниже или через Твиттер 😊


Теперь ты попробуй

Попробуйте развернуть приложение azure-voting-app для ARM64 в AKS, перейдя на AKS с лабораторией пулов узлов ARM64. В этом лабораторном занятии вы развернете инфраструктуру с помощью Azure Bicep, но если вам удобнее использовать Terraform, используйте это Развертывание Terraform как альтернативный путь.

До следующего раза, ура!


Ресурсы