Прочитать на английском

Поделиться через


Подготовка технических ресурсов контейнера Azure для приложения Kubernetes

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

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

Основные технические знания

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

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

Предварительные требования

  • Приложение должно быть основано на диаграмме Helm.

  • Диаграмма Helm не должна содержать .tgz архивные файлы; все файлы должны быть распаковлены.

  • Если у вас несколько чартов, можно включать другие чарты helm как вложенные чарты, кроме основного чарта helm.

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

  • У вас должен быть активный клиент публикации или доступ к клиенту публикации и учетной записи Центра партнеров.

  • Вы должны были создать реестр контейнеров Azure (ACR), который принадлежит активному арендатору публикации, указанному выше. Вы отправите в него пакет облачных собственных приложений (CNAB). Дополнительные сведения см. в статье "Создание Реестр контейнеров Azure".

  • Установите последнюю версию Azure CLI.

  • Приложение должно быть развернуто в среде Linux.

  • Образы должны быть свободными от уязвимостей. Инструкции по указанию требований к сканированию уязвимостей см. в разделе "Устранение неполадок с сертификацией контейнеров". Дополнительные сведения о проверке уязвимостей см. в статье об оценках уязвимостей для Azure с помощью Управление уязвимостями Microsoft Defender.

  • Если средство упаковки запущено вручную, Docker необходимо установить на локальном компьютере. Дополнительные сведения см. в разделе, посвященном серверной части WSL 2, в документации Docker для Windows или Linux. Это поддерживается только на компьютерах Linux или Windows AMD64.

Ограничения

  • Контейнер Marketplace поддерживает только образы AMD64 на платформе Linux.
  • Предложение Container Marketplace поддерживает развертывание в Управляемых AKS и Kubernetes с поддержкой Arc. Одно предложение может быть направлено только на один тип кластера: либо управляемый AKS, либо Kubernetes с поддержкой Arc.
  • Предложения для кластеров Kubernetes с поддержкой Arc поддерживают только предварительно определенные модели выставления счетов. Дополнительные сведения о моделях выставления счетов см. в статье "Планирование предложения контейнера Azure".
  • Отдельные контейнеры не поддерживаются.
  • Связанные шаблоны Azure Resource Manager не поддерживаются.

Обзор процесса публикации

Первым шагом для публикации предложения контейнера на основе приложений Kubernetes в Azure Marketplace является упаковка приложения в виде пакета облачных собственных приложений (CNAB). CNAB, состоящий из артефактов вашего приложения, сначала публикуется в частный Реестр контейнеров Azure (ACR), а затем отправляется в публичный ACR Microsoft и используется в качестве единственного артефакта, на который вы ссылаетесь в Центре партнеров.

Оттуда выполняется сканирование уязвимостей, чтобы обеспечить безопасность изображений. Наконец, приложение Kubernetes регистрируется в качестве типа расширения для кластера Служба Azure Kubernetes (AKS).

После публикации предложения ваше приложение использует функцию расширения кластеров AKS для управления жизненным циклом приложения в кластере AKS.

Схема, показывающая три этапа обработки пакета, движущаяся от

Предоставьте доступ к вашему реестру контейнеров Azure

В процессе публикации корпорация Майкрософт полностью копирует ваш CNAB из вашего ACR в специальный ACR от Azure Marketplace, принадлежащий корпорации Майкрософт. Образы передаются в общедоступный реестр, доступный для всех. На этом шаге требуется предоставить корпорации Майкрософт доступ к реестру. ACR должен находиться в том же клиенте Microsoft Entra, который связан с учетной записью Центра партнеров.

Корпорация Майкрософт имеет первое приложение, ответственное за обработку этого процесса с помощью id32597670-3e15-4def-8851-614ff48c1efa. Чтобы начать, создайте учетную запись службы, основанную на приложении.

Примечание

Если у вашей учетной записи нет разрешения на создание субъекта-службы, az ad sp create возвращает сообщение об ошибке, которое содержит текст "Недостаточно привилегий для завершения операции". Чтобы создать учетную запись службы, обратитесь к администратору Microsoft Entra.

Azure CLI
az login

Проверьте, существует ли субъект-служба для приложения:

Azure CLI
az ad sp show --id 32597670-3e15-4def-8851-614ff48c1efa 

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

Azure CLI
az ad sp create --id 32597670-3e15-4def-8851-614ff48c1efa

Запишите идентификатор сервисного принципала для использования в следующих шагах.

Затем получите полный идентификатор реестра:

