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 をデプロイする前に、以下の前提条件を満たしていることを確認してください。
EKS クラスターを作成する。
詳細は Amazon EKS クラスターの作成 を参照してください。kubectl を設定して EKS クラスターに接続できるようにする。
詳細は kubectl を使用してクラスターに接続する を参照してください。クラスターに AWS Load Balancer Controller をデプロイする。
詳細は Network 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.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/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ダッシュボードを以下の URL で開きます:
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 Network 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 と一致させてください。