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をデプロイする。
詳細はネットワークロードバランサーの作成を参照してください。クラスターに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/v3beta1 kind: EMQX metadata: name: emqx spec: image: emqx/emqx:6.3.2 config: roots: license: key: "..." coreTemplate: spec: ## EMQXカスタムリソースはこのフィールドのランタイム更新をサポートしていません persistentVolumeClaimSpec: 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と一致させてください。