Skip to content

Amazon Elastic Kubernetes Service 上に EMQX をデプロイする ​

EMQX Operator は Amazon Container Service の EKS(Elastic Kubernetes Service)上での実行をサポートしています。Amazon EKS はコンテナ化されたアプリケーションのデプロイ、管理、スケーリングを簡素化するマネージド Kubernetes サービスです。EKS は Kubernetes のコントロールプレーンとノードグループを提供し、ノードの置き換え、アップグレード、パッチ適用を自動で行います。また、AWS のロードバランサー、RDS、IAM などのサービスをサポートし、他の Kubernetes エコシステムツールとシームレスに統合されます。

詳細な紹介については、Amazon EKS とはをご参照ください。

はじめに ​

EKS 上に EMQX をデプロイする前に、以下の前提条件を満たしていることを確認してください。

EMQX クラスターを素早くデプロイする ​

以下の例は、EKS 上にデプロイするための EMQX カスタムリソース(CR)設定の一例です。

  1. 以下の内容を YAML ファイルとして保存し、kubectl apply でデプロイします。

    yaml
    # WaitForFirstConsumer バインディングモードで EBS StorageClass を設定
    # これにより、ボリュームはそれを使用するポッドと同じ AZ に作成されます
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ebs-sc
    provisioner: ebs.csi.aws.com
    volumeBindingMode: WaitForFirstConsumer
    ---
    apiVersion: apps.emqx.io/v2
    kind: EMQX
    metadata:
      name: emqx
    spec:
      image: emqx/emqx:6.3.1
      config:
        data: |
          license {
            key = "..."
          }
      coreTemplate:
        spec:
          ## EMQX カスタムリソースはこのフィールドのランタイム更新をサポートしていません
          volumeClaimTemplates:
            storageClassName: ebs-sc
            resources:
              requests:
                storage: 10Gi
            accessModes:
              - ReadWriteOnce
      dashboardServiceTemplate:
        metadata:
          ## 詳細: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/
          annotations:
            ## NLB がインターネット向けか内部向けかを指定。未指定の場合は内部がデフォルト。
            service.beta.kubernetes.io/aws-load-balancer-type: external
            service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
        spec:
          type: LoadBalancer
          ## 詳細: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/nlb/
          loadBalancerClass: service.k8s.aws/nlb
      listenersServiceTemplate:
        metadata:
          ## 詳細: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/annotations/
          annotations:
            ## NLB がインターネット向けか内部向けかを指定。未指定の場合は内部がデフォルト。
            service.beta.kubernetes.io/aws-load-balancer-type: external
            service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
        spec:
          type: LoadBalancer
          ## 詳細: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/service/nlb/
          loadBalancerClass: service.k8s.aws/nlb
  2. EMQX クラスターが Ready 状態になるまで待ちます。

    以下のコマンドで状態を確認します。STATUS フィールドが Ready になるまで数分かかる場合があります。

    shell
    $ kubectl get emqx
    NAME   STATUS    AGE
    emqx   Ready     55s
  3. EMQX ダッシュボードの外部 IP を取得し、アクセスします。

    EMQX Operator は dashboardServiceTemplate の設定に基づいて EMQX ダッシュボード用の Service を作成します。

    shell
    $ kubectl get svc emqx-dashboard -o json | jq -r '.status.loadBalancer.ingress[0].ip'
    192.168.1.200
  4. ダッシュボードを以下の URL で開きます:http://192.168.1.200:18083

    デフォルトの認証情報でログインします:

    • ユーザー名: admin
    • パスワード: public

サブスクライブとパブリッシュ ​

このハンズオンでは、開発者が MQTT サービスやアプリケーションを素早くテストできるオープンソースの MQTT 5.0 コマンドラインクライアントツール MQTTX CLI を使用します。

  1. EMQX TCP リスナーの外部 IP を取得します。

    EMQX Operator は設定された各リスナーごとに Service リソースを自動で作成します。

    shell
    external_ip=$(kubectl get svc emqx-listeners -o json | jq -r '.status.loadBalancer.ingress[0].ip')
  2. トピックにサブスクライブします。

    shell
    $ mqttx sub -t 'hello' -h ${external_ip} -p 1883
    
    [10:00:25] › … 接続中...
    [10:00:25] › ✔ 接続完了
    [10:00:25] › … hello にサブスクライブ中...
    [10:00:25] › ✔ hello にサブスクライブ完了
  3. 別のターミナルで EMQX クラスターに接続し、メッセージをパブリッシュします。

    shell
    $ mqttx pub -t 'hello' -h ${external_ip} -p 1883 -m 'hello world'
    
    [10:00:58] › … 接続中...
    [10:00:58] › ✔ 接続完了
    [10:00:58] › … メッセージをパブリッシュ中...
    [10:00:58] › ✔ メッセージパブリッシュ完了
  4. サブスクライバーがメッセージを受信する様子を確認します。

    shell
    [10:00:58] › payload: hello world

LoadBalancer で TLS 暗号化を終端する ​

AWS Network Load Balancer(NLB)を使用して EMQX の TLS トラフィックを終端することが可能です。以下の手順に従ってください。

  1. AWS コンソールで関連する証明書をインポートします。証明書 ID をクリックして詳細ページを開き、証明書 ARN を控えます。

    TIP

証明書/キーのインポート形式については、証明書のインポート を参照してください。 :::

  1. EMQX Service のメタデータに以下のようにアノテーションを追加します。

    yaml
    ## AWS Certificate Manager が管理する 1 つ以上の証明書の ARN を指定します。
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:xxxxx:certificate/xxxxxxx
    ## ロードバランサーと Kubernetes ポッド間のバックエンドトラフィックに TLS を使用するかを指定します。
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    ## TLS リスナーを持つフロントエンドポートを指定します。これにより、AWS NLB サービス経由でポート 1883 にアクセスする際は TLS 認証が必要ですが、K8S サービスのポートへの直接アクセスは TLS 認証不要となります。
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "1883"

    TIP

    service.beta.kubernetes.io/aws-load-balancer-ssl-cert の値は、手順 1 で控えた ARN と一致させてください。