Azure CLI
az acr show --name <registry-name> --query "id" --output tsv

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

Bash
...
},
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/myregistry",
...

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

Чтобы назначать роли Azure необходимо наличие:

Azure CLI
az role assignment create --assignee <sp-id> --scope <registry-id> --role acrpull

Наконец, зарегистрируйте Microsoft.PartnerCenterIngestion поставщика ресурсов в той же подписке, которая использовалась для создания Реестр контейнеров Azure:

Azure CLI
az provider register --namespace Microsoft.PartnerCenterIngestion --subscription <subscription-id> --wait

Отслеживайте регистрацию и убедитесь, что она завершена, прежде чем продолжить:

Azure CLI
az provider show -n Microsoft.PartnerCenterIngestion --subscription <subscription-id>

Сбор артефактов в соответствии с требованиями к формату пакета

Каждый CNAB состоит из следующих артефактов:

  • Диаграмма Helm
  • CreateUiDefinition
  • Шаблон ARM
  • Файл манифеста

Обновление диаграммы Helm

Убедитесь, что диаграмма Helm соответствует следующим правилам:

  • Все имена изображений и ссылки параметризируются и представлены в values.yaml виде ссылок global.azure.images. Обновите файл шаблона диаграммы Helm deployment.yaml, чтобы ссылаться на эти изображения. Это гарантирует, что блок изображения можно обновить, чтобы ссылаться на образы ACR в Azure Marketplace. Снимок экрана с примером расширенной поддержки добавления тегов. Снимок экрана с добавлением ссылки на изображение.

  • Если у вас несколько чартов, можно включить другие чарты в качестве субчартов помимо основного helm-чарта. Все зависимые ссылки на изображения helm-чартов потребуют обновления и должны указывать на изображения, включенные в основной чарт values.yaml.

  • При ссылке на изображения можно использовать теги или дайджесты. Однако важно отметить, что образы заново перенаправляются внутри системы, чтобы указывать на принадлежащий Microsoft Реестр контейнеров Azure (ACR). При обновлении тега новая версия CNAB должна быть отправлена в Azure Marketplace. Это нужно для того, чтобы изменения были отражены в развертываниях клиентов.

    Снимок экрана: пример добавления ссылки на поддержку тегов.

Доступные модели выставления счетов

Для всех доступных моделей выставления счетов смотрите параметры лицензирования для приложений Azure Kubernetes.

Внесите изменения на основе вашей модели выставления счетов.

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

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

  • Добавьте метку azure-extensions-usage-release-identifier идентификатора выставления счетов в Pod-спецификацию в ваших yaml-файлах нагрузки.

    • Если рабочая нагрузка указана как спецификации Deployments, ReplicaSets, StatefulSets или DaemonSets, добавьте эту метку в .spec.template.metadata.labels.

    • Если рабочая нагрузка указана в спецификациях Pod, добавьте эту метку под .metadata.labels.

      Снимок экрана файла deployment.yaml с правильно отформатированной меткой идентификатора выставления счетов. Содержимое похоже на пример файла deployment.yaml, на который есть ссылка в этой статье.

      Снимок экрана: правильно отформатированная метка идентификатора выставления счетов в файле statefulsets.yaml. Содержимое напоминает пример файла statefulsets.yaml, связанного в этой статье.

      Снимок экрана: запросы ресурсов ЦП в файле daemonsets.yaml. Содержимое напоминает пример файла daemonsets.yaml, связанного в этой статье.

      Снимок экрана: запросы ресурсов ЦП в файле pods.yaml. Содержимое напоминает пример файла pods.yaml, связанного в этой статье.

  • Для модели выставления счетов perCore укажите CPU Request, включив поле resources:requests в манифест ресурса контейнера. Этот шаг необходим только для модели выставления счетов perCore.

    Снимок экрана запросов ресурсов ЦП в файле pods.yaml. Содержимое напоминает пример файла модели выставления счетов на ядро, приведенного в этой статье.

Во время развертывания функция расширений кластера заменяет значение идентификатора выставления счетов именем экземпляра расширения.

Примеры, настроенные для развертывания приложения для голосования Azure, см. в следующих статьях:

Для модели выставления счетов настраиваемых счетчиков добавьте поля, перечисленные ниже в файле helm template's values.yaml.

  • clientId следует добавить в global.azure.identity
  • Ключ planId следует добавить в global.azure.marketplace. planId
  • resourceId следует добавить в global.azure.extension.resrouceId

Снимок экрана: выставление счетов за пользовательское измерение.

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

Проверка диаграммы Helm

Чтобы убедиться, что диаграмма Helm действительна, проверьте, можно ли установить ее в локальном кластере. Можно также использовать helm install --generate-name --dry-run --debug для обнаружения определенных ошибок создания шаблонов.

Создание и проверка createUiDefinition

CreateUiDefinition — это JSON-файл, определяющий элементы пользовательского интерфейса для портал Azure при развертывании приложения. Дополнительные сведения см. в разделе:

  • CreateUiDefinition.json для Azure

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

После создания файла createUiDefinition.json для приложения необходимо протестировать взаимодействие с пользователем. Чтобы упростить тестирование, скопируйте содержимое файла в среду песочницы. Песочница отображает ваш пользовательский интерфейс в текущем полноэкранном режиме портала. Песочница — это рекомендуемый способ предварительного просмотра пользовательского интерфейса.

Создание шаблона Azure Resource Manager (ARM)

Шаблон ARM определяет ресурсы Azure для развертывания. По умолчанию вы развернете ресурс расширения кластера для приложения Azure Marketplace. При необходимости можно развернуть кластер AKS.

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

  • Microsoft.ContainerService/managedClusters
  • Microsoft.KubernetesConfiguration/extensions

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

Поток параметров пользователя

Важно понять, как параметры пользователя проходят через объекты, которые вы создаете и упаковываете. В примере приложения для голосования Azure параметры изначально определяются при создании пользовательского интерфейса с помощью файла createUiDefinition.json:

Снимок экрана: пример createUiDefinition, связанный в этой статье. Показаны определения для

Параметры экспортируются с помощью outputs раздела:

Снимок экрана примера createUiDefinition, упомянутого в этой статье. Отображаются выходные строки для заголовка приложения, 'value1' и 'value2'.

Оттуда значения передаются в шаблон Azure Resource Manager и распространяются на диаграмму Helm во время развертывания:

Снимок экрана: пример шаблона Azure Resource Manager, связанный в этой статье. В разделе ConfigurationSettings отображаются параметры заголовка приложения, value1 и value2.

Наконец, значения передаются в диаграмму Helm, values.yaml как показано ниже.

Снимок экрана примера диаграммы Helm, приведённой в этой статье. Показаны значения заголовка приложения,

Примечание

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

Создание файла манифеста

Манифест пакета — это yaml-файл, описывающий пакет и его содержимое, и сообщает средству упаковки, где находить зависимые артефакты.

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

