Bagikan melalui


Menguji konektivitas ke broker MQTT dengan klien MQTT

Penting

Halaman ini mencakup instruksi untuk mengelola komponen Azure IoT Operations menggunakan manifes penyebaran Kubernetes, yang ada dalam pratinjau. Fitur ini disediakan dengan beberapa batasan, dan tidak boleh digunakan untuk beban kerja produksi.

Lihat Ketentuan Penggunaan Tambahan untuk Pratinjau Microsoft Azure untuk persyaratan hukum yang berlaku pada fitur Azure dalam versi beta, pratinjau, atau belum dirilis secara umum.

Artikel ini menunjukkan berbagai cara untuk menguji konektivitas ke broker MQTT dengan klien MQTT di lingkungan nonproduksi.

Secara default, broker MQTT:

  • Menyebarkan listener yang mendukung Protokol Transport Layer Security (TLS) pada port 18883 dengan ClusterIp sebagai jenis layanan. ClusterIp berarti bahwa broker hanya dapat diakses dari dalam kluster Kubernetes. Untuk mengakses broker dari luar kluster, Anda harus mengonfigurasi layanan jenis LoadBalancer atau NodePort.
  • Menerima akun layanan Kubernetes untuk autentikasi untuk koneksi dari dalam kluster. Untuk terhubung dari luar kluster, Anda harus mengonfigurasi metode autentikasi yang berbeda.

Perhatian

Untuk skenario produksi, gunakan TLS dan autentikasi akun layanan untuk mengamankan solusi IoT Anda. Untuk informasi selengkapnya, lihat:

Sebelum Memulai, instal atau konfigurasikan Operasi Azure IoT. Gunakan opsi berikut untuk menguji konektivitas ke broker MQTT dengan klien MQTT di lingkungan nonproduksi.

Menyambungkan ke pendengar default di dalam kluster

Opsi pertama adalah menyambungkan dari dalam kluster. Opsi ini menggunakan konfigurasi default dan tidak memerlukan pembaruan tambahan. Contoh berikut menunjukkan cara terhubung dari dalam kluster dengan menggunakan Alpine Linux biasa dan klien MQTT yang umum digunakan dengan menggunakan akun layanan dan sertifikat Otoritas Sertifikat akar (CA) default.

mqtt-client.yaml Unduh penyebaran dari repositori sampel GitHub.

Penting

Jangan gunakan klien MQTT dalam produksi. Klien hanya untuk tujuan pengujian.

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
pod/mqtt-client created

Setelah pod berjalan, gunakan kubectl exec untuk menjalankan perintah di dalam pod.

Misalnya, untuk menerbitkan pesan ke broker, buka shell di dalam pod:

kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh

Di dalam shell pod, jalankan perintah berikut untuk menerbitkan pesan ke broker:

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)

Hasilnya harus terlihat mirip dengan contoh berikut:

Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT

Klien Mosquitto menggunakan token akun layanan yang dipasang /var/run/secrets/tokens/broker-sat untuk mengautentikasi dengan broker. Token berlaku selama 24 jam. Klien juga menggunakan sertifikat OS akar default yang dipasang di /var/run/certs/ca.crt untuk memverifikasi rantai sertifikat TLS broker.

Petunjuk / Saran

Anda dapat menggunakan kubectl untuk mengunduh sertifikat OS akar default untuk digunakan dengan klien lain. Misalnya, untuk mengunduh sertifikat OS akar default ke file bernama ca.crt:

kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt

Untuk berlangganan topik, jalankan perintah berikut:

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)

Hasilnya harus terlihat mirip dengan contoh berikut:

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

Klien Mosquitto menggunakan token akun layanan dan sertifikat OS akar yang sama untuk mengautentikasi dengan broker dan berlangganan topik tersebut.

Untuk menghapus pod, jalankan kubectl delete pod mqtt-client -n azure-iot-operations.

Menyambungkan klien dari luar kluster

Karena pendengar broker default diatur ke ClusterIp jenis layanan, Anda tidak dapat terhubung ke broker dari luar kluster secara langsung. Untuk mencegah gangguan yang tidak disengaja terhadap komunikasi antara komponen Operasi IoT internal, kami sarankan Anda menjaga pendengar default tetap tidak dimodifikasi dan didedikasikan untuk komunikasi internal Operasi IoT. Meskipun dimungkinkan untuk membuat layanan Kubernetes LoadBalancer terpisah untuk mengekspos layanan IP kluster, lebih baik membuat listener terpisah dengan pengaturan yang berbeda, seperti port MQTT yang lebih umum 1883 dan 8883, untuk menghindari kebingungan dan potensi risiko keamanan.

Port node

Cara term mudah untuk menguji konektivitas adalah dengan menggunakan NodePort jenis layanan di pendengar. Dengan metode tersebut, Anda dapat menggunakan <nodeExternalIP>:<NodePort> untuk terhubung seperti yang ditunjukkan dalam dokumentasi Kubernetes.

