你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:使用 Azure CLI 将 Dapr 应用程序部署到 Azure 容器应用
Dapr (Distributed Application Runtime) 可帮助开发人员构建可复原的可靠微服务。 本快速入门介绍如何使 Dapr sidecars 与微服务容器应用一起运行。 你将:
- 为容器应用创建容器应用环境和 Azure Blob 存储状态存储。
- 部署发布消息的 Python 容器应用。
- 部署订阅消息并将消息保存在状态存储中的 Node.js 容器应用。
- 使用 Azure 门户验证两个微服务之间的交互情况。
本快速入门反映了你在开源 Dapr Hello World 快速入门中部署的应用程序。
安装
若要从 CLI 登录到 Azure,请运行以下命令,然后按照提示完成身份验证过程。
az login
为了确保运行最新版本的 CLI,请运行升级命令。
az upgrade
接下来,安装或更新适用于 CLI 的 Azure 容器应用扩展。
如果在 Azure CLI 中运行 az containerapp
命令,或在 Azure PowerShell 中运行 Az.App
模块中的 cmdlet 时收到有关缺少参数的错误,请确保已安装最新版本的 Azure 容器应用扩展。
az extension add --name containerapp --upgrade
注意
从 2024 年 5 月开始,Azure CLI 扩展不再默认启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true
安装容器应用扩展。
az extension add --name containerapp --upgrade --allow-preview true
现在已安装当前扩展或模块,接下来请注册 Microsoft.App
和 Microsoft.OperationalInsights
命名空间。
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
设置环境变量。
设置以下环境变量。 将 <PLACEHOLDERS>
替换为你自己的值:
RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"
创建 Azure 资源组
创建一个资源组来组织与你的容器应用部署相关的服务。
az group create \
--name $RESOURCE_GROUP \
--location "$LOCATION"
创建环境
Azure 容器应用中的环境围绕一组容器应用创建安全边界。 部署到相同环境的容器应用部署在同一虚拟网络中,并将日志写入同一个 Log Analytics 工作区。
若要创建环境,请运行以下命令:
az containerapp env create \
--name $CONTAINERAPPS_ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location "$LOCATION"
设置状态存储
创建 Azure Blob 存储帐户
部署环境后,部署 Node.js 容器应用用来存储数据的 Azure Blob 存储帐户。 在部署服务之前,为存储帐户选择一个名称。 存储帐户名称在 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 的 Node.js 应用提供访问 Blob 存储帐户的权限。
创建用户分配的标识。
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json
检索
principalId
和id
属性并将其存储在变量中。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 \")
检索当前订阅的订阅 ID。
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
将
Storage Blob Data Contributor
角色分配给用户分配的标识。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 向外部资源进行身份验证。 此示例使用基于 Azure 的状态存储,因此可以提供使用托管标识从 Node.js 应用直接访问 Blob 存储的权限。
在文本编辑器中,创建名为 statestore.yaml 的文件,该文件拥有你在前面的步骤中提供的属性。
# 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
此文件可帮助 Dapr 应用访问状态存储。
导航到存储了 yaml 文件的目录,运行以下命令,以在容器应用环境中配置 Dapr 组件。
az containerapp env dapr-component set \ --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \ --dapr-component-name statestore \ --yaml statestore.yaml
部署 Node.js 应用程序
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'
如果使用 Azure 容器注册表,则在命令中包含 --registry-server <REGISTRY_NAME>.azurecr.io
标志。
默认情况下,将从 Docker Hub 拉取映像。
部署 Python 应用程序
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 容器注册表,则在命令中包含 --registry-server <REGISTRY_NAME>.azurecr.io
标志。
验证结果
确认状态持久性是否成功
可以通过查看 Azure 存储帐户中的数据来确认服务是否正常工作。
在浏览器中打开 Azure 门户并导航到存储帐户。
在左侧菜单中选择“数据存储”>“容器”。
选择容器容器。
验证是否可以在容器中看到名为
order
的文件。选择文件。
选择“编辑”选项卡。
选择“刷新”按钮以观察数据自动更新的方式。
查看日志
容器应用中的日志存储在 Log Analytics 工作区的 ContainerAppConsoleLogs_CL
自定义表中。 可通过 Azure 门户或 CLI 查看日志。 表出现在工作区中时,一开始可能会有小的延迟。
通过命令行使用以下 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
清理资源
由于 pythonapp
通过持久保存在配置的状态存储中的消息持续调用 nodeapp
,因此请务必完成这些清理步骤,以免计费操作持续进行。
如果要删除在本演练过程中创建的资源,请运行以下命令。
注意
此命令删除指定的资源组及其包含的所有资源。 如果指定的资源组中存在本教程范围外的资源,这些资源也会被删除。
az group delete --resource-group $RESOURCE_GROUP
提示
遇到问题? 在 Azure 容器应用存储库中提交问题,告知我们有关 GitHub 的信息。