MQTTnet は、MQTT ベースの通信用の、オープンソースのハイ パフォーマンス .NET ライブラリです。 この記事では、Kubernetes サービス アカウント トークンと MQTTnet を使用して MQTT ブローカーに接続する方法について説明します。 サービス アカウント トークンを使用して、クラスター内アプリケーションに接続します。
サンプル コード
サンプル コードでは、次の処理が行われます。
MqttFactory
クラスを使用して MQTT クライアントを作成します。var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
Kubernetes ポッド仕様では、コンテナー ファイル システムにサービス アカウントがマウントされ、ファイルの内容が読み取られます。 マウントされたトークンは、既知のユーザー名
K8S-SAT
を持つパスワードとして使用されます。static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
MQTT クライアント オプションは、
MqttClientOptions
クラスを使用して構成されます。MqttClientOptionsBuilder
ドキュメントで推奨されるは、オプションを設定する推奨される方法です。var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
MQTT クライアント オプションを設定した後、接続を確立できます。 次のコードは、サーバーに接続する方法を示しています。 必要に応じて、
CancellationToken.None
を有効な CancellationToken に置き換えることができます。var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
プロパティを直接使用するか、
MqttApplicationMessageBuilder
を使用して MQTT メッセージを作成します。 このクラスは、さまざまなペイロード形式を処理するためのオーバーロードを提供します。 ビルダーAPIでは、流暢なデザインが使用されています。 次のコードは、アプリケーション メッセージを作成し、 sampletopic というトピックに発行する方法を示しています。var applicationMessage = new MqttApplicationMessageBuilder() .WithTopic("sampletopic") .WithPayload("samplepayload" + counter++) .Build(); await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
ポッド仕様
ポッド構成の serviceAccountName
フィールドは、使用されているトークンに関連付けられているサービス アカウントと一致する必要があります。 また、 serviceAccountToken.expirationSeconds
は 86400 秒に設定されており、有効期限が切れると、ディスクからトークンを再読み込みする必要があることに注意してください。 このロジックは、このサンプルでは実装されていません。
apiVersion: v1
kind: ServiceAccount
metadata:
name: mqtt-client
namespace: azure-iot-operations
---
apiVersion: v1
kind: Pod
metadata:
name: mqtt-client-dotnet
namespace: azure-iot-operations
spec:
serviceAccountName: mqtt-client
volumes:
# The SAT token authenticates the application with the MQTT broker
- name: mqtt-client-token
projected:
sources:
- serviceAccountToken:
path: mqtt-client-token
audience: aio-internal
expirationSeconds: 86400
# Certificate chain for the application to validate the MQTT broker
- name: aio-ca-trust-bundle
configMap:
name: azure-iot-operations-aio-ca-trust-bundle
containers:
- name: mqtt-client-dotnet
image: ghcr.io/azure-samples/explore-iot-operations/mqtt-client-dotnet:latest
volumeMounts:
- name: mqtt-client-token
mountPath: /var/run/secrets/tokens/
- name: aio-ca-trust-bundle
mountPath: /var/run/certs/aio-internal-ca-cert/
env:
- name: hostname
value: "aio-broker"
- name: tcpPort
value: "18883"
- name: useTls
value: "true"
- name: caFile
value: "/var/run/certs/aio-internal-ca-cert/ca.crt"
- name: satAuthFile
value: "/var/run/secrets/tokens/mqtt-client-token"
README の手順に従ってサンプルを実行します。