Тестирование подключения к брокеру MQTT с помощью клиентов MQTT
Внимание
На этой странице содержатся инструкции по управлению компонентами Операций Интернета вещей Azure с помощью манифестов развертывания Kubernetes, которые доступны в предварительной версии. Эта функция предоставляется с несколькими ограничениями и не должна использоваться для рабочих нагрузок.
Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.
В этой статье показаны различные способы проверки подключения к брокеру MQTT с клиентами MQTT в непроизводной среде.
По умолчанию брокер MQTT:
- Развертывает прослушиватель с поддержкой протокола TLS в порте 18883 с
ClusterIp
типом службы.ClusterIp
означает, что брокер доступен только из кластера Kubernetes. Чтобы получить доступ к брокеру за пределами кластера, необходимо настроить службу типаLoadBalancer
илиNodePort
. - Принимает учетные записи службы Kubernetes для проверки подлинности для подключений из кластера. Чтобы подключиться извне кластера, необходимо настроить другой метод проверки подлинности.
Внимание
Для рабочих сценариев используйте проверку подлинности учетных записей TLS и служб для защиты решения Интернета вещей. Дополнительные сведения см. в разделе:
- Настройте TLS с автоматическим управлением сертификатами для защиты обмена данными MQTT в брокере MQTT.
- Настройте проверку подлинности в брокере MQTT.
- Предоставление служб Kubernetes внешним устройствам с помощью перенаправления портов или виртуального коммутатора с Служба Azure Kubernetes edge Essentials (AKS).
Перед началом установки или настройки операций Интернета вещей Azure. Используйте следующие параметры, чтобы проверить подключение к брокеру MQTT с клиентами MQTT в непроизводственных средах.
Подключение к прослушивателю по умолчанию в кластере
Первым вариантом является подключение из кластера. Этот параметр использует конфигурацию по умолчанию и не требует дополнительных обновлений. В следующих примерах показано, как подключиться из кластера с помощью обычного альпийского Linux и часто используемого клиента MQTT с помощью учетной записи службы и сертификата корневого центра сертификации (ЦС) по умолчанию.
mqtt-client.yaml
Скачайте развертывание из примера репозитория GitHub.
Внимание
Не используйте клиент MQTT в рабочей среде. Клиент предназначен только для тестирования.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml
Примените файл развертывания с kubectl:
kubectl apply -f mqtt-client.yaml
pod/mqtt-client created
После запуска модуля pod используйте kubectl exec
для выполнения команд внутри модуля pod.
Например, чтобы опубликовать сообщение в брокере, откройте оболочку внутри модуля pod:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
В оболочке pod выполните следующую команду, чтобы опубликовать сообщение брокеру:
mosquitto_pub --host aio-broker --port 18883 --message "hello" --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
Результат должен выглядеть следующим образом:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Клиент Mosquitto использует маркер учетной записи службы, подключенный для /var/run/secrets/tokens/broker-sat
проверки подлинности с помощью брокера. Маркер действителен в течение 24 часов. Клиент также использует сертификат корневого ЦС по умолчанию, подключенный /var/run/certs/ca.crt
для проверки цепочки сертификатов TLS брокера.
Совет
Kubectl можно использовать для скачивания корневого сертификата ЦС по умолчанию для использования с другими клиентами. Например, чтобы скачать сертификат корневого ЦС по умолчанию в файл с именем ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Чтобы подписаться на раздел, выполните следующую команду:
mosquitto_sub --host aio-broker --port 18883 --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
Результат должен выглядеть следующим образом:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: world, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0
Клиент Mosquitto использует тот же маркер учетной записи службы и корневой сертификат ЦС для проверки подлинности с помощью брокера и подписки на раздел.
Чтобы удалить модуль pod, выполните команду kubectl delete pod mqtt-client -n azure-iot-operations
.
Подключение клиентов извне кластера
Так как прослушиватель брокера по умолчанию имеет ClusterIp
тип службы, вы не можете подключиться к брокеру за пределами кластера напрямую. Чтобы предотвратить непреднамеренное нарушение взаимодействия между внутренними компонентами операций Интернета вещей, рекомендуется сохранить прослушиватель по умолчанию не измененным и выделенным для внутренних коммуникаций Операций Интернета вещей. Хотя можно создать отдельную службу Kubernetes LoadBalancer
для предоставления IP-службы кластера, лучше создать отдельный прослушиватель с различными параметрами, например более распространенными портами MQTT 1883 и 8883, чтобы избежать путаницы и потенциальных рисков безопасности.
Порт узла
Самый простой способ проверить подключение — использовать NodePort
тип службы в прослушивателе. С помощью этого метода можно подключиться <nodeExternalIP>:<NodePort>
, как показано в документации Kubernetes.
Например, чтобы создать прослушиватель брокера с типом NodePort
службы, именем aio-broker-nodeport
службы и прослушивать порт 1884 (порт узла 31884), выполните следующие действия.
В портал Azure перейдите к экземпляру Операций Интернета вещей.
В разделе "Компоненты" выберите MQTT Broker.
Выберите прослушиватель брокера MQTT для NodePort>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.
Внимание
Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.
Введите следующие параметры:
Параметр Значение Имя. aio-broker-nodeport
Service name Оставьте пустым или используйте aio-broker-nodeport
.Порт 1884 Проверка подлинности Выберите существующий или нет. Авторизация Выберите существующий или нет. Протокол Выберите MQTT. Порт узла 31884 Добавьте параметры TLS в прослушиватель, нажав кнопку "Добавить TLS>" на порт. Этот шаг не требуется, если для тестирования не требуется TLS. Дополнительные сведения см. в разделе BrokerListener.
Нажмите кнопку "Создать" , чтобы создать прослушиватель.
Примечание.
По умолчанию Kubernetes номер порта узла должен находиться в диапазоне от 30000 до 32767.
Получите внешний IP-адрес узла:
kubectl get nodes -o yaml | grep ExternalIP -C 1
Результат должен выглядеть следующим образом:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Используйте внешний IP-адрес и порт узла для подключения к брокеру. Например, чтобы опубликовать сообщение в брокере, выполните следующие действия.
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Если в выходных данных нет внешнего IP-адреса, возможно, вы используете настройку Kubernetes, которая не предоставляет внешний IP-адрес узла по умолчанию, как и многие настройки k3s, k3d или minikube. В этом случае вы можете получить доступ к брокеру с внутренним IP-адресом вместе с портом узла с компьютеров в той же сети. Например, чтобы получить внутренний IP-адрес узла:
kubectl get nodes -o yaml | grep InternalIP -C 1
Результат должен выглядеть следующим образом:
- address: 172.19.0.2
type: InternalIP
allocatable:
Затем используйте внутренний IP-адрес и порт узла для подключения к брокеру с компьютера в одном кластере. Если Kubernetes работает на локальном компьютере, например с одним узлом k3s, можно часто использовать localhost
вместо внутреннего IP-адреса. Если Kubernetes работает в контейнере Docker, например k3d, внутренний IP-адрес соответствует IP-адресу контейнера и должен быть доступен с хост-компьютера.
Подсистема балансировки нагрузки
Еще одним способом предоставления брокера в Интернете является использование LoadBalancer
типа службы. Этот метод является более сложным и может потребовать большей конфигурации, например настройки перенаправления портов.
Например, чтобы создать прослушиватель брокера с типом LoadBalancer
службы, именем aio-broker-loadbalancer
службы и прослушивателем порта 1883, выполните следующие действия.
В портал Azure перейдите к экземпляру Операций Интернета вещей.
В разделе "Компоненты" выберите MQTT Broker.
Выберите прослушиватель брокера MQTT для NodePort>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.
Внимание
Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.
Введите следующие параметры:
Параметр Значение Имя. aio-broker-loadbalancer
Service name Оставьте пустым или используйте aio-broker-loadbalancer
.Порт 1883 Проверка подлинности Выберите существующий или нет. Авторизация Выберите существующий или нет. Протокол Выберите MQTT. Добавьте параметры TLS в прослушиватель, нажав кнопку "Добавить TLS>" на порт. Этот шаг не требуется, если для тестирования не требуется TLS. Дополнительные сведения см. в разделе BrokerListener.
Нажмите кнопку "Создать" , чтобы создать прослушиватель.
Нажмите кнопку "Создать" , чтобы создать прослушиватель.
Получите внешний IP-адрес для службы брокера:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Если выходные данные выглядят примерно так:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aio-broker-loadbalancer LoadBalancer 10.x.x.x x.x.x.x 1883:30382/TCP 83s
Затем внешний IP-адрес был назначен службе подсистемы балансировки нагрузки. Внешний IP-адрес и порт можно использовать для подключения к брокеру. Например, чтобы опубликовать сообщение в брокере, выполните следующие действия.
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Если внешний IP-адрес не назначен, может потребоваться использовать перенаправление портов или виртуальный коммутатор для доступа к брокеру.
Использование перенаправления портов
При использовании миникубе, типа и других систем эмуляции кластера внешний IP-адрес может не назначаться автоматически. Например, состояние может отображаться как ожидающий.
Чтобы получить доступ к брокеру, перенаправите порт прослушивателя брокера на узел.
# Using aio-broker-loadbalancer service name and listener port 1883 as example kubectl port-forward --namespace azure-iot-operations service/aio-broker-loadbalancer <HOST_PORT>:1883
Оставьте команду пересылки портов, запущенную в терминале.
Подключитесь к брокеру через порт узла с той же конфигурацией проверки подлинности и TLS, что и пример без перенаправления портов.
Дополнительные сведения о миникубе см. в разделе "Использование перенаправления портов для доступа к приложениям в кластере".
Переадресация портов в AKS Edge Essentials
Для AKS Edge Essentials необходимо выполнить несколько дополнительных действий. При использовании AKS Edge Essentials получение внешнего IP-адреса может быть недостаточно для подключения к брокеру. Возможно, потребуется настроить перенаправление портов и открыть порт в брандмауэре, чтобы разрешить трафик службе брокера.
Сначала получите внешний IP-адрес прослушивателя подсистемы балансировки нагрузки брокера:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
Выходные данные должны выглядеть примерно так:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Настройте перенаправление портов в
broker-loadbalancer
службу по внешнему IP-адресу192.168.0.4
и порту1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Откройте порт в брандмауэре, чтобы разрешить трафик службе брокера:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Используйте общедоступный IP-адрес узла для подключения к брокеру MQTT.
Дополнительные сведения о переадресации портов см. в разделе "Предоставление служб Kubernetes внешним устройствам".
Доступ через localhost
Некоторые дистрибутивы Kubernetes могут предоставлять брокер MQTT порту в системе узлов (localhost
) в рамках конфигурации кластера. Используйте этот подход, чтобы упростить доступ клиентов на одном узле к брокеру MQTT.
Например, чтобы создать кластер k3d, который сопоставляет порт MQTT по умолчанию MQTT брокера MQTT 1883 со localhost:1883
следующими значениями:
k3d cluster create --port '1883:1883@loadbalancer'
Или обновить существующий кластер:
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
Затем используйте localhost
порт для подключения к брокеру. Например, чтобы опубликовать сообщение в брокере, выполните следующие действия.
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Отключить протокол TLS и проверку подлинности только для тестирования
Причина, по которой брокер MQTT использует проверку подлинности TLS и учетных записей служб по умолчанию, заключается в том, чтобы обеспечить безопасный по умолчанию интерфейс, который минимизирует непреднамеренное воздействие решения Интернета вещей злоумышленникам. Вы не должны отключать TLS и проверку подлинности в рабочей среде. Предоставление брокера MQTT в Интернет без проверки подлинности и TLS может привести к несанкционированным доступом и даже распределенным атакам типа "отказ в обслуживании".
Предупреждение
Если вы понимаете риски и должны использовать небезопасный порт в хорошо управляемой среде, вы можете отключить TLS и проверку подлинности для целей тестирования, удалив tls
параметры из authenticationRef
конфигурации прослушивателя.
В портал Azure перейдите к экземпляру Операций Интернета вещей.
В разделе "Компоненты" выберите MQTT Broker.
Выберите прослушиватель брокера MQTT для прослушивателя брокера NodePort или MQTT для LoadBalancer>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.
Внимание
Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.
Введите следующие параметры:
Параметр Значение Имя. Введите имя прослушивателя. Service name Введите имя службы. Порт Введите номер порта. Проверка подлинности Выберите "Нет". Авторизация Выберите "Нет". Протокол Выберите MQTT. Порт узла Введите число от 30000 до 32767 при использовании порта узла. Нажмите кнопку "Создать" , чтобы создать прослушиватель.