Учебник. Развертывание приложения Dapr в Контейнерах приложений Azure с помощью Azure CLI.

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

Узнайте следующие темы:

  • создание среды Контейнеров приложений для приложений-контейнеров;
  • создание хранилища состояний в Хранилище BLOB-объектов Azure для приложения-контейнера;
  • развертывание двух приложений, которые создают и используют сообщения, а также сохраняют их в хранилище состояний;
  • проверка взаимодействия между двумя микрослужбами.

С помощью приложений контейнеров Azure вы получаете полностью управляемую версию API Dapr при создании микрослужб. При использовании Dapr в Контейнерах приложений Azure вы можете включать расширения рядом с микрослужбами, что предоставляет широкий набор возможностей. Доступны следующие API Dapr: вызовы между службами, публикация и подписка, привязки событий, хранилища состояний и субъекты.

В этом учебнике описано, как развернуть те же приложения, что и в кратком руководстве по приложению Dapr Hello World.

Это приложение состоит из следующих компонентов:

  • клиентское контейнерное приложение (Python) для создания сообщений;
  • контейнерное приложение службы (Node) для получения и сохранения этих сообщений в хранилище состояний.

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

Схема архитектуры микрослужб Dapr Hello World в приложениях контейнеров Azure

Настройка

Чтобы войти в Azure из ИНТЕРФЕЙСА командной строки, выполните следующую команду и следуйте инструкциям, чтобы завершить процесс проверки подлинности.

az login

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

az upgrade

Затем установите или обновите расширение "Приложения контейнеров Azure" для интерфейса командной строки.

az extension add --name containerapp --upgrade

Теперь, когда установлено текущее расширение или модуль, зарегистрируйте Microsoft.App пространства имен и Microsoft.OperationalInsights пространств имен.

Примечание.

Ресурсы Контейнеров приложений Azure перенесены из пространства имен Microsoft.Web в пространство имен Microsoft.App. Дополнительные сведения см. в статье о миграции пространства имен из Microsoft.Web в Microsoft.App в марте 2022 г..

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Настройка переменных среды

Задайте следующие переменные среды. Замените <ЗАПОЛНИТЕЛИ вашими значениями> :

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

создание группы ресурсов Azure;

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

az group create \
  --name $RESOURCE_GROUP \
  --location "$LOCATION"

Создать среду

Среда в Azure Container Apps создает безопасную границу вокруг группы приложений-контейнеров. Развертываемые в одной среде приложения-контейнеры развертываются в одной виртуальной сети и записывают журналы в одну рабочую область Log Analytics.

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

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

Настройка хранилища состояний

Создание учетной записи хранения BLOB-объектов Azure

При развертывании среды следующим шагом является развертывание учетной записи Хранилище BLOB-объектов Azure, используемой одной из микрослужб для хранения данных. Перед развертыванием службы необходимо выбрать имя учетной записи хранения. Имена учетных записей хранения должны быть уникальными в Azure, содержать от 3 до 24 символов и состоять только из цифр и строчных букв.

STORAGE_ACCOUNT_NAME="<storage account name>"

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

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

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

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

  1. Создайте удостоверение, назначаемое пользователем.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

Извлеките и id сохраните свойства и сохраните principalId их в переменных.

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Storage Blob Data Contributor Назначение роли назначенному пользователем удостоверению

Получите идентификатор подписки для текущей подписки.

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

Настройка компонента хранилища состояний

Существует несколько способов проверки подлинности внешних ресурсов с помощью Dapr. В этом примере не используется API секретов Dapr во время выполнения, но используется хранилище состояний на основе Azure. Таким образом, можно забыли создать компонент хранилища секретов и вместо этого предоставить прямой доступ из приложения узла в хранилище BLOB-объектов с помощью управляемого удостоверения. Если вы хотите использовать хранилище состояний, отличное от Azure, или API секретов Dapr во время выполнения, можно создать компонент хранилища секретов. Этот компонент загружает секреты среды выполнения, чтобы можно было ссылаться на них во время выполнения.

Откройте текстовый редактор и создайте файл конфигурации с именем statestore.yaml со свойствами, полученными из предыдущих шагов. Этот файл позволяет приложению Dapr получить доступ к хранилищу состояний. В следующем примере показано, как должен выглядеть файл statestore.yaml, настроенный для учетной записи Хранилища BLOB-объектов Azure:

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

Чтобы использовать этот файл, обновите заполнители:

  • Замените <STORAGE_ACCOUNT_NAME> значением переменной STORAGE_ACCOUNT_NAME, которую вы определили. Чтобы получить это значение, выполните следующую команду:
echo $STORAGE_ACCOUNT_NAME
  • Замените <MANAGED_IDENTITY_CLIENT_ID> значением переменной CLIENT_ID, которую вы определили. Чтобы получить это значение, выполните следующую команду:
echo $CLIENT_ID

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

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

Развертывание приложения-службы (веб-сервер HTTP)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

По умолчанию образ извлекается из Docker Hub.

Развертывание клиентского приложения (удаленно управляемый клиент)

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

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

Проверка результатов

Проверка успешного сохранения состояния

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

  1. Откройте портал Azure в браузере и перейдите к нужной учетной записи хранения.

  2. Слева выберите меню Контейнеры.

  3. Выберите mycontainer.

  4. Убедитесь, что в этом контейнере отображается файл с именем order.

  5. Выберите файл .

  6. Щелкните вкладку Изменить.

  7. Нажмите кнопку Обновить, чтобы понаблюдать, как данные обновляются автоматически.

Просмотр журналов

Журналы из приложений-контейнеров хранятся в пользовательской ContainerAppConsoleLogs_CL таблице в рабочей области Log Analytics. Журналы можно просматривать через портал Azure или с помощью интерфейса командной строки. Сначала в рабочей области может возникнуть небольшая задержка.

Используйте следующую команду CLI для просмотра журналов с помощью командной строки.

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

В выходных данных ниже показан тип ответа, который следует ожидать от команды CLI.

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

Очистка ресурсов

Поздравляем! Вы завершили работу с этим учебником. Если вы хотите удалить ресурсы, созданные в рамках этого пошагового руководства, выполните следующую команду.

Внимание

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

az group delete --resource-group $RESOURCE_GROUP

Примечание.

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

Совет

Возникли проблемы? Сообщите о них в репозитории Azure Container Apps на GitHub.

Следующие шаги