Amazon Elastic Kubernetes Service 上での EMQX デプロイ
EMQX Operator は Amazon Container Service EKS(Elastic Kubernetes Service)上での実行をサポートしています。Amazon EKS は、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを簡素化するマネージド Kubernetes サービスです。EKS は Kubernetes のコントロールプレーンとノードグループを提供し、ノードの置き換え、アップグレード、パッチ適用を自動で処理します。また、Load Balancer、RDS、IAM などの AWS サービスをサポートし、他の Kubernetes エコシステムツールとシームレスに統合されます。
詳細な紹介については、Amazon EKS とはをご参照ください。
はじめに
EKS 上に EMQX をデプロイする前に、以下の前提条件を完了していることを確認してください。
EKS クラスターを作成する。
詳細はAmazon EKS クラスターの作成をご覧ください。kubectl を設定し、EKS クラスターに接続できるようにする。
詳細はクラスターへの接続に kubectl を使用するをご覧ください。クラスターに AWS Load Balancer Controller をデプロイする。
詳細はネットワーク Load Balancer の作成をご覧ください。クラスターに Amazon EBS CSI ドライバーをインストールする。
詳細はAmazon EBS CSI ドライバーをご覧ください。EMQX Operator をインストールする。
詳細はEMQX Operator のインストールをご参照ください。
EMQX クラスターの迅速なデプロイ
以下の例は、EKS 上でのデプロイに必要な EMQX カスタムリソース(CR)の設定例です。
下記の内容を 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.2.0 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/nlbEMQX クラスターが Ready 状態になるまで待ちます。
以下のコマンドでステータスを確認します。
STATUSフィールドがReadyになるまで数分かかる場合があります。shell$ kubectl get emqx NAME STATUS AGE emqx Ready 55sEMQX ダッシュボードの外部 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ダッシュボードにアクセスします:
http://192.168.1.200:18083デフォルトの認証情報でログインしてください。
- ユーザー名:
admin - パスワード:
public
- ユーザー名:
サブスクライブとパブリッシュ
このハンズオンでは、開発者が MQTT サービスやアプリケーションを迅速にテストできるオープンソースの MQTT 5.0 コマンドラインクライアントツールである MQTTX CLI を使用します。
EMQX TCP リスナーの外部 IP を取得します。
EMQX Operator は設定された各リスナーに対して自動的に Service リソースを作成します。
shellexternal_ip=$(kubectl get svc emqx-listeners -o json | jq -r '.status.loadBalancer.ingress[0].ip')トピックにサブスクライブします。
shell$ mqttx sub -t 'hello' -h ${external_ip} -p 1883 [10:00:25] › … 接続中... [10:00:25] › ✔ 接続完了 [10:00:25] › … hello にサブスクライブ中... [10:00:25] › ✔ hello にサブスクライブしました別のターミナルで 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] › ✔ メッセージをパブリッシュしましたサブスクライバーがメッセージを受信するのを確認します。
shell[10:00:58] › payload: hello world
LoadBalancer で TLS 暗号化を終了する
AWS ネットワーク Load Balancer(NLB)を使用して EMQX の TLS トラフィックを終了することができます。以下の手順に従ってください。
AWS コンソールで関連する証明書をインポートします。証明書 ID をクリックして証明書の詳細ページを開き、証明書 ARN を控えてください。
TIP
証明書/キーのインポート形式については、証明書のインポートをご参照ください。 :::
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 と一致させてください。