Имя. Тип данных Описание
applicationName Строка Имя приложения
издатель Строка Имя издателя
описание Строка Краткое описание пакета
версия Строка в #.#.# формате Строка версии, описывающая версию пакета приложения, может или не совпадать с версией двоичных файлов внутри.
helmChart Строка Локальный каталог, в котором можно найти диаграмму Helm относительно этого manifest.yaml
clusterARMTemplate Строка Локальный путь, в котором можно найти шаблон ARM, описывающий кластер AKS, соответствующий требованиям в поле ограничений.
uiDefinition Строка Локальный путь, по которому можно найти JSON-файл, описывающий опыт создания в Azure Portal
сервер реестра Строка ACR, в который должен быть загружен окончательный пакет CNAB
extensionRegistrationParameters Коллекция Спецификация параметров регистрации расширения. Включите как минимум defaultScope и в качестве параметра.
область по умолчанию Строка Область по умолчанию для установки расширения. Допустимые значения: cluster или namespace. При заданной области cluster, для каждого кластера разрешён только один экземпляр расширения. Если выбрана область namespace, то в пределах пространства имен разрешен только один экземпляр. Так как кластер Kubernetes может иметь несколько пространств имен, может существовать несколько экземпляров расширения.
пространство имен Строка (Необязательно) Укажите пространство имен, в который устанавливается расширение. Это свойство является обязательным, если defaultScope задано значение cluster. Ограничения именования пространств имен см. в разделе "Пространства имен" и DNS.
поддерживаемые типы кластеров Коллекция (Необязательно) Укажите типы кластеров, поддерживаемые приложением. Допустимые типы — managedClusters, connectedClusters. "managedClusters" относится к кластерам службы Azure Kubernetes (AKS). "connectedClusters" относится к кластерам Kubernetes с поддержкой Azure Arc. Если supportedClusterTypes не предоставлен, все дистрибутивы managedClusters поддерживаются по умолчанию. Если предоставлена поддержкаClusterTypes, а указанный тип кластера верхнего уровня не указан, все дистрибутивы и версии Kubernetes для этого типа кластера рассматриваются как неподдерживаемые. Для каждого типа кластера укажите список одного или нескольких дистрибутивов со следующими свойствами:
-распределение
— поддержка_распространения
— неподдерживаемые версии
распределение Список Массив дистрибутивов, соответствующих типу кластера. Укажите имя конкретных дистрибутивов. Задайте для значения [All"] значение , чтобы указать, что поддерживаются все дистрибутивы.
поддержка распространения Логический Логическое значение, представляющее, поддерживаются ли указанные дистрибутивы. Если значение false, предоставление неподдерживаемых версий приводит к ошибке.
неподдерживаемые версии Список Список версий для указанных дистрибутивов, неподдерживаемых. Поддерживаемые операторы:
— "=" Указанная версия не поддерживается. Например, "=1.2.12"
— ">" Все версии, превышающие указанную версию, не поддерживаются. Например, ">1.1.13"
— "<" Все версии меньше указанной версии не поддерживаются. Например, "<1.3.14"
- "..." Все версии в диапазоне не поддерживаются. Например, "1.1.2...1.1.15" (включает значение справа и исключает левое значение)

Для примера, сконфигурированного для приложения для голосования, см. следующий пример файла манифеста.

Структура приложения

Поместите файл createUiDefinition, шаблон ARM и файл манифеста рядом с диаграммой Helm приложения.

Для примера правильно структурированного каталога см. пример Azure Vote.

Для примера приложения для голосования, поддерживающего кластеры Kubernetes с поддержкой Azure Arc, см. пример только для ConnectedCluster .

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

Используйте средство упаковки контейнеров

После добавления всех необходимых артефактов запустите средство container-package-app упаковки для проверки артефактов, сборки пакета и отправки пакета в Реестр контейнеров Azure.

Так как CNAB — это новый формат, и к нему нужно привыкнуть, мы создали образ Docker для container-package-app со стартовой средой и инструментами, необходимыми для успешного запуска средства упаковки.

У вас есть два варианта использования средства упаковки. Его можно использовать вручную или интегрировать в конвейер развертывания.

Запуск средства упаковки вручную

Последнюю версию средства упаковки можно извлечь из mcr.microsoft.com/container-package-app:latest.

Следующая команда Docker извлекает последний образ средства упаковки, а также подключает каталог.

Предположим, что ~\<path-to-content> — это каталог, содержащий содержимое для упаковки, следующая команда Docker монтирует ~/<path-to-content> в /data контейнера. Обязательно замените ~/<path-to-content> на местоположение вашего собственного приложения.

Bash
docker pull mcr.microsoft.com/container-package-app:latest

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v ~/<path-to-content>:/data --entrypoint "/bin/bash" mcr.microsoft.com/container-package-app:latest 

Выполните следующие команды в оболочке container-package-app контейнера. Обязательно замените <registry-name> на имя вашего ACR.

Bash
export REGISTRY_NAME=<registry-name>

az login 

az acr login -n $REGISTRY_NAME 

cd /data/<path-to-content>

Для проверки подлинности ACR существует два варианта. Один из вариантов — использование az login, как показано ранее, а второй — с помощью docker, выполнив команду docker login 'yourACRname'.azurecr.io. Введите имя пользователя и пароль (имя пользователя должно быть именем ACR, а пароль — созданным ключом, предоставленным в портале Azure) и запустите.

Bash
docker login <yourACRname.azurecr.io>

Снимок экрана: команда входа Docker в CLI.

Затем выполните cpa verify, чтобы просмотреть артефакты и проверить их поочередно, устраняя любые сбои. Запуститеcpa buildbundle, когда вы будете готовы упаковать и отправить CNAB в Реестр контейнеров Azure. Команда cpa buildbundle запускает процесс проверки, создает пакет и отправляет пакет в Реестр контейнеров Azure.

Bash
cpa verify

Снимок экрана: команда проверки cpa в CLI.

Bash
cpa buildbundle 

Примечание

Используйте cpa buildbundle --force только в том случае, если вы хотите перезаписать существующий тег. Если вы уже присоединили этот CNAB к предложению Azure Marketplace, увеличьте вместо этого версию в файле манифеста.

Интеграция с Azure Pipeline

Пример интеграции container-package-app с Azure Pipeline см. в примере Azure Pipeline.

Пример интеграции CNAB в Github Actions см. в примере действия Github

Устранение неполадок