Создание и подготовка приложений контейнеров Azure с помощью Bicep

Создание и подготовка приложений контейнеров Azure с помощью Bicep

1 марта 2022 г.

Используя Bicep, мы можем развертывать и управлять всеми ресурсами, необходимыми для наших приложений Azure Container. В этом посте мы напишем шаблон Bicep, который определяет всю инфраструктуру, необходимую для нашего приложения-контейнера, и развертывает его с помощью интерфейса командной строки AZ. В нашем шаблоне Bicep мы будем развертывать следующие ресурсы:


  • Рабочая область Log Analytics.

  • Реестр контейнеров Azure

  • Среда приложения контейнера Azure

  • Приложение-контейнер.

Прежде чем мы начнем, ОЧЕНЬ ВАЖНО напомнить, что Container Apps в настоящее время находится в предварительной версии! Это означает, что то, что я публикую в моем настоящем, может/изменится в вашем будущем! Одним из примеров этого является то, что пространство имен, в котором в настоящее время находятся приложения-контейнеры, изменится в марте 2022 года, как указано в этой проблеме GitHub. ) (Обратите внимание на себя, обновите эту статью!)


Создание ресурсов нашего контейнерного приложения в Bicep


Bicep — это предметно-ориентированный язык, который мы можем использовать в качестве инфраструктуры как кода (IaC), созданный Microsoft для развертывания ресурсов Azure. Код бицепса скомпилирован в шаблоны ARM, и, на мой взгляд, с ним намного приятнее работать, чем с ARM.


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


