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

配置 MQTT 数据流终结点

重要

Azure Arc 启用的 Azure IoT 操作预览版目前处于预览状态。 不应在生产环境中使用此预览版软件。

在正式版推出后,你需要部署新的 Azure IoT 操作安装。 无法升级预览版安装。

有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

MQTT 数据流终结点用于 MQTT 源和目标。 你可以配置终结点设置、传输层安全性 (TLS)、身份验证和其他设置。

先决条件

Azure IoT 操作的本地 MQTT 代理

Azure IoT 操作提供可用于数据流的内置本地 MQTT 代理。 可以使用 MQTT 代理作为从其他系统接收消息的源,或作为向其他系统发送消息的目标。

默认终结点

部署 Azure IoT 操作时,会使用默认设置创建名为“默认”的 MQTT 代理数据流终结点。 可以将终结点用作数据流的源或目标。

重要

默认终结点必须始终用作每个数据流中的源或目标。 若要了解详细信息,请参阅数据流必须使用本地 MQTT 代理终结点

默认终结点使用以下设置:

注意

请勿删除默认终结点。 如果删除默认终结点,则必须使用相同的设置重新创建它。

若要查看或编辑默认 MQTT 代理终结点设置,请执行以下操作:

  1. 操作体验中,选择“数据流终结点”。

  2. 选择“默认”终结点以查看或编辑设置。

    使用操作体验来查看默认 MQTT 数据流终结点的屏幕截图。

创建新的终结点

还可以使用自定义设置创建新的本地 MQTT 代理终结点。 例如,可以使用其他端口、身份验证或授权设置创建新的 MQTT 代理终结点。 但是,即使创建新的终结点,也仍然必须始终使用默认终结点作为每个数据流中的源或目标。

  1. 操作体验中,选择“数据流终结点”。

  2. 在“创建新的数据流终结点”下,选择“Azure IoT 操作本地 MQTT”>“新建”。

    使用操作体验创建新的本地 MQTT 数据流终结点的屏幕截图。

    输入以下用于终结点的设置:

    设置 说明
    Name 数据流终结点的名称。
    主机 MQTT 代理的主机名和端口。 使用格式 <hostname>:<port>
    身份验证方法 用于身份验证的方法。 选择“服务帐户令牌”或“X509 证书”
    服务受众 服务帐户令牌的受众。 如果使用的是服务帐户令牌,则为必需。
    X509 客户端证书 用于身份验证的 X.509 客户端证书。 如果使用 X509 证书,则是必需的。
    X509 客户端密钥 对应于 X.509 客户端证书的私钥。 如果使用 X509 证书,则是必需的。
    X509 中间证书 X.509 客户端证书链的中间证书。 如果使用 X509 证书,则是必需的。

Azure 事件网格

Azure 事件网格提供完全托管的 MQTT 代理,可与 Azure IoT 操作数据流搭配使用。 若要配置 Azure 事件网格 MQTT 代理终结点,建议使用托管标识进行身份验证。

配置事件网格命名空间

如果尚未配置,请先创建事件网格命名空间

启用 MQTT

创建事件网格命名空间后,转到“配置”,并检查以下内容:

  • 启用 MQTT:选中该复选框
  • 每个身份验证名称的最大客户端会话数:设置为 3 或更大

最大客户端会话选项非常重要,以便数据流可纵向扩展且仍能够连接。 若要了解详细信息,请参阅事件网格 MQTT 多会话支持

创建主题空间

为了使数据流向事件网格 MQTT 代理发送或接收消息,需要在事件网格命名空间中创建至少一个主题空间。 可以通过选择“主题空间”>“新建主题空间”,在事件网格命名空间中创建主题空间。

若要快速开始和进行测试,可以创建具有通配符主题 # 的主题空间作为主题模板。

为托管标识分配权限

现在已创建主题空间,需要将 Azure IoT 操作 Arc 扩展的托管标识分配给事件网格命名空间或主题空间。

在 Azure 门户中,转到 Arc 连接的 Kubernetes 群集,然后选择“设置”>“扩展”。 在扩展列表中,找到 Azure IoT 操作扩展的名称。 复制扩展的名称。

然后,转到事件网格命名空间 >“访问控制(IAM)”>“添加角色分配”。 使用适当的角色(例如 EventGrid TopicSpaces PublisherEventGrid TopicSpaces Subscriber)分配 Azure IoT 操作 Arc 扩展的托管标识。 这为托管标识提供了必要的权限来为命名空间中的所有主题空间发送或接收消息。

