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 をデプロイする。
詳細はNetwork Load Balancer の作成をご参照ください。クラスターに Amazon EBS CSI ドライバーをインストールする。
詳細はAmazon EBS CSI ドライバーをご参照ください。EMQX Operator をインストールする。
詳細はEMQX Operator のインストールをご参照ください。
EMQX クラスターの迅速なデプロイ
以下の例は、EKS 上でのデプロイに必要な EMQX カスタムリソース(CR)設定を示しています。
以下の内容を YAML ファイルとして保存し、
kubectl applyでデプロイします。yaml# WaitForFirstConsumer バインディングモードを持つ EBS StorageClass の設定 # これにより、ボリュームはそれを使用する Pod と同じ 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 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 Pod 間のバックエンドトラフィックに 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 と一致させてください。