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

使用 BrokerListener 保护 Azure IoT MQ 预览版通信

重要

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

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

若要自定义网络访问和安全性,请使用 BrokerListener 资源。 侦听器对应于向网络公开中转站的网络终结点。 每个 Broker 资源可以有一个或多个 BrokerListener 资源,因此,每个端口具有不同的访问控制。

每个侦听器可以有自己的身份验证和授权规则,这些规则定义谁可以连接到侦听器,以及他们可以在中转站上执行的操作。 可以使用 BrokerAuthenticationBrokerAuthorization 资源为每个侦听器指定访问控制策略。 这种灵活性使你可以根据 MQTT 客户端的需求和用例微调 MQTT 客户端的权限和角色。

BrokerListener 资源包含以下字段:

字段名称 必须 说明
brokerRef 此侦听器所属的中转站资源的名称。 此字段是必需的,并且必须与同一命名空间中的现有 Broker 资源匹配。
port 此侦听器侦听的端口号。 此字段是必需的,必须是有效的 TCP 端口号。
serviceType 为此侦听器创建的 Kubernetes 服务的类型。 此子字段是可选的,默认为 clusterIp。 必须是 loadBalancerclusterIpnodePort
serviceName 为此侦听器创建的 Kubernetes 服务的名称。 Kubernetes 会为此serviceName创建 DNS 记录,客户端应使用该记录连接到 Azure IoT MQ 预览版。 此子字段是可选的,默认为 aio-mq-dmqtt-frontend。 重要说明:如果有多个侦听器具有相同的serviceTypeserviceName,则侦听器共享相同的 Kubernetes 服务。 有关详细信息,请参阅服务名称和服务类型
authenticationEnabled 一个布尔标志,指示此侦听器是否需要从客户端进行身份验证。 如果设置为true,则此侦听器将使用与之关联的任何BrokerAuthentication资源来验证客户端。 如果设置为 false,则此侦听器允许任何客户端在没有身份验证的情况下进行连接。 此字段是可选的,默认为 false。 要详细了解身份验证,请参阅配置 Azure IoT MQ 预览版身份验证
authorizationEnabled 布尔标志,指示此侦听器是否需要从客户端进行授权。 如果设置为true,则此侦听器将使用与之关联的任何BrokerAuthorization资源来验证和授权客户端。 如果设置为false,则此侦听器允许任何客户端在没有授权的情况下进行连接。 此字段是可选的,默认为 false。 要详细了解授权,请参阅配置 Azure IoT MQ 预览版授权
tls 侦听器的 TLS 设置。 该字段是可选的,可以省略该字段以禁用侦听器的 TLS。 要配置 TLS,请将其设置为以下类型之一:
* 如果设置为automatic,则此侦听器使用证书管理器获取和续订侦听器的证书。 要使用此类型,指定issuerRef字段以引用证书管理器颁发者
* 如果设置为manual,则侦听器使用手动提供的侦听器证书。 要使用此类型,指定secretName字段,该字段引用包含证书和私钥的 Kubernetes 机密
* 如果设置为keyVault,则侦听器使用 Azure Key Vault 中的证书。 要使用此类型,指定引用 Azure Key Vault 实例和机密的keyVault字段
protocol 此侦听器使用的协议。 此字段是可选的,默认为 mqtt。 必须是 mqttwebsockets

默认 BrokerListener

部署 Azure IoT 操作预览版时,此部署还会在azure-iot-operations命名空间中创建名为listenerBrokerListener资源。 此侦听器链接到部署期间也创建的名为 broker 的默认 Broker 资源。 默认侦听器在启用了 TLS 和 SAT 身份验证的端口 8883 上公开中转站。 TLS 证书由证书管理器自动管理。 默认情况下禁用授权。

若要检查侦听器,请运行:

kubectl get brokerlistener listener -n azure-iot-operations -o yaml

应如下所示进行输出,删除大多数元数据是为了简洁起见:

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: listener
  namespace: azure-iot-operations
spec:
  brokerRef: broker
  authenticationEnabled: true
  authorizationEnabled: false
  port: 8883
  serviceName: aio-mq-dmqtt-frontend
  serviceType: clusterIp
  tls:
    automatic:
      issuerRef:
        group: cert-manager.io
        kind: Issuer
        name: mq-dmqtt-frontend

若要详细了解链接到此侦听器的默认 BrokerAuthentication 资源,请参阅默认 BrokerAuthentication 资源

新建 BrokerListeners

此示例演示如何为名为 my-brokerBroker 资源创建两个新的 BrokerListener 资源。 每个 BrokerListener 资源都为接受来自客户端的 MQTT 连接的侦听器定义端口和 TLS 设置。

  • 第一个 BrokerListener 资源(名为 my-test-listener)在端口 1883 上定义了一个侦听器,该侦听器没有 TLS 并且身份验证关闭。 客户端无需加密或身份验证即可连接到中转站。
  • 第二个 BrokerListener 资源(名为 my-secure-listener)在端口 8883 上定义了一个侦听器,该侦听器具有 TLS 并且身份验证已启用。 只有经过身份验证的客户端才能使用 TLS 加密连接到中转站。 tls 字段设置为 automatic,这意味着侦听器使用证书管理器获取和续订其服务器证书。

若要创建这些 BrokerListener 资源,请将此 YAML 清单应用到 Kubernetes 群集:

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: my-test-listener
  namespace: azure-iot-operations
spec:
  authenticationEnabled: false
  authorizationEnabled: false
  brokerRef: broker
  port: 1883
---
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: my-secure-listener
  namespace: azure-iot-operations
spec:
  authenticationEnabled: true
  authorizationEnabled: false
  brokerRef: broker
  port: 8883
  tls:
    automatic:
      issuerRef:
        name: e2e-cert-issuer
        kind: Issuer
        group: cert-manager.io

服务名称和服务类型

如果有多个 BrokerListener 资源具有相同的serviceTypeserviceName,则资源共享相同的 Kubernetes 服务。 这意味着服务公开所有侦听器的所有端口。 例如,如果两个侦听器具有相同的serviceTypeserviceName(一个位于端口 1883,另一个位于端口 8883),则服务会公开这两个端口。 客户端可以在任一端口上连接到中转站。

共享服务名称时,需要遵循两个重要的规则:

  1. 具有相同serviceType的侦听器必须共享相同的serviceName

  2. 具有不同serviceType的侦听器必须具有不同的serviceName

值得注意的是,端口 8883 上默认侦听器的服务为clusterIp并命名为aio-mq-dmqtt-frontend。 下表总结了在不同端口上新建侦听器时会发生什么情况:

新侦听器serviceType 新侦听器serviceName Result
clusterIp aio-mq-dmqtt-frontend 新建侦听器成功,服务会公开这两个端口。
clusterIp my-service 由于服务类型与默认侦听器冲突,因此新侦听器无法创建。
loadBalancernodePort aio-mq-dmqtt-frontend 由于服务名称与默认侦听器冲突,因此无法新建侦听器。
loadBalancernodePort my-service 新建侦听器成功,并新建了服务。