或者,可以在主题空间级别分配角色。 转到主题空间 >“访问控制(IAM)”>“添加角色分配”。 使用适当的角色(例如 EventGrid TopicSpaces PublisherEventGrid TopicSpaces Subscriber)分配 Azure IoT 操作 Arc 扩展的托管标识。 这为托管标识提供了必要的权限来为特定主题空间发送或接收消息。

创建数据流终结点

配置事件网格命名空间后,可以为事件网格 MQTT 代理创建数据流终结点。

  1. 操作体验中,选择“数据流终结点”选项卡。

  2. 在“创建新的数据流终结点”下,选择“Azure 事件网格 MQTT”>“新建”。

    使用操作体验创建 Azure 事件网格终结点的屏幕截图。

    输入以下用于终结点的设置:

    设置 说明
    Name 数据流终结点的名称。
    主机 事件网格 MQTT 代理的主机名和端口。 使用格式 <NAMESPACE>.<REGION>-1.ts.eventgrid.azure.net:8883
    身份验证方法 用于身份验证的方法。 选择系统分配的托管标识
  3. 选择“应用”来预配终结点。

创建终结点后,可以在数据流中将它作为源或目标,连接到事件网格 MQTT 代理。 MQTT 主题是在数据流中配置的。

将 X.509 证书身份验证与事件网格配合使用

建议使用托管标识进行身份验证。 还可以将 X.509 证书身份验证与事件网格 MQTT 代理配合使用。

将 X.509 身份验证与事件网格 MQTT 代理结合使用时,请转到“事件网格命名空间”>“配置”并检查以下设置:

  • 启用 MQTT:选中该复选框
  • 启用备用客户端身份验证名称源:选中该复选框
  • 证书使用者名称:在下拉列表中选择此选项
  • 每个身份验证名称的最大客户端会话数:设置为 3 或更大

备用客户端身份验证和最大客户端会话选项允许数据流使用客户端证书主题名称而不是 MQTT CONNECT Username 进行身份验证。 此功能非常重要,让数据流可以生成多个实例并仍可连接。 若要了解详细信息,请参阅事件网格 MQTT 客户端证书身份验证多会话支持

然后,按照 X.509 证书中的步骤配置具有 X.509 证书设置的终结点。

事件网格共享订阅限制

如果事件网格用作数据流的源(其中数据流订阅消息),Azure 事件网格 MQTT 代理不支持共享订阅,这意味着无法在数据流配置文件中将 instanceCount 设置为超过 1 的值。 在这种情况下,如果将 instanceCount 设为大于 1 的值,数据流将无法启动。

自定义 MQTT 代理

对于其他 MQTT 代理,可以根据需要配置终结点、TLS、身份验证和其他设置。

  1. 操作体验中,选择“数据流终结点”选项卡。

  2. 在“创建新的数据流终结点”下,选择“自定义 MQTT 代理”>“新建”。

    使用操作体验创建自定义 MQTT 代理终结点的屏幕截图。

  3. 输入以下用于终结点的设置:

    设置 说明
    Name 数据流终结点的名称
    主机 MQTT 代理终结点的主机名,格式为 <hostname>.<port>
    身份验证方法 用于身份验证的方法。 选择“系统分配的托管标识”、“用户分配的托管标识”或“服务帐户令牌”。
    服务受众 服务帐户令牌的受众。 如果使用的是服务帐户令牌,则为必需。
    客户端 ID 用户分配的托管标识的客户端 ID。 如果使用的是“用户分配的托管标识”,则为必需。
    租户 ID 用户分配的托管标识的租户 ID。 如果使用的是“用户分配的托管标识”,则为必需。
    访问令牌机密名称 包含 SAS 令牌的 Kubernetes 机密的名称。 如果使用的是访问令牌,则是必需的。
  4. 选择“应用”来预配终结点。

若要自定义 MQTT 终结点设置,请参阅以下部分了解详细信息。

可用身份验证方法

以下身份验证方法可用于 MQTT 代理数据流终结点。 有关通过配置 Azure Key Vault 和启用工作负载标识来启用安全设置的详细信息,请参阅在 Azure IoT 操作预览版部署中启用安全设置

X.509 证书

许多 MQTT 代理(如事件网格)都支持 X.509 身份验证。 数据流可以提供客户端 X.509 证书并协商 TLS 通信。

在操作体验数据流终结点设置页中,选择“基本”选项卡,然后选择“身份验证方法”>“X509 证书”。

输入以下用于终结点的设置:

