Skip to content

Kubernetes上でのHelmチャートを使用したEMQXのデプロイ

このページでは、公式Helmチャートを使用してKubernetesクラスター上にEMQXをデプロイする手順を段階的に説明します。

公式のEMQX Helmチャートは、StatefulSet、Service、ConfigMap、Ingressルール、Gateway APIルートなど、必要なEMQXコンポーネントをすべてパッケージ化し、単一の設定可能なHelmチャートとして提供することで、Kubernetesベースのデプロイを簡素化します。

前提条件

開始する前に、以下がインストールおよび設定されていることを確認してください:

  • 稼働中のKubernetesクラスター(バージョン1.6以上)
  • Helm

EMQX Helmチャートのインストール

EMQX Helmチャートは、EMQXのGitHubリポジトリまたは公式Helmチャートリポジトリのいずれかからインストールできます。

GitHubからのインストール

GitHubからリリース名 my-emqx でチャートをインストールするには:

bash
$ git clone https://github.com/emqx/emqx.git
$ cd emqx/deploy/charts/emqx-enterprise
$ helm install my-emqx .

Helmリポジトリからのインストール

公式Helmチャートリポジトリからリリース名 my-emqx でチャートをインストールするには:

bash
helm repo add emqx https://repos.emqx.io/charts
helm install my-emqx emqx/emqx-enterprise

安定版以外のバージョンをインストールしたい場合は、--devel フラグを追加してください:

bash
helm install my-emqx emqx/emqx-enterprise --devel

チャートのアンインストール

my-emqx という名前のEMQXリリースを削除し、関連するすべてのKubernetesリソースを削除するには:

Helm v3以降の場合

bash
$ helm uninstall my-emqx

Helm v2(レガシー)の場合

bash
$ helm del my-emqx

設定パラメータ

EMQX Helmチャートは、values.yaml ファイルを通じて幅広い設定パラメータを提供します。以下の表は主なパラメータとデフォルト値を示しています。

パラメータ説明デフォルト値
replicaCountネットワーク分断時の自動復旧のため、ノード数は奇数を推奨します。3
image.repositoryEMQXイメージ名emqx/emqx-enterprise
image.pullPolicyイメージのプルポリシーIfNotPresent
image.pullSecretsイメージプルシークレット[](デプロイされたポッドにイメージプルシークレットを追加しません)
serviceAccount.createtrue の場合、新しいサービスアカウントを作成します。true
serviceAccount.name使用するサービスアカウント。未設定かつ serviceAccount.createtrue の場合、フルネームテンプレートで名前が生成されます。
serviceAccount.annotationsサービスアカウントに追加するアノテーション
envFromSecret同じKubernetesネームスペース内のシークレット名。環境変数として値が追加されます。nil
recreatePodsアップグレード時にポッドの再作成を強制し、常に最新設定を適用するのに役立ちます。false
podAnnotationsポッドに付与するアノテーション{}
podManagementPolicy既存のPVCを持つチャートを再デプロイする場合は、デッドロックを避けるために Parallel に設定してください。Parallel
persistence.enabledPVCを使用したEMQXのパーシステンスを有効にします。false
persistence.storageClassバックエンドPVCのストレージクラスnil(alphaストレージクラスアノテーションを使用)
persistence.existingClaimEMQXデータ用の既存Persistent Volumeクレーム名。テンプレートとして評価されます。""
persistence.accessModeEMQXボリューム用PVCのアクセスモードReadWriteOnce
persistence.sizeEMQXボリューム用PVCのストレージ要求サイズ20Mi
initContainersEMQXコンテナ作成前に実行されるコンテナ。ユーティリティやセットアップスクリプトを含めることができます。{}
resourcesCPU/メモリのリソース要求/制限{}
extraVolumeMountsデフォルトのバックエンドコンテナに追加するvolumeMounts[]
extraVolumesデフォルトのバックエンドポッドに追加するボリューム[]
nodeSelectorポッド割り当て用のノードラベル{}
tolerationsポッド割り当て用のトレランス[]
affinityノード/ポッドのアフィニティマップ{}
service.typeKubernetes ServiceのタイプClusterIP
service.mqttMQTT用ポート1883
service.mqttsslMQTT(SSL)用ポート8883
service.wsWebSocket/HTTP用ポート8083
service.wssWSS/HTTPS用ポート8084
service.wsEnabledServiceでWebSocketおよびWSSポートを公開します。httpRoute.ws.enabled または tlsRoute.wss.enabled を有効にする場合は必ず true にしてください。true
service.dashboardダッシュボードおよびAPI用ポート18083
service.customPortsServiceで公開するカスタムポート{}
service.nodePorts.mqttMQTT用Kubernetesノードポートnil
service.nodePorts.mqttsslMQTT(SSL)用Kubernetesノードポートnil
service.nodePorts.wsWebSocket/HTTP用Kubernetesノードポートnil
service.nodePorts.wssWSS/HTTPS用Kubernetesノードポートnil
service.nodePorts.dashboardダッシュボード用Kubernetesノードポートnil
service.customNodePortsカスタムポート用Kubernetesノードポート{}
service.loadBalancerClassこのServiceが属するロードバランサー実装
service.loadBalancerIPServiceのloadBalancerIPnil
service.loadBalancerSourceRangesLoadBalancerサービスで許可されるアドレス[]
service.externalIPsServiceのExternalIPs[]
service.externalTrafficPolicyServiceのExternal Traffic PolicyCluster
service.annotationsService/ServiceMonitorのアノテーション{}(テンプレートとして評価)
service.labelsService/ServiceMonitorのラベル{}(テンプレートとして評価)
ingress.dashboard.enabledEMQXダッシュボード用のIngressを有効化false
ingress.dashboard.ingressClassNameEMQXダッシュボード用Ingressクラスを設定
ingress.dashboard.pathEMQXダッシュボード用Ingressパス/
ingress.dashboard.pathTypeEMQXダッシュボード用IngressのpathTypeImplementationSpecific
ingress.dashboard.hostsEMQXダッシュボード用Ingressホストdashboard.emqx.local
ingress.dashboard.tlsEMQXダッシュボード用Ingress TLS[]
ingress.dashboard.annotationsEMQXダッシュボード用Ingressアノテーション{}
ingress.dashboard.ingressClassNameEMQXダッシュボード用Ingressクラスを設定
ingress.mqtt.enabledMQTT用Ingressを有効化false
ingress.mqtt.ingressClassNameMQTT用Ingressクラスを設定
ingress.mqtt.pathMQTT用Ingressパス/
ingress.mqtt.pathTypeMQTT用IngressのpathTypeImplementationSpecific
ingress.mqtt.hostsMQTT用Ingressホストmqtt.emqx.local
ingress.mqtt.tlsMQTT用Ingress TLS[]
ingress.mqtt.annotationsMQTT用Ingressアノテーション{}
ingress.mqtt.ingressClassNameMQTT用Ingressクラスを設定
metrics.enabletrueの場合、prometheus-operator のインストールとemqx_prometheusの有効化が必要です。false
metrics.type現在サポートされているのは "prometheus" のみです。"prometheus"
ssl.enabledSSLサポートを有効化false
ssl.useExisting既存の証明書を使用するか、cert-managerに生成させるかfalse
ssl.existingName既存証明書の名前emqx-tls
ssl.dnsnames生成される証明書のDNS名{}
ssl.commonName生成される証明書の共通名
ssl.issuer.name証明書生成用のIssuer名letsencrypt-dns
ssl.issuer.kind証明書生成用のIssuer種別ClusterIssuer