Misalnya, untuk membuat pendengar broker baru dengan NodePort jenis layanan, nama aio-broker-nodeportlayanan, dan mendengarkan di port 1884 (port node 31884), ikuti langkah-langkah ini.

  1. Di portal Azure, buka instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih pendengar broker MQTT untuk NodePort>Create. Anda hanya dapat membuat satu listener per jenis layanan. Jika Anda sudah memiliki pendengar dengan jenis layanan yang sama, Anda dapat menambahkan lebih banyak port ke pendengar yang ada.

    Perhatian

    Mengatur autentikasi ke Tidak Ada dan tidak mengonfigurasi TLS menonaktifkan autentikasi dan TLS hanya untuk tujuan pengujian.

    Masukkan pengaturan berikut:

    Pengaturan Nilai
    Nama aio-broker-nodeport
    Nama layanan Biarkan kosong atau gunakan aio-broker-nodeport.
    Pelabuhan 1884
    Autentikasi Pilih dari yang sudah ada atau Tidak Ada.
    Otorisasi Pilih dari yang sudah ada atau Tidak Ada.
    Protokol Pilih MQTT.
    Port node 31884
  4. Tambahkan pengaturan TLS ke pendengar dengan memilih Tambahkan TLS>pada port. Langkah ini tidak diperlukan jika Anda tidak memerlukan TLS untuk pengujian. Untuk informasi selengkapnya, lihat BrokerListener.

  5. Pilih Buat untuk membuat pendengar.

Catatan

Secara default Kubernetes, nomor port node harus dalam rentang 30000 hingga 32767.

Dapatkan alamat IP eksternal node:

kubectl get nodes -o yaml | grep ExternalIP -C 1

Hasilnya harus terlihat mirip dengan contoh berikut:

    - address: 104.197.41.11
      type: ExternalIP
    allocatable:
--
    - address: 23.251.152.56
      type: ExternalIP
    allocatable:
...

Gunakan alamat IP eksternal dan port node untuk terhubung ke broker. Misalnya, untuk menerbitkan pesan ke broker:

mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Jika tidak ada IP eksternal dalam output, Anda mungkin menggunakan penyiapan Kubernetes yang tidak mengekspos alamat IP eksternal node secara default, seperti banyak pengaturan k3, k3d, atau minikube. Dalam hal ini, Anda dapat mengakses broker dengan IP internal bersama dengan port node dari komputer pada jaringan yang sama. Misalnya, untuk mendapatkan alamat IP internal simpul:

kubectl get nodes -o yaml | grep InternalIP -C 1

Hasilnya harus terlihat mirip dengan contoh berikut:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Kemudian, gunakan alamat IP internal dan port node untuk terhubung ke broker dari komputer dalam kluster yang sama. Jika Kubernetes berjalan pada komputer lokal, seperti dengan k3 node tunggal, Anda sering dapat menggunakan localhost alih-alih alamat IP internal. Jika Kubernetes berjalan dalam kontainer Docker, seperti dengan k3d, alamat IP internal sesuai dengan alamat IP kontainer, dan harus dapat dijangkau dari komputer host.

Load Balancer

Cara lain untuk mengekspos broker ke internet adalah dengan menggunakan LoadBalancer jenis layanan. Metode ini lebih kompleks dan mungkin memerlukan lebih banyak konfigurasi, seperti menyiapkan penerusan port.

Misalnya, untuk membuat pendengar broker baru dengan LoadBalancer jenis layanan, nama aio-broker-loadbalancerlayanan, dan mendengarkan di port 1883, ikuti langkah-langkah ini.

  1. Di portal Azure, buka instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih pendengar broker MQTT untuk NodePort>Create. Anda hanya dapat membuat satu listener per jenis layanan. Jika Anda sudah memiliki pendengar dengan jenis layanan yang sama, Anda dapat menambahkan lebih banyak port ke pendengar yang ada.

    Perhatian

    Mengatur autentikasi ke Tidak Ada dan tidak mengonfigurasi TLS menonaktifkan autentikasi dan TLS hanya untuk tujuan pengujian.

    Masukkan pengaturan berikut:

    Pengaturan Nilai
    Nama aio-broker-loadbalancer
    Nama layanan Biarkan kosong atau gunakan aio-broker-loadbalancer.
    Pelabuhan 1883
    Autentikasi Pilih dari yang sudah ada atau Tidak Ada.
    Otorisasi Pilih dari yang sudah ada atau Tidak Ada.
    Protokol Pilih MQTT.
  4. Tambahkan pengaturan TLS ke pendengar dengan memilih Tambahkan TLS>pada port. Langkah ini tidak diperlukan jika Anda tidak memerlukan TLS untuk pengujian. Untuk informasi selengkapnya, lihat BrokerListener.

  5. Pilih Buat untuk membuat pendengar.

  6. Pilih Buat untuk membuat pendengar.

Dapatkan alamat IP eksternal untuk layanan broker:

kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations

Jika output terlihat mirip dengan contoh berikut:

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

Kemudian IP eksternal ditetapkan ke layanan load balancer. Anda dapat menggunakan alamat IP eksternal dan port untuk terhubung ke broker. Misalnya, untuk menerbitkan pesan ke broker:

mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Jika IP eksternal tidak ditetapkan, Anda mungkin perlu menggunakan penerusan port atau sakelar virtual untuk mengakses broker.

Menggunakan penerusan port

Dengan minikube, jenis, dan sistem emulasi kluster lainnya, IP eksternal mungkin tidak ditetapkan secara otomatis. Misalnya, status mungkin ditampilkan sebagai Tertunda.

  1. Untuk mengakses broker, teruskan port pendengar broker ke host.

    # 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
    
  2. Biarkan perintah penerusan port berjalan di terminal.

  3. Sambungkan ke broker di port host dengan autentikasi dan konfigurasi TLS yang sama dengan contoh tanpa penerusan port.

Untuk informasi selengkapnya tentang minikube, lihat Menggunakan Penerusan Port untuk Mengakses Aplikasi dalam Kluster.

Penerusan port pada AKS Edge Essentials

Untuk AKS Edge Essentials, Anda perlu melakukan beberapa langkah lagi. Dengan AKS Edge Essentials, mendapatkan alamat IP eksternal mungkin tidak cukup untuk terhubung ke broker. Anda mungkin perlu menyiapkan penerusan port dan membuka port pada firewall untuk memungkinkan lalu lintas ke layanan broker.

  1. Pertama, dapatkan alamat IP eksternal pendengar load balancer broker:

    kubectl get service broker-loadbalancer --namespace azure-iot-operations
    

    Output akan terlihat mirip dengan contoh berikut:

    NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    broker-loadbalancer     LoadBalancer   10.x.x.x       192.168.0.4   1883:30366/TCP   14h
    
  2. Siapkan penerusan port ke broker-loadbalancer layanan pada alamat 192.168.0.4 IP eksternal dan port 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Buka port pada firewall untuk memungkinkan lalu lintas ke layanan broker:

    New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. Gunakan alamat IP publik host untuk terhubung ke broker MQTT.

Untuk informasi selengkapnya tentang penerusan port, lihat Mengekspos layanan Kubernetes ke perangkat eksternal.

Akses melalui localhost

Beberapa distribusi Kubernetes dapat mengekspos broker MQTT ke port pada sistem host (localhost) sebagai bagian dari konfigurasi kluster. Gunakan pendekatan ini untuk mempermudah klien pada host yang sama untuk mengakses broker MQTT.

Misalnya, untuk membuat kluster k3d yang memetakan port MQTT default broker MQTT 1883 ke localhost:1883:

k3d cluster create --port '1883:1883@loadbalancer'

Atau untuk memperbarui kluster yang ada:

k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'

Kemudian, gunakan localhost dan port untuk terhubung ke broker. Misalnya, untuk menerbitkan pesan ke broker:

mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Hanya nonaktifkan TLS dan autentikasi untuk pengujian

Alasan broker MQTT menggunakan autentikasi TLS dan akun layanan secara default adalah untuk memberikan pengalaman aman secara default yang meminimalkan paparan solusi IoT Anda yang tidak disengaja kepada penyerang. Anda tidak boleh menonaktifkan TLS dan autentikasi dalam produksi. Mengekspos broker MQTT ke internet tanpa autentikasi dan TLS dapat menyebabkan akses yang tidak sah dan bahkan serangan penolakan layanan terdistribusi.

Peringatan

Jika Anda memahami risiko dan perlu menggunakan port yang tidak aman di lingkungan yang terkontrol dengan baik, Anda dapat menonaktifkan TLS dan autentikasi untuk tujuan pengujian dengan menghapus tls pengaturan dan authenticationRef dari konfigurasi pendengar.

  1. Di portal Azure, buka instans Operasi IoT Anda.

  2. Di bawah Komponen, pilih MQTT Broker.

  3. Pilih pendengar broker MQTT untuk NodePort atau pendengar broker MQTT untuk LoadBalancer>Create. Anda hanya dapat membuat satu listener per jenis layanan. Jika Anda sudah memiliki pendengar dengan jenis layanan yang sama, Anda dapat menambahkan lebih banyak port ke pendengar yang ada.

    Perhatian

    Mengatur autentikasi ke Tidak Ada dan tidak mengonfigurasi TLS menonaktifkan autentikasi dan TLS hanya untuk tujuan pengujian.

    Masukkan pengaturan berikut:

    Pengaturan Nilai
    Nama Masukkan nama untuk pendengar.
    Nama layanan Masukkan nama layanan.
    Pelabuhan Masukkan nomor port.
    Autentikasi Pilih Tidak Ada.
    Otorisasi Pilih Tidak Ada.
    Protokol Pilih MQTT.
    Port node Masukkan angka antara 30000 hingga 32767 jika menggunakan port node.
  4. Pilih Buat untuk membuat pendengar.