设置 说明
X509 客户端证书 用于身份验证的 X.509 客户端证书。
X509 中间证书 X.509 客户端证书链的中间证书。
X509 客户端密钥 对应于 X.509 客户端证书的私钥。

系统分配的托管标识

使用系统分配的托管标识进行身份验证时,无需创建机密。 系统分配的托管标识可用于向 MQTT 代理验证身份。

在配置终结点之前,请确保 Azure IoT 操作托管标识具有连接到 MQTT 代理所需的权限。

  1. 在 Azure 门户中,转到 Azure IoT 操作实例并选择“概述”
  2. 复制“Azure IoT 操作 Arc 扩展”后列出的扩展的名称。 例如 azure-iot-operations-xxxx7
  3. 使用扩展的名称在 Azure 门户中搜索托管标识。 例如,搜索 azure-iot-operations-xxxx7。
  4. 将角色分配给 Azure IoT Operations Arc 扩展托管标识,以授予连接到 MQTT 中转站的权限。 例如,对于 Azure 事件网格 MQTT 代理,将托管标识分配到具有适当角色的事件网格命名空间或主题空间。
  5. 为终结点配置系统分配的托管标识设置。

在操作体验数据流终结点设置页中,选择“基本”选项卡,然后选择“身份验证方法”>“系统分配的托管标识”。

在大多数情况下,与事件网格一起使用时,可以如所示的那样,将设置留空。 这会将托管标识受众设置为事件网格公共受众 https://eventgrid.azure.net。 如果需要设置其他受众,可以在设置中指定它。

不支持。

用户分配的托管标识

若要使用用户托管的标识进行身份验证,必须先部署已启用安全设置的 Azure IoT 操作。 若要了解详细信息,请参阅在 Azure IoT 操作预览版部署中启用安全设置

然后,指定用户分配的托管标识身份验证方法以及托管标识的客户端 ID 和租户 ID。

在操作体验数据流终结点设置页中,选择“基本”选项卡,然后选择“身份验证方法”>“用户分配的托管标识”。

在这里,范围是可选的,默认为 https://eventgrid.azure.net/.default,适用于所有 Azure 事件网格命名空间。 如果需要设置其他范围,可以通过 Bicep 或 Kubernetes 在设置中指定它。

Kubernetes 服务帐户令牌 (SAT)

若使用 Kubernetes 服务帐户令牌 (SAT) 进行身份验证,无需创建机密。 使用 SAT 通过匹配受众向 MQTT 代理进行身份验证。

在操作体验数据流终结点设置页中,选择“基本”选项卡,然后选择“身份验证方法”>“服务帐户令牌”。

输入服务受众。

匿名

若要使用匿名身份验证,请将身份验证方法设置为 Anonymous

操作体验尚不支持。 请参阅已知问题

高级设置

可以为 MQTT 代理数据流终结点设置高级设置,例如 TLS、受信任的 CA 证书、MQTT 消息传送设置和 CloudEvents。 在数据流终结点自定义资源中,可在数据流终结点的“高级”门户选项卡中设定这些设置。

在操作体验中,选择数据流终结点的“高级”选项卡。

TLS 设置

TLS 模式

若要为 Kafka 终结点启用或禁用 TLS,请在 TLS 设置中更新 mode 设置。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“启用 TLS 模式”旁边的复选框。

TLS 模式可以设置为 EnabledDisabled。 如果该模式设置为 Enabled,数据流将使用与 Kafka 代理的安全连接。 如果该模式设置为 Disabled,数据流将使用与 Kafka 代理的不安全连接。

受信任的 CA 证书

为 MQTT 终结点配置受信任的 CA 证书,以建立与 MQTT 代理的安全连接。 如果 MQTT 代理使用自签名证书或由默认不受信任的自定义 CA 签名的证书,则此设置非常重要。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“受信任的 CA 证书配置映射”字段指定包含受信任的 CA 证书的 ConfigMap。

此 ConfigMap 应包含 PEM 格式的 CA 证书。 ConfigMap 必须与 MQTT 数据流资源位于同一命名空间中。 例如:

kubectl create configmap client-ca-configmap --from-file root_ca.crt -n azure-iot-operations

提示

连接到事件网格 MQTT 代理时,不需要 CA 证书,因为事件中心服务使用由默认受信任的公共 CA 签名的证书。

客户端 ID 前缀

可以为 MQTT 客户端设置客户端 ID 前缀。 客户端 ID 是通过将数据流实例名称追加到前缀生成的。

注意