EMQX固有のパラメータ

以下の表は、チャートの設定可能なEMQX固有パラメータとそのデフォルト値を示しています。

パラメータ説明デフォルト値
emqxConfig環境変数EMQX_プレフィックスは任意)またはEMQX設定ファイルで使用される名前空間付きドット表記を用いて定義された設定項目のマップ。nil
emqxLicenseSecretNameライセンス情報を保持するシークレットの名前(非推奨)nil
emqxLicenseSecretRef.nameライセンス情報を保持するシークレットの名前""
emqxLicenseSecretRef.keyライセンス情報を保持するシークレットのキー""

フィーチャーゲートの設定

EMQX 6.3.0以降、EMQX_FEATURES を設定して起動時に利用可能なオプション機能を制御できます。例:

yaml
emqxConfig:
  EMQX_FEATURES: "dashboard,metrics,plugins"

フィーチャーゲートはEMQX起動時にのみ解決されます。この値を変更した場合は、EMQXポッドを再作成または再起動してください。全フィーチャーリストと依存関係の詳細はフィーチャーゲートを参照してください。

Gateway APIルートの設定

EMQX 6.3以降、EMQX Enterprise HelmチャートはIngressリソースの代替としてKubernetes Gateway APIルートを作成できます。HTTPRoute はEMQXダッシュボードとWebSocket経由のMQTTを公開し、TLSRoute はTLSパススルーによるMQTTSおよびWSSを公開します。

ルートを有効化する前に、以下の前提条件を満たしてください:

  • Gateway APIコントローラーおよびそのカスタムリソース定義(CRD)をインストールする。
  • tlsRoute.mqtts または tlsRoute.wss を有効にするには、Kubernetes 1.31以降およびGateway API standard-channel CRDバージョン1.5.0以降が必要です。Gateway APIコントローラーはパススルーモードの TLSRoute をサポートしている必要があります。
  • httpRoute.ws を有効にするには、ServicePort.appProtocol を必要としないHTTPRoute WebSocketトラフィックをサポートするGateway APIコントローラーを使用してください。EMQX HelmチャートはWebSocket用Serviceポートに appProtocol を設定しません。
  • ルートに対応するリスナーを持つGatewayを作成する。
  • tlsRoute.mqttstlsRoute.wss で使用されるGateway TLSリスナーを tls.mode: Passthrough に設定する。EMQXがTLS接続を終了します。

すべてのルートはデフォルトで無効です。有効にするルートごとに parentRefs を設定し、ルートをGatewayにアタッチしてください。以下はすべてのサポートされるルートを有効にする values.yaml の例です:

