MQTT istemcileriyle MQTT sunucusuna bağlantıyı test etme

Bu makalede, üretim dışı bir ortamda MQTT istemcileriyle MQTT aracısına bağlantıyı test etmenin farklı yolları gösterilmektedir.

Varsayılan olarak, bir MQTT aracısı:

Dikkat

Üretim senaryolarında, IoT çözümünüzün güvenliğini sağlamak için TLS ve hizmet hesapları kimlik doğrulamasını kullanın. Daha fazla bilgi için bkz.

Başlamadan önce Azure IoT İşlemlerini yükleyin veya yapılandırın. Üretim dışı bir ortamda MQTT istemcileri ile MQTT aracısı bağlantısını test etmek için aşağıdaki seçenekleri kullanın.

Küme içindeki varsayılan dinleyiciye bağlanma

İlk seçenek, kümenin içinden bağlanmaktır. Bu seçenek varsayılan yapılandırmayı kullanır ve ek güncelleştirme gerektirmez. Aşağıdaki örneklerde, hizmet hesabını ve varsayılan kök Sertifika Yetkilisi (CA) sertifikasını kullanarak düz Alpine Linux ve yaygın olarak kullanılan bir MQTT istemcisi kullanarak kümenin içinden nasıl bağlanacakları gösterilmektedir.

mqtt-client.yaml Dağıtımı GitHub örnek deposundan indirin.

Önemli

Üretimde MQTT istemcisini kullanmayın. İstemci sadece test amaçlı kullanılmalıdır.

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

Pod çalıştıktan sonra, pod içinde komutları çalıştırmak için kubectl exec kullanın.

Örneğin, aracıya bir mesaj yayımlamak için pod içinde bir terminal açın.

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

Pod kabuğunun içinde aşağıdaki komutu çalıştırarak broker'a bir ileti yayımlayın.

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)

Çıkış aşağıdaki örneğe benzer görünmelidir:

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 istemcisi, aracıyla kimlik doğrulaması yapmak için /var/run/secrets/tokens/broker-sat konumuna eklenen hizmet hesabı belirtecini kullanır. Belirteç 24 saat geçerlidir. İstemci ayrıca /var/run/certs/ca.crt konumuna bağlı varsayılan kök CA sertifikasını, aracının TLS sertifika zincirini doğrulamak için kullanır.

İpucu

Diğer istemcilerle kullanmak üzere varsayılan kök CA sertifikasını indirmek için kubectl kullanabilirsiniz. Örneğin, varsayılan kök CA sertifikasını adlı ca.crtbir dosyaya indirmek için:

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

Konuya abone olmak için aşağıdaki komutu çalıştırın:

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)

Çıkış aşağıdaki örneğe benzer görünmelidir:

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 müşterisi, broker ile kimlik doğrulaması yapmak ve başlığa abone olmak için aynı hizmet hesabı belirtecini ve kök CA sertifikasını kullanır.

Pod'u kaldırmak için komutunu çalıştırın kubectl delete pod mqtt-client -n azure-iot-operations.

İstemcileri küme dışından bağlama

Varsayılan aracı dinleyicisi hizmet türüne ayarlandığındanClusterIp, doğrudan küme dışından aracıya bağlanamazsınız. İç IoT İşlemleri bileşenleri arasındaki iletişimin yanlışlıkla kesintiye uğramasını önlemek için varsayılan dinleyiciyi değiştirilmemiş ve IoT İşlemleri iç iletişimi için ayrılmış tutmanızı öneririz. Küme IP hizmetini kullanıma açmak için ayrı bir Kubernetes LoadBalancer hizmeti oluşturmak mümkün olsa da, karışıklığı ve olası güvenlik risklerini önlemek için daha yaygın MQTT bağlantı noktaları 1883 ve 8883 gibi farklı ayarlara sahip ayrı bir dinleyici oluşturmak daha iyidir.

Düğüm bağlantı noktası

Bağlantıyı test etmenin en kolay yolu dinleyicide NodePort hizmet türünü kullanmaktır. Bu yöntemle, Kubernetes belgelerinde <nodeExternalIP>:<NodePort>gösterildiği gibi bağlanmak için kullanabilirsiniz.

Örneğin, NodePort hizmet türü ve aio-broker-nodeport hizmet adıyla, 1884 numaralı bağlantı noktasında (düğüm bağlantı noktası 31884) dinleyen yeni bir aracı dinleyicisi oluşturmak için aşağıdaki adımları izleyin.

  1. Azure portalında IoT İşlemleri örneğine gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. NodePort için MQTT broker dinleyicisini seçin>Oluştur. Hizmet türü başına yalnızca bir dinleyici oluşturabilirsiniz. Zaten aynı hizmet türünde bir dinleyiciniz varsa, var olan dinleyiciye daha fazla bağlantı noktası ekleyebilirsiniz.

    Dikkat

    Kimlik doğrulamasını Yok olarak ayarlamak ve TLS'yi yapılandırmamak, kimlik doğrulamasını ve TLS'yi yalnızca test amacıyla kapatır.

    Aşağıdaki ayarları girin:

    Ayarlar Değer
    İsim aio-broker-nodeport
    Hizmet adı Boş bırakın veya aio-broker-nodeport kullanın.
    Port 1884
    Kimlik Doğrulaması Var olan veya Yok seçeneğini belirleyin.
    Yetkilendirme Var olan veya Yok seçeneğini belirleyin.
    Protokol MQTT'yi seçin.
    Düğüm bağlantı noktası 31884
  4. Bağlantı noktasında TLS Ekle'yi seçerek dinleyiciye TLS>ayarları ekleyin. Test için TLS'ye ihtiyacınız yoksa bu adım gerekli değildir. Daha fazla bilgi için bkz . BrokerListener.

  5. Dinleyiciyi oluşturmak için Oluştur'u seçin.

Not

Kubernetes varsayılan olarak düğüm bağlantı noktası numarası 30000 ile 32767 arasında olmalıdır.

Düğümün dış IP adresini alın:

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

Çıkış aşağıdaki örneğe benzer görünmelidir:

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

Aracıya bağlanmak için dış IP adresini ve düğüm bağlantı noktasını kullanın. Örneğin, aracıya bir ileti yayımlamak için:

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

Eğer çıktıda dış IP yoksa, muhtemelen k3s, k3d veya minikube gibi düğümün dış IP adresini varsayılan olarak göstermeyen bir Kubernetes kurulumu kullanıyorsunuzdur. Bu durumda, aynı ağdaki makinelerden düğüm portu ile birlikte dahili IP üzerinden brokera erişebilirsiniz. Örneğin, düğümün iç IP adresini almak için:

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

Çıkış aşağıdaki örneğe benzer görünmelidir:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Ardından, aynı küme içindeki bir makineden aracıya bağlanmak için iç IP adresini ve düğüm bağlantı noktasını kullanın. Kubernetes tek düğümlü k3'ler gibi yerel bir makinede çalışıyorsa, genellikle iç IP adresi yerine kullanabilirsiniz localhost . Kubernetes, k3d gibi bir Docker kapsayıcısında çalışıyorsa, iç IP adresi kapsayıcının IP adresine karşılık gelir ve konak makineden erişilebilir olmalıdır.

Yük Dengeleyici

Aracıyı internete açık hale getirmenin bir diğer yolu LoadBalancer hizmet türünü kullanmaktır. Bu yöntem daha karmaşıktır ve bağlantı noktası iletmeyi ayarlama gibi daha fazla yapılandırma gerektirebilir.

Örneğin, LoadBalancer hizmet türü, aio-broker-loadbalancer hizmet adı ile ve 1883 numaralı bağlantı noktasında dinleyen yeni bir aracı dinleyicisi oluşturmak için şu adımları izleyin.

  1. Azure portalında IoT İşlemleri örneğine gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. NodePort için MQTT broker dinleyicisini seçin>Oluştur. Hizmet türü başına yalnızca bir dinleyici oluşturabilirsiniz. Zaten aynı hizmet türünde bir dinleyiciniz varsa, var olan dinleyiciye daha fazla bağlantı noktası ekleyebilirsiniz.

    Dikkat

    Kimlik doğrulamasını Yok olarak ayarlamak ve TLS'yi yapılandırmamak, kimlik doğrulamasını ve TLS'yi yalnızca test amacıyla kapatır.

    Aşağıdaki ayarları girin:

    Ayarlar Değer
    İsim aio-broker-loadbalancer
    Hizmet adı Boş bırakın veya aio-broker-loadbalancer kullanın.
    Port 1883
    Kimlik Doğrulaması Var olan veya Yok seçeneğini belirleyin.
    Yetkilendirme Var olan veya Yok seçeneğini belirleyin.
    Protokol MQTT'yi seçin.
  4. Bağlantı noktasında TLS Ekle'yi seçerek dinleyiciye TLS>ayarları ekleyin. Test için TLS'ye ihtiyacınız yoksa bu adım gerekli değildir. Daha fazla bilgi için bkz . BrokerListener.

  5. Dinleyiciyi oluşturmak için Oluştur'u seçin.

  6. Dinleyiciyi oluşturmak için Oluştur'u seçin.

Aracı hizmetinin dış IP adresini alın:

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

Çıktı aşağıdaki örneğe benzer görünüyorsa:

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

Ardından yük dengeleyici hizmetine bir dış IP atandı. Aracıya bağlanmak için dış IP adresini ve bağlantı noktasını kullanabilirsiniz. Örneğin, aracıya bir ileti yayımlamak için:

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

Harici IP atanmamışsa, aracıya erişmek için port yönlendirme veya sanal bir anahtar kullanmanız gerekebilir.

Bağlantı yönlendirmesini kullanın