大多数应用程序不应修改客户端 ID 前缀。 在初始 IoT 操作部署后不要修改此项。 在部署后更改客户端 ID 前缀可能会导致数据丢失。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“客户端 ID 前缀”字段来指定前缀。

QoS

可以将 MQTT 消息的服务质量(QoS)级别设置为 1 或 0。 默认值为 1。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“服务质量(QoS)”字段来指定 QoS 级别。

保留

使用 retain 设置指定数据流是否应保留 MQTT 消息上的保留标志。 默认为 Keep

将此字段设置为 Keep 用于确保远程代理保留与本地代理相同的消息,这对于统一命名空间 (UNS) 方案非常重要。

如果设置为 Never,则会从 MQTT 消息中删除保留标志。 如果不希望远程代理保留任何消息,或者远程代理不支持保留,此设置非常有用。

若要配置保留设置,请执行以下操作:

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“保留”字段来指定保留设置。

仅当数据流将 MQTT 终结点同时作为源和目标使用时,“保留”设置才会生效。 例如,在 MQTT 桥方案中。

重要

Azure 事件网格 MQTT 代理当前不支持保留标志。 这意味着,如果将事件网格 MQTT 代理终结点的保留标志设置为 Keep 并将其用作目标,则会拒绝该消息。 为了避免这种情况,请在将事件网格 MQTT 代理用作目标时将保留标志设置为 Never

会话过期

可以为数据流 MQTT 客户端设置会话到期间隔。 如果数据流客户端断开连接,会话到期间隔是 MQTT 会话可以保持的最长时间。 默认值为 3600 秒。 若要配置会话过期间隔,请执行以下操作:

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“会话过期”字段来指定会话过期间隔。

MQTT 或 WebSocket 协议

默认情况下,未启用 WebSocket。 若要通过 WebSocket 使用 MQTT,请将 protocol 字段设置为 WebSockets

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“协议”字段来指定协议。

最大未完成消息数

可以设置数据流 MQTT 客户端可以拥有的最大未完成消息数。 默认值为 100。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“最大未完成消息数”字段来指定未完成的消息数上限。

如果 MQTT 终结点用作源,这是订阅时的接收最大值。 如果 MQTT 终结点用作目标,这是发布时,等待确认之前可发送的最大消息数。

保持活动状态

可以为数据流 MQTT 客户端设置保持连接间隔。 保持连接间隔是数据流客户端在向代理发送 PINGREQ 消息之前可以保持空闲的最长时间。 默认值为 60 秒。

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“保持连接”字段来指定保持连接间隔。

CloudEvents

CloudEvents 是以常见方式描述事件数据的一种方法。 CloudEvents 设置用于以 CloudEvents 格式发送和接收消息。 可以将 CloudEvents 用于事件驱动的体系结构,其中不同的服务需要在相同或不同的云提供商中相互通信。

CloudEventAttributes 选项为 PropagateCreateOrRemap。 若要配置 CloudEvents 设置,请执行以下操作:

在操作体验数据流终结点设置页中,选择“高级”选项卡,然后使用“云事件属性”字段来指定 CloudEvents 设置。

以下各部分详细介绍了 CloudEvents 设置。

“传播”设置

CloudEvent 属性将传递给包含所需属性的消息。 如果消息不包含所需的属性,则消息按原样传递。

名称 必须 示例值 输出值
specversion 1.0 按原样传递
type ms.aio.telemetry 按原样传递
source aio://mycluster/myoven 按原样传递
id A234-1234-1234 按原样传递
subject aio/myoven/telemetry/temperature 按原样传递
time 2018-04-05T17:31:00Z 按原样传递。 没有重新标记时间戳。
datacontenttype application/json 在可选的转换阶段之后更改为输出数据内容类型。
dataschema sr://fabrikam-schemas/123123123234234234234234#1.0.0 如果在转换配置中提供了输出数据转换架构,则 dataschema 将更改为输出架构。

CreateOrRemap 设置

CloudEvent 属性将传递给包含所需属性的消息。 如果消息不包含所需的属性,则将生成相应属性。

名称 必须 如果缺少,则生成值
specversion 1.0
type ms.aio-dataflow.telemetry
source aio://<target-name>
id 目标客户端中生成的 UUID
subject 发送消息的输出主题
time 在目标客户端中生成为 RFC 3339
datacontenttype 在可选的转换阶段之后更改为输出数据内容类型
dataschema 架构注册表中定义的架构

后续步骤

要了解有关数据流的详细信息,请参阅创建数据流