Тестирование подключения к брокеру 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 s Edge Essentials.
Перед началом установки или настройки операций Интернета вещей. Используйте следующие параметры для проверки подключения к брокеру 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, вы не можете подключиться к брокеру за пределами кластера напрямую. Чтобы предотвратить непреднамеренное нарушение взаимодействия между внутренними компонентами операций Интернета вещей Azure, рекомендуется сохранить прослушиватель по умолчанию не измененным и выделенным для внутреннего взаимодействия AIO. Хотя можно создать отдельную службу Kubernetes LoadBalancer для предоставления IP-службы кластера, лучше создать отдельный прослушиватель с разными параметрами, например более распространенный порт MQTT 1883 и 8883, чтобы избежать путаницы и потенциальных рисков безопасности.
Порт узла
Самый простой способ проверить подключение — использовать тип службы NodePort в прослушивателе. С помощью этого можно <nodeExternalIP>:<NodePort>
подключиться, как в документации По Kubernetes.
Например, чтобы создать прослушиватель брокера с типом службы портов узла, именем 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 . Этот метод является более сложным и может потребовать дополнительной конфигурации, например настройки перенаправления портов.
Например, чтобы создать прослушиватель брокера с типом службы подсистемы балансировки нагрузки, именем 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
Для Служба Azure Kubernetes 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 может привести к несанкционированным доступом и даже атакам DDOS.
Предупреждение
Если вы понимаете риски и должны использовать небезопасный порт в хорошо управляемой среде, вы можете отключить TLS и проверку подлинности для целей тестирования, удалив tls
параметры из authenticationRef
конфигурации прослушивателя.
В портал Azure перейдите к экземпляру Операций Интернета вещей.
В разделе "Компоненты" выберите MQTT Broker.
Выберите прослушиватель брокера MQTT для прослушивателя брокера NodePort или MQTT для LoadBalancer>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.
Внимание
Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.
Введите следующие параметры:
Параметр Значение Имя. Введите имя прослушивателя Service name Введите имя службы Порт Введите номер порта Проверка подлинности Выберите Нет. Авторизация Выберите Нет. Протокол Выбор MQTT Порт узла Введите число от 30000 до 32767 при использовании порта узла Нажмите кнопку "Создать" , чтобы создать прослушиватель.