Azure 容器应用中的 Dapr 组件

Dapr 使用模块化设计,将功能作为组件交付。 可以选择使用 Dapr 组件,这完全取决于应用程序的需求。

容器应用中的 Dapr 组件为环境级别资源:

  • 可以提供可插入的抽象模型,用于连接到支持的外部服务。
  • 可以跨容器应用共享,也可以将范围限定在特定的容器应用之间。
  • 可以使用 Dapr 机密安全地检索配置元数据。

本指南介绍如何为 Azure 容器应用程序服务配置 Dapr 组件。

组件架构

在 Dapr 开放源代码项目中,所有组件都符合以下基本架构

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: [COMPONENT-NAME]
  namespace: [COMPONENT-NAMESPACE]
spec:
  type: [COMPONENT-TYPE]
  version: v1
  initTimeout: [TIMEOUT-DURATION]
  ignoreErrors: [BOOLEAN]
  metadata:
    - name: [METADATA-NAME]
      value: [METADATA-VALUE]

在 Azure 容器应用中,上述架构已稍作简化,以支持 Dapr 组件并删除不必要的字段,其中包括 apiVersionkind 以及冗余元数据和规范属性。

componentType: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
  - name: [METADATA-NAME]
    value: [METADATA-VALUE]

组件范围

默认情况下,同一环境中所有已启用 Dapr 的容器应用都将加载完整的一组已部署组件。 为了确保只有适当的容器应用在运行时加载组件,应使用应用程序范围。 在以下示例中,组件将仅由具有 Dapr 应用程序 ID APP-ID-1APP-ID-2 的两个已启用 Dapr 的容器应用加载:

componentType: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
  - name: [METADATA-NAME]
    value: [METADATA-VALUE]
scopes:
  - [APP-ID-1]
  - [APP-ID-2]

注意

Dapr 组件范围对应于容器应用的 Dapr 应用程序 ID,而不是容器应用名称。

通过 Dapr 连接到外部服务

容器应用中支持几种方法,用于安全地与 Dapr 组件的外部服务建立连接。

  1. 使用托管标识
  2. 通过创建以下任一项来使用 Dapr 机密存储组件引用:

使用托管标识

对于 Azure 托管的服务,Dapr 可以使用限定范围的容器应用的托管标识,向后端服务提供程序进行身份验证。 使用托管标识时,无需在组件清单中包含机密信息。 首选使用托管标识,因为托管标识不存储组件中的敏感输入,并且不需要管理机密存储。

注意

azureClientId 元数据字段(托管标识的客户端 ID)对于使用用户分配的托管标识进行身份验证的任何组件都是必需的。

使用 Dapr 机密存储组件引用

为未启用 Entra ID 的服务创建 Dapr 组件时,某些元数据字段需要输入敏感值。 建议检索这些机密的方法是:引用可安全访问机密信息的现有 Dapr 机密存储组件。

若要设置引用,请执行以下操作:

  1. 使用 Azure 容器应用架构创建 Dapr 机密存储组件。 所有支持的 Dapr 机密存储的组件类型都以 secretstores. 开头。
  2. 创建引用 Dapr 机密存储组件的额外组件(根据需要)来检索敏感元数据输入。

创建 Dapr 机密存储组件

在 Azure 容器应用中创建机密存储组件时,可以通过以下任一方式在元数据部分中提供敏感信息:

Azure Key Vault 机密存储

以下组件展示了使用 Azure Key Vault 机密存储的最简单的机密存储配置。 在此示例中,发布服务器和订阅服务器应用程序配置为具有系统或用户分配的托管标识,该标识对 Azure 密钥保管库实例具有适当的权限。

componentType: secretstores.azure.keyvault
version: v1
metadata:
  - name: vaultName
    value: [your_keyvault_name]
  - name: azureEnvironment
    value: "AZUREPUBLICCLOUD"
  - name: azureClientId # Only required for authenticating user-assigned managed identity
    value: [your_managed_identity_client_id]
scopes:
  - publisher-app
  - subscriber-app
平台管理的 Kubernetes 机密

Azure 容器应用中不支持 Kubernetes 机密、本地环境变量和本地文件 Dapr 机密存储。 作为上游 Dapr 默认 Kubernetes 机密存储的替代方法,Azure 容器应用提供了一种平台管理方法,用于创建和利用 Kubernetes 机密。

此组件配置将敏感值定义为可从元数据部分引用的机密参数。 此方法可用于连接到非 Azure 服务,或在开发/测试场景中,用于通过 CLI 快速部署组件,而无需设置机密存储或托管标识。

componentType: secretstores.azure.keyvault
version: v1
metadata:
  - name: vaultName
    value: [your_keyvault_name]
  - name: azureEnvironment
    value: "AZUREPUBLICCLOUD"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
secrets:
  - name: azClientSecret
    value: "[your_client_secret]"
scopes:
  - publisher-app
  - subscriber-app

引用 Dapr 机密存储组件

使用前面的方法之一创建 Dapr 机密存储后,可以从同一环境中的其他 Dapr 组件引用该机密存储。 以下示例演示如何使用 Entra ID 身份验证。

componentType: pubsub.azure.servicebus.queue
version: v1
secretStoreComponent: "[your_secret_store_name]"
metadata:
  - name: namespaceName
    # Required when using Azure Authentication.
    # Must be a fully-qualified domain name
    value: "[your_servicebus_namespace.servicebus.chinacloudapi.cn]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
scopes:
  - publisher-app
  - subscriber-app

组件示例

若要通过容器应用 CLI 创建 Dapr 组件,可以使用容器应用 YAML 清单。 配置多个组件时,必须为每个组件创建并应用单独的 YAML 文件。

az containerapp env dapr-component set --name ENVIRONMENT_NAME --resource-group RESOURCE_GROUP_NAME --dapr-component-name pubsub --yaml "./pubsub.yaml"
# pubsub.yaml for Azure Service Bus component
componentType: pubsub.azure.servicebus.queue
version: v1
secretStoreComponent: "my-secret-store"
metadata:
  - name: namespaceName
    # Required when using Azure Authentication.
    # Must be a fully-qualified domain name
    value: "[your_servicebus_namespace.servicebus.chinacloudapi.cn]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId 
    value: "[your_client_id]"
  - name: azureClientSecret
    secretRef: azClientSecret
scopes:
  - publisher-app
  - subscriber-app

后续步骤

了解如何设置 Dapr 组件复原能力