Compartilhar via

快速入门:使用 Azure CLI 将 Dapr 应用程序部署到Azure Container Apps

Dapr (Distributed Application Runtime) 可帮助开发人员构建可复原的可靠微服务。 本快速入门介绍如何使 Dapr sidecars 与微服务容器应用一起运行。 你将:

  • 为容器应用创建容器应用环境和Azure博客Storage状态存储。
  • 部署发布消息的 Python 容器应用。
  • 部署订阅消息并将消息保存在状态存储中的 Node.js 容器应用。
  • 使用Azure portal验证两个微服务之间的交互。

 Dapr Hello World 微服务架构图在 Azure Container Apps 上

此快速入门复制了在开源 Dapr Hello World 快速入门中部署的应用程序。

先决条件

安装

若要从 CLI 登录到Azure,请运行以下命令,并按照提示完成身份验证过程。

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

为了确保运行最新版本的 CLI,请运行升级命令。

az upgrade

接下来,安装或更新 CLI 的 Azure Container Apps 扩展。

如果在 PowerShell 中的 az containerapp 模块中运行 Azure CLI 或 cmdlet 中的 Az.App 命令时收到有关缺少参数的错误,请确保安装了最新版本的 Azure Container Apps 扩展。

az extension add --name containerapp --upgrade

注意事项

从 2024 年 5 月开始,Azure CLI扩展默认不再启用预览功能。 若要访问容器应用程序的预览功能,请使用 --allow-preview true 安装容器应用程序扩展。

az extension add --name containerapp --upgrade --allow-preview true

现在已安装当前扩展或模块,接下来请注册 Microsoft.AppMicrosoft.OperationalInsights 命名空间。

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

设置环境变量。

设置以下环境变量。 将 <placeholders> 替换为你自己的值。

RESOURCE_GROUP="<new-resource-group>"
LOCATION="<location>"
CONTAINERAPPS_ENVIRONMENT="<containerapps-environment>"

创建Azure资源组

创建一个资源组来组织与你的容器应用部署相关的服务。

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

创建环境

Azure Container Apps中的环境围绕一组容器应用创建安全边界。 部署到同一环境的容器应用部署在同一容器网络中,并将日志写入同一日志分析工作区。

若要创建环境,请运行以下命令:

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

设置状态存储

创建Azure Blob Storage帐户

部署环境后,部署 Node.js 容器应用用于存储数据的Azure Blob Storage帐户。 在部署服务之前,请选择存储帐户的名称。

Storage 帐户名称必须在 Azure 中是唯一的,长度为 3 到 24 个字符,且仅包含数字和小写字母。

STORAGE_ACCOUNT_NAME="<storage-account-name>"

使用以下命令创建Azure Storage帐户。

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

为节点应用配置用户分配的标识

虽然容器应用同时支持用户分配的托管标识和系统分配的托管标识,但用户分配的标识为启用了Dapr功能的Node.js应用提供了访问Blob存储帐户的权限。

  1. 创建用户分配的标识。

    az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json
    
  2. 检索 principalIdid 属性并将其存储在变量中。

    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 \")
    
  3. 检索当前订阅的订阅 ID。

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    
  4. 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 存储。

  1. 在文本编辑器中,创建名为 statestore.yaml 的文件,该文件拥有你在前面的步骤中提供的属性。 将 <placeholders> 替换为你自己的值。

    # 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 应用访问状态存储。

  2. 导航到存储了 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 Container Registry,请在命令中包含 --registry-server <registry-name>.azurecr.cn 标志。

默认情况下,从 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 Container Registry,请在命令中包含 --registry-server <registry-name>.azurecr.cn 标志。

验证结果

确认状态是否成功持久化

可以通过查看Azure Storage帐户中的数据来确认服务正常工作。

  1. 在浏览器中打开 Azure portal,并导航到storage帐户。

  2. 在边栏菜单中选择Data Storage>Containers

  3. 选择容器应用程序。

  4. 验证是否可以在容器中看到名为 order 的文件。

  5. 选择文件。

  6. 选择“编辑”选项卡。

  7. 选择“刷新”按钮以观察数据自动更新的方式。

查看日志

容器应用中的日志存储在 Log Analytics 工作区的 ContainerAppConsoleLogs_CL 自定义表中。 可以通过Azure portal或通过 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 Container Apps 存储库中创建议题,让我们在 GitHub 上知晓。

后续步骤