With minikube, kind ve diğer küme öykünme sistemleriyle, dış IP otomatik olarak atanamayabilir. Örneğin, durum Beklemede görünebilir.

  1. Aracıya erişmek için aracı dinleyici bağlantı noktasını konağa iletin.

    # 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. Bağlantı noktası iletme komutunu terminalde çalışır durumda bırakın.

  3. Bağlantı noktası iletme olmadan örnekle aynı kimlik doğrulaması ve TLS yapılandırmasıyla konak bağlantı noktasında aracıya bağlanın.

Minikube hakkında daha fazla bilgi için bkz. Bir Kümedeki Uygulamalara Erişmek için Bağlantı Noktası Yönlendirmesi Kullanma.

AKS Uç Temel Bileşenleri'ta bağlantı noktası iletme

AKS Uç Temel Bileşenleri için birkaç adım daha gerçekleştirmeniz gerekir. AKS Uç Temel Bileşenleri ile dış IP adresini almak aracıya bağlanmak için yeterli olmayabilir. Aracının hizmetine giden trafiğe izin vermek için port yönlendirmeyi ayarlamanız ve güvenlik duvarında bağlantı noktasını açmanız gerekebilir.

  1. İlk olarak, broker yük dengeleyici dinleyicisinin dış IP adresini alın:

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

    Çıktı aşağıdaki örneğe benzer görünmelidir:

    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. Dış IP adresi broker-loadbalancer ve 192.168.0.4 numaralı bağlantı noktasındaki 1883 servisine aktarımı ayarlayın.

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Brokerın hizmetine trafiğin izin vermesi için güvenlik duvarında portu açın.

    New-NetFirewallRule -DisplayName "Azure IoT Operations MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. MQTT aracısına bağlanmak için konağın genel IP adresini kullanın.

Bağlantı noktası iletme hakkında daha fazla bilgi için bkz . Kubernetes hizmetlerini dış cihazlara sunma.

Localhost üzerinden erişim

Bazı Kubernetes dağıtımları, MQTT aracısını küme yapılandırmasının bir parçası olarak konak sistemindeki () bir bağlantı noktasında kullanıma açabilir.localhost Aynı konak üzerindeki istemcilerin MQTT aracısına erişmesini kolaylaştırmak için bu yaklaşımı kullanın.

Örneğin, MQTT aracısının varsayılan MQTT bağlantı noktası 1883'ü localhost:1883 ile eşleyen bir k3d kümesi oluşturmak için:

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

Veya mevcut bir kümeyi güncelleştirmek için:

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

Ardından, localhost ve bağlantı noktasını kullanarak aracıya bağlanın. Örneğin, aracıya bir ileti yayımlamak için:

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

Yalnızca test için TLS ve kimlik doğrulamasını kapatma

MQTT aracısının varsayılan olarak TLS ve hizmet hesapları kimlik doğrulamasını kullanmasının nedeni, IoT çözümünüzün saldırganlara yanlışlıkla maruz kalmasını en aza indiren varsayılan olarak güvenli bir deneyim sağlamaktır. Üretimde TLS ve kimlik doğrulamasını kapatmamalısınız. Kimlik doğrulaması ve TLS olmadan MQTT aracısını İnternet'e ifşa etmek yetkisiz erişime ve hatta dağıtılmış hizmet reddi saldırılarına neden olabilir.

Uyarı

Riskleri anlıyorsanız ve iyi kontrol edilen bir ortamda güvensiz bir bağlantı noktası kullanmanız gerekiyorsa, tls ve authenticationRef ayarlarını dinleyici yapılandırmasından kaldırarak TLS'yi ve kimlik doğrulamayı test amaçlı kapatabilirsiniz.

  1. Azure portalında IoT İşlemleri örneğine gidin.

  2. Bileşenler'in altında MQTT Aracısı'ni seçin.

  3. NodePort için MQTT aracı dinleyicisini veya LoadBalancer için MQTT aracı dinleyicisini seçin>Oluştur. Hizmet türü başına yalnızca bir dinleyici oluşturabilirsiniz. Zaten aynı hizmet türünde bir dinleyiciniz varsa, var olan dinleyiciye daha fazla bağlantı noktası ekleyebilirsiniz.

    Dikkat

    Kimlik doğrulamasını Yok olarak ayarlamak ve TLS'yi yapılandırmamak, kimlik doğrulamasını ve TLS'yi yalnızca test amacıyla kapatır.

    Aşağıdaki ayarları girin:

    Ayarlar Değer
    İsim Dinleyici için bir ad girin.
    Hizmet adı Bir hizmet adı girin.
    Port Bir bağlantı noktası numarası girin.
    Kimlik Doğrulaması Yok'u seçin.
    Yetkilendirme Yok'u seçin.
    Protokol MQTT'yi seçin.
    Düğüm bağlantı noktası Düğüm portunu kullanıyorsanız 30000 ile 32767 arasında bir sayı girin.
  4. Dinleyiciyi oluşturmak için Oluştur'u seçin.