MQTT ブローカーのコア設定を構成する
重要
Azure Arc によって有効にされる Azure IoT Operations Preview は、 現在プレビュー段階です。 運用環境ではこのプレビュー ソフトウェアを使わないでください。
一般公開されたリリースが利用可能になった場合に、新しい Azure IoT Operations を表示する必要があります。プレビュー段階のインストールをアップグレードすることはできません。
ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
Broker リソースは、MQTT ブローカーの全体的な設定を定義するメイン リソースです。 また、フロントエンドやバックエンドなど、"ブローカー" 構成を実行するポッドの数と種類も決定します。 Broker リソースを使用して、そのメモリ プロファイルを構成することもできます。 自己復旧メカニズムはブローカーに組み込まれており、多くの場合、コンポーネントの障害から自動的に復旧できます。 たとえば、高可用性のために構成された Kubernetes クラスターでノードが失敗するとします。
フロントエンド レプリカとバックエンド チェーンを追加することで、MQTT ブローカーを水平方向にスケーリングできます。 フロントエンド レプリカは、クライアントからの MQTT 接続を受け入れ、バックエンド チェーンに転送する役割を担います。 バックエンド チェーンは、メッセージを格納してクライアントに配信する役割を担います。 フロントエンド ポッドはバックエンド ポッド間にメッセージ トラフィックを分散し、バックエンド冗長係数によって、クラスター内のノード障害に対する回復性を提供するデータ コピーの数が決まります。
スケーリング設定を構成する
重要
現時点では、"ブローカー" リソースは、Azure CLI、Portal、または GitHub アクションを使用して、初期デプロイ時にのみ構成できます。 "ブローカー" 構成の変更が必要な場合は、新しいデプロイが必要です。
MQTT ブローカーのスケーリング設定を構成するには、Broker カスタム リソースの仕様で mode
および cardinality
フィールドを指定する必要があります。 Azure CLI を使用してモードとカーディナリティ設定を設定する方法の詳細については、「az iot ops init」を参照してください。
mode
フィールドには、次のいずれかの値を指定できます。
auto
: この値は、MQTT ブローカー オペレーターがクラスター ハードウェアに基づいて適切な数のポッドを自動的にデプロイすることを示します。 既定値は auto であり、ほとんどのシナリオで使用されます。distributed
: この値は、cardinality
フィールド内のフロントエンド ポッドとバックエンド チェーンの数を手動で指定できることを示します。 このオプションを使用すると、デプロイをより詳細に制御できますが、より多くの構成が必要になります。
cardinality
フィールドは、次のサブフィールドを持つ入れ子になったフィールドです。
frontend
: このサブフィールドは、次のようなフロントエンド ポッドの設定を定義します。replicas
: デプロイするフロントエンド ポッドの数。 このサブフィールドは、mode
フィールドがdistributed
に設定されている場合に必要です。workers
: フロントエンドごとにデプロイするワーカーの数。現在は、1
に設定する必要があります。 このサブフィールドは、mode
フィールドがdistributed
に設定されている場合に必要です。
backendChain
: このサブフィールドは、次のようなバックエンド チェーンの設定を定義します。redundancyFactor
: 各バックエンド チェーン内のデータ コピーの数。 このサブフィールドは、mode
フィールドがdistributed
に設定されている場合に必要です。partitions
: デプロイするパーティションの数。 このサブフィールドは、mode
フィールドがdistributed
に設定されている場合に必要です。workers
: バックエンドごとにデプロイするワーカーの数。現在は、1
に設定する必要があります。 このサブフィールドは、mode
フィールドがdistributed
に設定されている場合に必要です。
メモリ プロファイルを構成する
重要
現時点では、"ブローカー" リソースは、Azure CLI、Portal、または GitHub アクションを使用して、初期デプロイ時にのみ構成できます。 "ブローカー" 構成の変更が必要な場合は、新しいデプロイが必要です。
MQTT ブローカーのメモリ プロファイル設定を構成するには、Broker カスタム リソースの仕様で memoryProfile
フィールドを指定します。 Azure CLI を使用してメモリ プロファイル設定を設定する方法の詳細については、「az iot ops init」を参照してください。
memoryProfile
: このサブフィールドは、メモリ プロファイルの設定を定義します。 選択できるメモリ使用量には、いくつかのプロファイルがあります。
最小
このプロファイルを使用する場合:
- 各フロントエンド レプリカの最大メモリ使用量は約 99 MiB ですが、実際の最大メモリ使用量は高くなる可能性があります。
- 各バックエンド レプリカの最大メモリ使用量は約 102 MiB ですが、実際の最大メモリ使用量は高くなる可能性があります。
このプロファイルを使用する場合の推奨事項:
- 使用するフロントエンドは 1 つだけです。
- クライアントは大きなパケットを送信しないでください。 送信するパケットは 4 MiB 未満にする必要があります。
低
このプロファイルを使用する場合:
- 各フロントエンド レプリカの最大メモリ使用量は約 387 MiB ですが、実際の最大メモリ使用量は高くなる可能性があります。
- 各バックエンド レプリカの最大メモリ使用量は、約 390 MiB にバックエンド ワーカーの数を乗算しますすが、実際の最大メモリ使用量は高くなる可能性があります。
このプロファイルを使用する場合の推奨事項:
- 1 つまたは 2 つのフロントエンドのみを使用する必要があります。
- クライアントは大きなパケットを送信しないでください。 送信するパケットは 10 MiB 未満にする必要があります。
中
Medium は既定のプロファイルです。
- 各フロントエンド レプリカの最大メモリ使用量は約 1.9 GiB ですが、実際の最大メモリ使用量は高くなる可能性があります。
- 各バックエンド レプリカの最大メモリ使用量は、約 1.5 GiB にバックエンド ワーカーの数を乗算しますすが、実際の最大メモリ使用量は高くなる可能性があります。
高
- 各フロントエンド レプリカの最大メモリ使用量は約 4.9 GiB ですが、実際の最大メモリ使用量は高くなる可能性があります。
- 各バックエンド レプリカの最大メモリ使用量は、約 5.8 GiB にバックエンド ワーカーの数を乗算しますすが、実際の最大メモリ使用量は高くなる可能性があります。
既定のブローカー
Azure IoT Operations プレビューでは、既定で broker
という名前の既定のブローカー リソースをデプロイします。 これは、Azure portal または Azure CLI を使用した初期デプロイ時に構成されたカーディナリティとメモリ プロファイル設定を使用して azure-iot-operations
名前空間にデプロイされます。 設定を確認するには、次のコマンドを実行します。
kubectl get broker broker -n azure-iot-operations -o yaml
再デプロイすることで既定のブローカーを変更する
初期デプロイ時に Azure portal または Azure CLI を使用して構成できるのは、カーディナリティとメモリ プロファイルだけです。 その他の設定は、YAML ファイルを変更し、ブローカーを再デプロイすることでしか構成できません。
既定のブローカーを削除するには、次のコマンドを実行します。
kubectl delete broker broker -n azure-iot-operations
次に、必要な設定で YAML ファイルを作成します。 たとえば、次の YAML ファイルは、broker
という名前のブローカーを名前空間 azure-iot-operations
内に medium
メモリ プロファイルと distributed
モードで、それぞれ 2 つのパーティションと 2 つのワーカーを持つ 2 つのフロントエンド レプリカと 2 つのバックエンド チェーンで構成します。 また、内部トラフィックの暗号化オプションは無効になっています。
apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: Broker
metadata:
name: broker
namespace: azure-iot-operations
spec:
memoryProfile: medium
mode: distributed
cardinality:
backendChain:
partitions: 2
redundancyFactor: 2
workers: 2
frontend:
replicas: 2
workers: 2
encryptInternalTraffic: false
そして、次のコマンドを実行してブローカーをデプロイします。
kubectl apply -f <path-to-yaml-file>
MQTT ブローカーの詳細設定を構成する
次の表に、クライアント構成、内部トラフィックの暗号化、証明書のローテーション、ノードの容認を含むブローカーの詳細設定のプロパティを示します。
名前 | 種類 | 説明 |
---|---|---|
クライアント | ClientConfig | すべてのクライアントに関連する構成 |
clients.maxKeepAliveSeconds | integer |
クライアントのキープ アライブの上限 (秒単位) |
clients.maxMessageExpirySeconds | integer |
メッセージの有効期限間隔の上限 (秒単位) |
clients.maxReceiveMaximum | integer |
クライアントが CONNECT パケットで要求できる受信最大値の上限 |
clients.maxSessionExpirySeconds | integer |
セッションの有効期限間隔の上限 (秒単位) |
clients.subscriberQueueLimit | SubscriberQueueLimit |
サブスクライバーのキューに登録されるメッセージ数の制限 |
clients.subscriberQueueLimit.length | integer |
メッセージがドロップされるまでのキューの最大長 |
clients.subscriberQueueLimit.strategy | SubscriberMessageDropStrategy |
キューからメッセージをドロップする戦略 |
clients.subscriberQueueLimit.strategy.DropOldest | string |
最も古いメッセージがドロップされます |
clients.subscriberQueueLimit.strategy.None | string |
メッセージはドロップされません |
encryptInternalTraffic | Encrypt | 内部トラフィックの暗号化を有効または無効にする設定 |
encryptInternalTraffic.Disabled | string |
内部トラフィック暗号化を無効にします |
encryptInternalTraffic.Enabled | string |
内部トラフィック暗号化を有効にします |
internalCerts | CertManagerCertOptions | 証明書のローテーションと秘密キーの構成 |
internalCerts.duration | string |
証明書の有効期間。 Go time.Duration 形式 (h、m、s) を使用して指定する必要があります。 たとえば、240 時間の場合は 240h、45 分の場合は 45m です。 |
internalCerts.privateKey | CertManagerPrivateKey |
証明書の秘密キーの構成 |
internalCerts.renewBefore | string |
証明書を更新するまでの期間。 Go time.Duration 形式 (h、m、s) を使用して指定する必要があります。 たとえば、240 時間の場合は 240h、45 分の場合は 45m です。 |
internalCerts.privateKey.algorithm | PrivateKeyAlgorithm | 秘密キーのアルゴリズム |
internalCerts.privateKey.rotationPolicy | PrivateKeyRotationPolicy | 証明書マネージャーの秘密キーのローテーション ポリシー |
internalCerts.privateKey.algorithm.Ec256 | string |
アルゴリズム - EC256 |
internalCerts.privateKey.algorithm.Ec384 | string |
アルゴリズム - EC384 |
internalCerts.privateKey.algorithm.Ec521 | string |
アルゴリズム - EC521 |
internalCerts.privateKey.algorithm.Ed25519 | string |
アルゴリズム - Ed25519 |
internalCerts.privateKey.algorithm.Rsa2048 | string |
アルゴリズム - RSA2048 |
internalCerts.privateKey.algorithm.Rsa4096 | string |
アルゴリズム - RSA4096 |
internalCerts.privateKey.algorithm.Rsa8192 | string |
アルゴリズム - RSA8192 |
internalCerts.privateKey.rotationPolicy.Always | string |
常にキーをローテーションする |
internalCerts.privateKey.rotationPolicy.Never | string |
キーをローテーションしない |
tolerations | NodeTolerations | すべての Broker ポッドに適用される容認の詳細 |
tolerations.effect | string |
容認の効果 |
tolerations.key | string |
容認キー |
tolerations.operator | TolerationOperator |
容認演算子。 たとえば、"Exists" や "Equal" などです。 |
tolerations.value | string |
容認値 |
tolerations.operator.Equal | string |
等号演算子 |
tolerations.operator.Exists | string |
Exists 演算子 |
以下は、詳細設定を指定した Broker の例です。
apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: Broker
metadata:
name: broker
namespace: azure-iot-operations
spec:
advanced:
clients:
maxSessionExpirySeconds: 282277
maxMessageExpirySeconds: 1622
subscriberQueueLimit:
length: 1000
strategy: DropOldest
maxReceiveMaximum: 15000
maxKeepAliveSeconds: 300
encryptInternalTraffic: Enabled
internalCerts:
duration: 240h
renewBefore: 45m
privateKey:
algorithm: Rsa2048
rotationPolicy: Always
tolerations:
effect: string
key: string
operator: Equal
value: string
MQTT ブローカー診断設定を構成する
診断設定を使用すると、MQTT ブローカーのメトリックとトレースを有効にすることができます。
- メトリックは、MQTT ブローカーのリソース使用量とスループットに関する情報を提供します。
- トレースは、MQTT ブローカーによって処理される要求と応答に関する詳細情報を提供します。
MQTT ブローカーの既定の診断設定をオーバーライドするには、Broker リソースの spec.diagnostics
セクションを更新します。 ログ レベルを調整して、ログされる情報の量と詳細度を制御します。 ログ レベルは、MQTT ブローカーのさまざまなコンポーネントに対して設定できます。 デフォルトのログ レベルは info
です。
Broker カスタム リソース定義 (CRD) を使用して診断を構成できます。 次の表に、ブローカー診断設定のプロパティとすべての既定値を示します。
Name | 形式 | 既定値 | 説明 |
---|---|---|---|
logs.exportIntervalSeconds | integer | 30 | ログをオープン テレメトリ コレクターにエクスポートする頻度 |
logs.exportLogLevel | string | エラー | エクスポートするログのレベル |
logs.level | string | info | ログ レベル。 例: debug 、info 、warn 、error 、trace |
logs.openTelemetryCollectorAddress | string | エクスポート先のオープン テレメトリ コレクター エンドポイント | |
metrics.exportIntervalSeconds | integer | 30 | オープン テレメトリ コレクターにメトリックをエクスポートする頻度 |
metrics.mode | MetricsEnabled | Enabled | メトリックを有効または無効にするトグル。 |
metrics.openTelemetryCollectorAddress | string | エクスポート先のオープン テレメトリ コレクター エンドポイント | |
metrics.prometheusPort | integer | 9600 | メトリックを公開するための prometheus ポート |
metrics.stalenessTimeSeconds | integer | 600 | メトリックが古くなり、メトリック キャッシュからドロップするかどうかを判断するのにかける時間 |
metrics.updateIntervalSeconds | integer | 30 | メトリックを更新する頻度 |
selfcheck.intervalSeconds | integer | 30 | 自己チェック間隔 |
selfcheck.mode | SelfCheckMode | Enabled | 自己チェックを有効または無効にするトグル |
selfcheck.timeoutSeconds | integer | 15 | 自己チェックのタイムアウト |
traces.cacheSizeMegabytes | integer | 16 | キャッシュ サイズ (メガバイト単位) |
traces.exportIntervalSeconds | integer | 30 | オープン テレメトリ コレクターにメトリックをエクスポートする頻度 |
traces.mode | TracesMode | Enabled | トレースを有効または無効にする切り替え |
traces.openTelemetryCollectorAddress | string | エクスポート先のオープン テレメトリ コレクター エンドポイント | |
traces.selfTracing | SelfTracing | 自己トレースのプロパティ | |
traces.spanChannelCapacity | integer | 1000 | スパン チャネル容量 |
メトリックとトレースが有効でセルフチェックが無効になっている Broker カスタム リソースの例を次に示します。
apiVersion: mqttbroker.iotoperations.azure.com/v1beta1
kind: Broker
metadata:
name: broker
namespace: azure-iot-operations
spec:
mode: auto
diagnostics:
logs:
exportIntervalSeconds: 220
exportLogLevel: nym
level: debug
openTelemetryCollectorAddress: acfqqatmodusdbzgomgcrtulvjy
metrics:
stalenessTimeSeconds: 463
mode: Enabled
exportIntervalSeconds: 246
openTelemetryCollectorAddress: vyasdzsemxfckcorfbfx
prometheusPort: 60607
updateIntervalSeconds: 15
selfCheck:
mode: Enabled
intervalSeconds: 106
timeoutSeconds: 70
traces:
cacheSizeMegabytes: 97
mode: Enabled
exportIntervalSeconds: 114
openTelemetryCollectorAddress: oyujxiemzlqlcsdamytj
selfTracing:
mode: Enabled
intervalSeconds: 179
spanChannelCapacity: 47152
内部トラフィックの暗号化を構成する
重要
現時点では、初期デプロイ時に Azure CLI または Azure portal を使用してこの機能を構成することはできません。 この設定を変更するには、YAML ファイルを変更し、ブローカーを再デプロイする必要があります。
encryptInternalTraffic 機能は、フロントエンド ポッドとバックエンド ポッド間の内部トラフィックを暗号化するために使用されます。 この機能を使用するには、クラスターに cert-manager をインストールする必要があります。これは、Azure IoT Operations を使用する場合は既定でインストールされます。
次のようなメリットがあります。
内部トラフィックのセキュリティ保護: フロントエンド ポッドとバックエンド ポッド間のすべての内部トラフィックが暗号化されます。
保存データのセキュリティ保護: すべての保存データが暗号化されます。
転送中のデータのセキュリティ保護: 転送中のすべてのデータが暗号化されます。
メモリ内のデータのセキュリティ保護: メモリ内のすべてのデータが暗号化されます。
メッセージ バッファー内のデータのセキュリティ保護: メッセージ バッファー内のすべてのデータが暗号化されます。
ディスク上のメッセージ バッファー内のデータのセキュリティ保護: ディスク上のメッセージ バッファー内のすべてのデータが暗号化されます。
既定では、encryptInternalTraffic 機能は有効になっています。 この機能を無効にするには、ブローカーを再デプロイするときに、"ブローカー" カスタム リソースの仕様で encryptInternalTraffic
フィールドを false
に設定します。
ディスクベース メッセージ バッファーの動作を構成する
重要
現時点では、初期デプロイ時に Azure CLI または Azure portal を使用してこの機能を構成することはできません。 この設定を変更するには、YAML ファイルを変更し、ブローカーを再デプロイする必要があります。
diskBackedMessageBufferSettings 機能は、MQTT ブローカー分散 MQTT ブローカー内のメッセージ キューを効率的に管理するために使用されます。 次のようなメリットがあります。
効率的なキュー管理: MQTT ブローカーでは、各サブスクライバーはメッセージ キューに関連付けられます。 サブスクライバーがメッセージを処理する速度は、キューのサイズに直接影響します。 サブスクライバーがメッセージを処理する速度が遅い場合、または切断しても MQTT 永続セッションを要求する場合、キューは使用可能なメモリよりも大きくなる可能性があります。
永続的なセッションのデータ保持: diskBackedMessageBufferSettings 機能により、キューが使用可能なメモリを超えたときに、ディスクにシームレスにバッファーされます。 この機能は、データ損失を防ぎ、MQTT 永続セッションをサポートするため、サブスクライバーは再接続時にメッセージ キューをそのまま使用してセッションを再開できます。 ディスクはエフェメラル ストレージとして使用され、メモリからのスピルオーバーとして機能します。 ディスクに書き込まれたデータは永続的ではなく、ポッドが終了すると失われますが、各バックエンド チェーン内で少なくとも 1 つのポッドが機能している限り、ブローカー全体でデータが失われることはありません。
接続の課題への対応: クラウド コネクタは、ネットワーク切断のために Event Grid MQTT ブローカーなどの外部システムと通信できない場合に接続の問題に直面する可能性がある永続的なセッションを持つサブスクライバーとして扱われます。 このようなシナリオでは、メッセージ (PUBLISHes) が蓄積されます。 MQTT ブローカーは、接続が復元されるまでこれらのメッセージをメモリまたはディスクにインテリジェントにバッファーし、メッセージの整合性を確保します。
diskBackedMessageBufferSettings 機能を理解して構成することで、堅牢で信頼性の高いメッセージ キュー システムが維持されます。 メッセージ処理速度と接続性が重要な要因であるシナリオでは、適切な構成が重要です。
構成オプション
以下の設定を調整することで、ブローカー メッセージ バッファー オプションを調整します。
ボリュームの構成: メッセージ バッファー用の専用ストレージ ボリュームをマウントするための永続ボリューム要求テンプレートを指定します。
ストレージ クラスの選択:
storageClassName
プロパティを使用して目的の StorageClass を定義します。アクセス モードの定義: ボリュームに必要なアクセス モードを決定します。 詳細については、「永続ボリュームのアクセス モード」を参照してください。
以下のセクションを使用して、さまざまボリューム モードを理解してください。
"エフェメラル" ボリュームが推奨されるオプションです。 その次に推奨されるのが "永続" ボリュームで、その次が emptyDir ボリュームになります。 通常、永続ボリュームとエフェメラル・ボリュームは両方とも、同じストレージ・クラスによって提供されます。 どちらも選択できる場合は、エフェメラルを選択します。 ただし、エフェメラルには Kubernetes 1.23 以上が必要です。
無効
ディスクベースのメッセージ バッファーを使用したくない場合は、"ブローカー" CRD に diskBackedMessageBufferSettings
プロパティを含めないでください。
エフェメラル ボリューム
エフェメラル ボリュームは、メッセージ バッファーに推奨されるオプションです。
"エフェメラル" ボリュームについては、「ストレージ プロバイダーに関する考慮事項」セクションのアドバイスに従ってください。
ephemeralVolumeClaimSpec プロパティの値は、バックエンド チェーンの StatefulSet 仕様のボリュームの ephemeral.volumeClaimTemplate.spec として使用されます。
たとえば、容量が 1 ギガバイトのエフェメラル ボリュームを使用するには、ブローカー CRD で以下のパラメーターを指定します。
diskBackedMessageBufferSettings:
maxSize: "1G"
ephemeralVolumeClaimSpec:
storageClassName: "foo"
accessModes:
- "ReadWriteOnce"
永続ボリューム
永続ボリュームは、"エフェメラル" ボリュームに次いで推奨されるメッセージ バッファー用の選択肢です。
"永続" ボリュームについては、「ストレージ プロバイダーに関する考慮事項」セクションのアドバイスに従ってください。
persistentVolumeClaimSpec プロパティの値は、バックエンド チェーンの StatefulSet 仕様の volumeClaimTemplates.spec として使用されます。
たとえば、容量が 1 ギガバイトの "永続" ボリュームを使用するには、ブローカー CRD で以下のパラメーターを指定します。
diskBackedMessageBufferSettings:
maxSize: "1G"
persistentVolumeClaimSpec:
storageClassName: "foo"
accessModes:
- "ReadWriteOnce"
emptyDir ボリューム
emptyDir ボリュームを使用します。 "emptyDir ボリューム" は、永続ボリュームの次に推奨されるオプションです。
emptyDir ボリュームは、ファイルシステム クォータを持つクラスターを使用するときにだけ使用します。 詳細については、「ファイルシステム プロジェクト クォータ タブ」の詳細を参照してください。この機能が有効になっていない場合、クラスターは "定期的なスキャン" を実行し、どのような制限も適用しないため、ホスト ノードがディスク領域を埋め、ホスト ノード全体が異常とマークされる可能性があります。
たとえば、容量が 1 ギガバイトの emptyDir ボリュームを使用するには、ブローカー CRD で以下のパラメーターを指定します。
diskBackedMessageBufferSettings:
maxSize: "1G"
ストレージ・プロバイダーの考慮事項
選択したストレージ プロバイダーの動作を検討します。 たとえば、rancher.io/local-path
のようなプロバイダーを使用する場合です。 プロバイダーが制限をサポートしていない場合、ボリュームをいっぱいにするとノードのディスク領域が消費されます。 これにより、Kubernetes によってノードおよび関連するすべてのポッドが異常としてマークされる可能性があります。 このようなシナリオで、ご利用のストレージ プロバイダーがどのように動作するかを理解することが重要です。
永続化
diskBackedMessageBufferSettings 機能は "永続性" の同意語ではないことを理解することが重要です。 このコンテキストでは、"永続性" はポッドの再起動後も存続するデータのことを指します。 しかし、この機能が提供するのは、データをディスクに保存するための一時的なストレージ領域であり、ポッドの再起動中のメモリ オーバーフローやデータ損失を防ぎます。