yaml
service:
  wsEnabled: true

httpRoute:
  dashboard:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: https
    hostnames:
      - dashboard.emqx.local
    path: /
    pathType: PathPrefix
  ws:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: https
    hostnames:
      - ws.emqx.local
    path: /mqtt
    pathType: PathPrefix

tlsRoute:
  mqtts:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: mqtts
    hostnames:
      - mqtt.emqx.local
  wss:
    enabled: true
    parentRefs:
      - name: emqx-gateway
        namespace: default
        sectionName: wss
    hostnames:
      - wss.emqx.local

Gateway名、ネームスペース、リスナーセクション名、およびホスト名は環境に合わせて置き換えてください。GatewayとHelmリリースが異なるネームスペースにある場合は、参照される各Gatewayリスナーで allowedRoutes を設定し、Helmリリースのネームスペースからのルートを許可してください。チャートは以下のルートを作成します:

ルートバックエンドサービスポートデフォルトパス
httpRoute.dashboardダッシュボードおよびAPI(ポート 18083/
httpRoute.wsWebSocket経由のMQTT(ポート 8083/mqtt
tlsRoute.mqttsMQTTS(ポート 8883該当なし
tlsRoute.wssWSS(ポート 8084該当なし

重要なお知らせ

httpRoute.ws または tlsRoute.wss を有効にする場合は、必ず service.wsEnabledtrue に設定してください。そうしないと、Helmは httpRoute.ws.enabled requires service.wsEnabled=true または tlsRoute.wss.enabled requires service.wsEnabled=true のエラーでチャートのレンダリングを停止します。

リリースのインストールまたはアップグレード後、ルートのステータスを確認してください:

bash
kubectl get httproute,tlsroute -o yaml

アタッチされた各ルートについて、status.parents 内の Accepted および ResolvedRefs 条件が True であることを確認してください。コントローラーが Programmed 条件を報告している場合は、それも True であることを確認してください。

ルート条件はエンドツーエンドのトラフィックを検証しません。設定したダッシュボードまたはWebSocketのホスト名にリクエストを送信するか、Gateway経由でMQTTSまたはWSS接続を確立し、ルートがEMQXへのトラフィック転送を正しく行えることを確認してください。

Gateway APIルートのパラメータは以下の通りです:

パラメータ説明デフォルト値
httpRoute.<route>.enableddashboard または ws のHTTPRouteを作成します。false
httpRoute.<route>.annotationsHTTPRouteに追加するアノテーション。{}
httpRoute.<route>.labelsHTTPRouteに追加するラベル。{}
httpRoute.<route>.parentRefs親Gatewayおよびリスナーへの参照。[]
httpRoute.<route>.hostnamesルートがマッチするホスト名。dashboard.emqx.local(dashboard)、ws.emqx.local(ws)
httpRoute.<route>.pathルートがマッチするパス。/(dashboard)、/mqtt(ws)
httpRoute.<route>.pathTypeパスマッチのタイプ。PathPrefix
tlsRoute.<route>.enabledmqtts または wss のTLSRouteを作成します。false
tlsRoute.<route>.annotationsTLSRouteに追加するアノテーション。{}
tlsRoute.<route>.labelsTLSRouteに追加するラベル。{}
tlsRoute.<route>.parentRefs親GatewayおよびTLSリスナーへの参照。[]
tlsRoute.<route>.hostnamesルートがマッチする必須のSNIホスト名。少なくとも1つの有効なFQDNを含む必要があります。mqtt.emqx.local(mqtts)、wss.emqx.local(wss)

SSL設定

cert-manager を使用する場合、TLS証明書はKubernetesシークレットに標準キー tls.crttls.key で格納されます。EMQX Helmチャートはこれらの証明書ファイルをコンテナ内の以下のディレクトリに自動的にマウントします:

/tmp/ssl/

EMQXでSSLサポートを有効にするには、EMQX設定内でファイルパスを明示的に設定する必要があります。これはEMQX設定ファイルを修正するか、以下の環境変数を渡すことで行えます:

yaml
EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__CERTFILE: /tmp/ssl/tls.crt
EMQX_LISTENERS__SSL__DEFAULT__SSL_OPTIONS__KEYFILE: /tmp/ssl/tls.key

TIP

既存のTLS証明書を使用する場合(cert-managerによる生成ではない場合)、ファイルパスが実際のマウント先と一致していることを確認してください。

Proxy Protocolサポート(HAProxy、Nginx)

Proxy Protocolをサポートするリバースプロキシ(例:HAProxyやNginx)の背後にEMQXをデプロイする場合、以下の環境変数を設定して有効にしてください:

yaml
EMQX_LISTENERS__TCP__DEFAULT__PROXY_PROTOCOL: "true"

HAProxy Ingress Controllerを使用する場合は、以下のアノテーションを追加してください:

yaml
haproxy-ingress.github.io/proxy-protocol: "v2"

これにより、プロキシを通過する元のクライアントIPアドレスが保持されます。