[ Расширение бицепса в коде VS] (https://res.cloudinary.com/practicaldev/image/fetch/s--TOU0M3tP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/ загрузки/статьи/5z4szkn3gmii8qa5ufnp.png)


Для работы с Bicep вам также потребуется Azure CLI версии 2.20.0 или более поздней. Посетите эту страницу для получения дополнительных сведений о настройке Bicep на вашем компьютере.


Теперь, когда у нас все настроено, мы можем начать писать наши шаблоны Bicep со всеми ресурсами, которые нам нужны для наших приложений-контейнеров.


Лог-аналитика


Приложения-контейнеры собирают данные о вашем приложении-контейнере и сохраняют их в Log Analytics. Мы можем записать в Log Analytics отдельные текстовые строки или строку сериализованных данных JSON. Для нашего приложения-контейнера нам потребуется создать рабочую область Log Analytics для отправки журналов наших приложений-контейнеров.


```javascript


@description('Имя рабочей области аналитики журналов')


строка параметра logAnalyticsName


ресурс logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {


имя: logAnalyticsName


местоположение: местоположение


характеристики: {


артикул: {


имя: 'PerGB2018'


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


Реестр контейнеров Azure


Далее нам нужно будет создать реестр контейнеров Azure. В будущих сообщениях я покажу вам, как мы можем извлекать образы из нашего реестра контейнеров и развертывать их в приложении-контейнере. А пока мы можем создать наш реестр контейнеров в Bicep следующим образом:


```javascript


@description('Имя подключенного реестра контейнеров')


строка параметра containerRegistryName


ресурс containerRegistry 'Microsoft.ContainerRegistry/registries@2021-12-01-preview' = {


имя: containerRegistryName


местоположение: местоположение


артикул: {


название: «Основной»


характеристики: {


админусеренаблед: правда


Здесь я даю своему экземпляру ACR имя с помощью параметра, развертываю его в том же месте, что и моя рабочая область Log Analytics, устанавливаю базовый номер SKU, а затем включаю пользователя-администратора.


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


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


Среда приложения контейнера Azure


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


Приложения-контейнеры в одной среде развертываются в одной виртуальной сети и записывают журналы в одну и ту же рабочую область Log Analytics.


Для нашего шаблона Bicep мы определим нашу среду приложения-контейнера и настроим ее для отправки журналов в нашу рабочую область Log Analytics, которую мы только что определили.


```javascript


@description('Имя среды контейнерного приложения')


строка параметра containerAppEnvName


ресурс containerAppEnvironment 'Microsoft.Web/kubeEnvironments@2021-03-01' = {


имя: контейнераппенвнаме


местоположение: местоположение


вид: 'контейнерная среда'


характеристики: {


Тип среды: «управляемый»


InternalLoadBalancerEnabled: false


appLogsConfiguration: {


назначение: 'лог-аналитика'


logAnalyticsConfiguration: {


идентификатор клиента: logAnalytics.properties.customerId


SharedKey: logAnalytics.listKeys().primarySharedKey


Здесь мы указываем имя для нашей среды Container Apps с параметром и развертываем ее в том же месте, что и другие наши ресурсы. Для этой среды Container Apps мы отключаем внутренний балансировщик нагрузки, так как мы не работаем с виртуальной сетью для этой среды. Мы можем установить для этого флага значение true , чтобы сделать эту среду видимой только в пределах подсети vNET, но это выходит за рамки данной статьи.


Мы установили тип среды «управляемый», поскольку это единственный поддерживаемый тип для сред контейнерных приложений. Затем мы настраиваем нашу среду для отправки журналов в Log Analytics с помощью блока logAnalyticsConfiguration. Здесь мы используем `customerId и primarySharedKey, к которым мы можем получить доступ как к выходным данным нашего ресурса logAnalytics.


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


Контейнерное приложение


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


```javascript


@description('Имя приложения-контейнера TodoApi')


строка параметра todoApiContainerName


ресурс todoApiContainerApp 'Microsoft.Web/containerApps@2021-03-01' = {


имя: todoApiContainerName


местоположение: местоположение


характеристики: {


kubeEnvironmentId: containerAppEnvironment.id


конфигурация: {


вход: {


внешний: правда


целевой порт: 80


разрешить небезопасный: ложь


трафик: [


последняя редакция: правда


вес: 100


реестры: [


сервер: containerRegistry.name


имя пользователя: containerRegistry.properties.loginServer


passwordSecretRef: 'контейнер-реестр-пароль'


секреты: [


имя: 'контейнер-реестр-пароль'


значение: containerRegistry.listCredentials().passwords[0].value


шаблон: {


контейнеры: [


имя: todoApiContainerName


изображение: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'


Ресурсы: {


процессор: «0,5»


память: '1Gi'


шкала: {


минРеплики: 1


максимальное количество реплик: 1


Здесь происходит довольно много, поэтому давайте немного разберем это:


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

  • Затем мы переходим к свойствам нашего приложения-контейнера. Нам нужно предоставить идентификатор ресурса kubeEnvironment приложения-контейнера, чтобы сообщить нашему коду Bicep, что это приложение-контейнер принадлежит нашей среде приложения-контейнера. Мы делаем это, обращаясь к идентификатору как выходу нашего ресурса containerAppEnvironment.

  • В нашем блоке конфигурации мы разрешаем внешний вход и устанавливаем наш целевой порт для этого контейнера на порт 80. Мы запрещаем небезопасный трафик и устанавливаем уровень трафика нашей последней версии на 100%. Если у нас есть несколько версий, мы разделяем трафик между нашими версиями. Так как мы работаем только с одной ревизией, весь трафик будем направлять туда.

  • Далее мы определяем реестр, из которого наше приложение-контейнер будет извлекать изображения. Мы делаем это, предоставляя имя сервера и имя пользователя в качестве выходных данных из нашего блока ресурсов containerRegistry, который мы определили ранее. Затем мы предоставляем ссылку на имя секрета, который мы будем использовать для хранения пароля для входа в наш Реестр контейнеров Azure.

  • Затем мы определяем блок secret, который создаст наш секрет со значением, содержащим пароль, необходимый для доступа к нашему Реестру контейнеров Azure. Опять же, мы используем выходные данные нашего `containerRegistry, чтобы получить этот пароль.

  • В нашем блоке шаблона мы определяем контейнер, который мы развернем в нашем приложении-контейнере. В моем массиве container я использую то же имя, что и мое приложение-контейнер для своего изображения, используя простое изображение hello-world, которое предоставила Microsoft, и устанавливаю ресурсы ЦП и памяти (вы можете прочитать, как настроить свои контейнеры в Приложения-контейнеры здесь). В моем блоке scale я просто устанавливаю минимальное и максимальное количество реплик равными 1, но на момент написания мы могли бы установить максимум до 25 реплик.

Дополнительные сведения о том, что мы можем определить в шаблоне Container Apps Bicep, см. в руководстве по шаблонам здесь.


Развертывание нашего шаблона бицепса


Наш полный шаблон Bicep должен выглядеть следующим образом (я переместил элементы, чтобы немного привести его в порядок, так что не стесняйтесь копировать и вставлять это, если хотите, или исправьте свой шаблон, чтобы он выглядел похоже):


```javascript


@description('Имя рабочей области аналитики журналов')


строка параметра logAnalyticsName


@description('Имя подключенного реестра контейнеров')


строка параметра containerRegistryName


@description('Имя среды контейнерного приложения')


строка параметра containerAppEnvName


@description('Имя приложения-контейнера TodoApi')


строка параметра todoApiContainerName


строка местоположения параметра = resourceGroup().location


ресурс logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {


имя: logAnalyticsName


местоположение: местоположение


характеристики: {


артикул: {


имя: 'PerGB2018'


ресурс containerRegistry 'Microsoft.ContainerRegistry/registries@2021-12-01-preview' = {


имя: containerRegistryName


местоположение: местоположение


артикул: {


название: «Основной»


характеристики: {


админусеренаблед: правда


ресурс containerAppEnvironment 'Microsoft.Web/kubeEnvironments@2021-03-01' = {


имя: контейнераппенвнаме


местоположение: местоположение


вид: 'контейнерная среда'


характеристики: {


Тип среды: «управляемый»


InternalLoadBalancerEnabled: false


appLogsConfiguration: {


назначение: 'лог-аналитика'


logAnalyticsConfiguration: {


идентификатор клиента: logAnalytics.properties.customerId


SharedKey: logAnalytics.listKeys().primarySharedKey


ресурс todoApiContainerApp 'Microsoft.Web/containerApps@2021-03-01' = {


имя: todoApiContainerName


местоположение: местоположение


характеристики: {


kubeEnvironmentId: containerAppEnvironment.id


конфигурация: {


вход: {


внешний: правда


целевой порт: 80


разрешить небезопасный: ложь


трафик: [


последняя редакция: правда


вес: 100


реестры: [


сервер: containerRegistry.name


имя пользователя: containerRegistry.properties.loginServer


passwordSecretRef: 'контейнер-реестр-пароль'


секреты: [


имя: 'контейнер-реестр-пароль'


значение: containerRegistry.listCredentials().passwords[0].value


шаблон: {


контейнеры: [


имя: todoApiContainerName


изображение: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'


Ресурсы: {


процессор: «0,5»


память: '1Gi'


шкала: {


минРеплики: 1


максимальное количество реплик: 1


Нам также потребуется предоставить файл параметров для сопровождения нашего шаблона Bicep. Как и ARM, это всего лишь файл JSON. Мы могли бы предоставить параметры через интерфейс командной строки AZ, но в будущих сообщениях я хочу развернуть свой шаблон Bicep через GitHub Actions, поэтому мы начнем с файла параметров.


Наш файл параметров будет выглядеть так (вам нужно указать свои значения):


```javascript


"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",


"Версия контента": "1.0.0.0",


"параметры": {


"logAnalyticsName": {


"value": ""


"containerAppEnvName": {


"value": "<имя-контейнера-среды>"


"todoApiContainerName": {


"value": "<имя-контейнера-приложения>"


"имя реестра контейнера": {


"value": "<имя-реестра-контейнера>"


Теперь мы можем развернуть наш шаблон Bicep. Как вы можете видеть в шаблоне Bicep, я установил параметр «местоположение» в качестве местоположения группы ресурсов, в которой мы будем развертывать ресурсы нашего приложения-контейнера.


На момент написания статьи приложения-контейнеры можно было подготовить только в следующих средах:


  • Восток США

  • Северная Европа

  • Центральная Канада

  • Восток США 2

  • Западная Европа

Имея это в виду, мы создадим группу ресурсов, в которой будем развертывать наши ресурсы, выполнив следующую команду AZ CLI.


```javascript


az group create --name <имя-вашей-группы-ресурсов> --location <одно-из-вышеуказанных-местоположений>


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


```javascript


группа развертывания az create --resource-group <имя-вашей-группы-ресурсов> --template-file <ваш-бицепс-файл>.bicep --parameters --<ваш-файл-параметров>.json


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


Наше завершенное развертывание


Нажмите Перейти к группе ресурсов , и мы должны увидеть, что все ресурсы, которые мы определили в нашем шаблоне Bicep, были развернуты в Azure!


Наша развернутая группа ресурсов


Давайте посмотрим, как поживает наше приложение-контейнер! Нажмите на свой ресурс приложения-контейнера, и вы должны увидеть URL-адрес приложения (поскольку мы включили внешний вход в наше приложение-контейнер). Перейдите к нему, и вы должны увидеть следующую веб-страницу:


Наше развернутое приложение-контейнер


Потрясающий! Мы только что развернули приложение-контейнер Azure в среде приложения-контейнера, которое отправляет журналы в нашу рабочую область Log Analytics и может извлекать изображения из нашего реестра контейнеров Azure всего в одном файле Bicep! Молодец! 👏👏


Подведение итогов


Как видите, мы можем управлять и развертывать наши контейнерные приложения с помощью Bicep! По мере роста этого замечательного продукта будут выпущены дополнительные функции, что означает, что мы можем расширить наш шаблон Bicep ( [на ум приходит интеграция с vNet] (https://techcommunity.microsoft.com/t5/apps-on-azure-blog/ azure-container-apps-virtual-network-integration/ba-p/3096932))


Если вам нужна ссылка на код, который мы написали в этом посте, вы можете сделать это в этом репозиторий GitHub.


В следующем посте мы будем развертывать наш шаблон Bicep с помощью действий GitHub, а не запускать команды AZ CLI на нашем локальном компьютере каждый раз, когда мы хотим развернуть наши приложения-контейнеры.


Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне в Twitter @willvelida


До следующего раза, счастливого кодирования! 🤓🖥️



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE