你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

部署 Dapr 可插入组件

Distributed Application Runtime (Dapr) 是一种可移植的无服务器事件驱动运行时,可简化生成分散式应用程序的过程。 Dapr 让你能够构建有状态或无状态应用程序,而无需担心构建块的功能。 Dapr 提供多个构建基块:发布/订阅、状态管理、服务调用、参与者等。

Azure IoT 操作支持其中两个构建基块,它们由 MQTT 代理提供支持:

  • 发布和订阅
  • 状态管理

若要使用 Dapr 可插入组件,请为每个 API 定义组件规范,然后注册到群集。 Dapr 组件会侦听放置在共享卷上的 Unix 域套接字。 Dapr 运行时与每个套接字连接,并从该组件实施的给定构建块 API 中发现所有服务。

安装 Dapr 运行时

要安装 Dapr 运行时,请使用以下 Helm 命令:

注意

如果已完成提供的 Azure IoT 操作快速入门,那么你已经安装了 Dapr 运行时,并且不需要执行以下步骤。

helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update
helm upgrade --install dapr dapr/dapr --version=1.14 --namespace dapr-system --create-namespace --wait

注册 MQTT 代理可插入组件

若要注册“发布/订阅”和“状态管理”可插入组件,请创建组件清单 yaml,并将其应用到群集。

若要创建 yaml 文件,请使用以下组件定义:

组件 说明
metadata:name 组件名称很重要,它是 Dapr 应用程序引用组件的方式。
metadata:annotations:dapr.io/component-container Dapr sidecar 注入器使用的组件注释,定义了映像位置、卷装载和日志记录配置
spec:type 组件的类型,需要完全按照所示方式进行声明
spec:metadata:keyPrefix 定义在与状态存储后端通信时使用的键前缀。 有关详细信息,请参阅 Dapr 文档
spec:metadata:hostname MQTT 代理主机名。 默认为 aio-broker
spec:metadata:tcpPort MQTT 代理端口号。 默认为 18883
spec:metadata:useTls 定义 MQTT 代理是否使用 TLS。 默认为 true
spec:metadata:caFile 用于验证 MQTT 代理的证书链路径。 如果 useTlstrue,则是必需的。 此文件必须装载到具有指定卷名称的 Pod 中
spec:metadata:satAuthFile 服务帐户令牌 (SAT) 文件用于通过 MQTT 代理对 Dapr 组件进行身份验证。 此文件必须装载到具有指定卷名称的 Pod 中
  1. 将以下包含 Azure IoT 操作组件定义的 yaml 保存到名为 components.yaml 的文件中:

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: iotoperations-pubsub
      namespace: azure-iot-operations
      annotations:
        dapr.io/component-container: >
          {
            "name": "iot-operations-dapr-components",
            "image": "ghcr.io/azure/iot-operations-dapr-components:latest",
            "volumeMounts": [
              { "name": "mqtt-client-token", "mountPath": "/var/run/secrets/tokens" },
              { "name": "aio-ca-trust-bundle", "mountPath": "/var/run/certs/aio-internal-ca-cert" }
            ],
            "env": [
                { "name": "pubSubLogLevel", "value": "Information" },
                { "name": "stateStoreLogLevel", "value": "Information" },
                { "name": "defaultLogLevel", "value": "Warning" }
            ]
          }
    spec:
      type: pubsub.azure.iotoperations
      version: v1
      metadata:
      - name: hostname
        value: aio-broker
      - name: tcpPort
        value: 18883
      - name: useTls
        value: true
      - name: caFile
        value: /var/run/certs/aio-internal-ca-cert/ca.crt
      - name: satAuthFile
        value: /var/run/secrets/tokens/mqtt-client-token
    ---
    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: iotoperations-statestore
      namespace: azure-iot-operations
    spec:
      type: state.azure.iotoperations
      version: v1
      metadata:
      - name: hostname
        value: aio-broker
      - name: tcpPort
        value: 18883
      - name: useTls
        value: true
      - name: caFile
        value: /var/run/certs/aio-internal-ca-cert/ca.crt
      - name: satAuthFile
        value: /var/run/secrets/tokens/mqtt-client-token    
    
  2. 通过运行以下命令将组件应用到群集:

    kubectl apply -f components.yaml
    

    验证以下输出:

    component.dapr.io/iotoperations-pubsub created
    component.dapr.io/iotoperations-statestore created
    

为 MQTT 代理创建授权策略

若要为 MQTT 代理配置授权策略,首先需要创建 BrokerAuthorization 资源。

注意

如果未在此群集上启用代理授权,那么可跳过此部分,因为应用程序将有权访问所有 MQTT 主题,包括访问 MQTT 代理状态存储所需的主题。

  1. 将下面包含 BrokerAuthorization 定义的 yaml 保存到名为 aio-dapr-authz.yaml 的文件中:

    apiVersion: mqttbroker.iotoperations.azure.com/v1
    kind: BrokerAuthorization
    metadata:
      name: my-dapr-authz-policies
      namespace: azure-iot-operations
    spec:
      listenerRef:
        - my-listener # change to match your listener name as needed
      authorizationPolicies:
        enableCache: false
        rules:
          - principals:
              attributes:
                - group: dapr-workload # match to the attribute annotated to the service account
            brokerResources:
              - method: Connect
              - method: Publish
                topics:
                  - "$services/statestore/#"
              - method: Subscribe
                topics:
                  - "clients/{principal.clientId}/services/statestore/#"
    
  2. 将 BrokerAuthorization 定义应用于群集:

    kubectl apply -f aio-dapr-authz.yaml
    

后续步骤

将 Dapr 组件部署到群集后,可以使用 Dapr 开发分布式应用程序