🚢

【MuleSoft】 AWS EKS で Runtime Fabric を動かしてみる

2022/11/15に公開約17,200字

MuleSoftを業務で扱うことになったので、勉強がてら AWS EKS に Runtime Fabric を構築してみました。

手順

    1. 環境構築
    1. Anypoint Platform でのRuntime Fabric の設定
    1. AWS CLI を用いた EKS クラスターの構築
    1. kubectl の設定
    1. rtfctl の設定
    1. Runtime Fabric のアプリケーションの作成
    1. Podの動作確認
    1. Podのログを確認する

前提条件

  • Windows Subsystem for Linux 環境で実施

1. 環境構築

aws-cli のインストール

以下のコマンドを実行します。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

eksctl のインストール

以下のコマンドを使用して、eksctl の最新リリースをダウンロードして解凍します。

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

抽出したバイナリを /usr/local/bin に移動します。

sudo mv /tmp/eksctl /usr/local/bin

以下のコマンドを使用して、インストールが成功したことをテストします。

eksctl version

kubectl のインストール

次のコマンドにより、最新リリースをダウンロードしてください。

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"

kubectlバイナリを実行可能にしてください。

chmod +x ./kubectl

バイナリをPATHの中に移動させてください。

sudo mv ./kubectl /usr/local/bin/kubectl

インストールしたバージョンが最新であることを確認してください:

kubectl version --client

rtf-ctl のインストール

次のコマンドにより、最新リリースをダウンロードしてください:

curl -L https://anypoint.mulesoft.com/runtimefabric/api/download/rtfctl/latest -o rtfctl

コマンドラインツールrtfctlのファイルパーミッションを変更します。

sudo chmod +x rtfctl

バイナリをPATHの中に移動させてください。

sudo mv ./rtfctl /usr/local/bin/rtfctl

インストールしたバージョンが最新であることを確認してください:

rtfctl version --client

2. Anypoint Platform でのRuntime Fabric の設定

Runtime Manager を開きます
https://anypoint.mulesoft.com/cloudhub/#/console/home/applications

左のメニューから Runtime Fabric を選択する

  • Runtime Fabric をインストールする先を選択します
    • Runtime Fabric の名前を設定します
      • 今回は demo-rtf とします。
      • この名前は、アプリのデプロイメント ターゲットを選択するときに表示されます。英字、数字、ハイフンを使用できます。
    • 今回はAmazon Elastic Kubernetes Service を選択します
    • VMs or bare metal を選択した場合は、KubernetesとDockerがバンドルされたソフトウェアアプライアンスを利用できます。

メッセージが表示されます。

問題なければ Accept 押し進めます。

なお、日本語訳は以下の通りです。

続行することにより、お客様は、MuleSoftがRuntime Fabricのインストールに使用するKubernetesディストリビューションまたはその関連サービスに対するサポートを提供する責任を負わないことに同意します。
お客様は、Runtime FabricがホストされているKubernetesディストリビューションに対して、定期的なメンテナンスとアップグレードを提供する必要があります。
各お客様の環境には固有の違いがあるため、MuleSoftは、Kubernetesディストリビューションまたはその上で動作するインフラ(仮想マシン、ディスク、ネットワーク、プロキシを含むがこれに限定されない)に起因する問題についての支援を提供することはできない。
Kubernetesとそれに必要なインフラを管理する能力がない場合は、続ける前に、IT部門と連絡を取るか、サポートパートナーに連絡して支援を求めてください。

設定が完了するとこのような画面が表示されます。

Runtime Fabric をインストールする際の手順はHelm チャートを利用する方法と RTFCTLを利用する2種類の方法があります。
今後のバージョンアップの際にも、同じ方法を使用する必要があります。

Helm は一般的なKubernetesのパッケージマネージャです。すでに他の目的でHelmを使用しているチームにおすすめ。

RTFCTL はMuleSoftのRuntime Fabric管理用コマンドラインツール。また、UIベースのエージェントバージョンアップグレードも可能です。

今回は RTFCTL を利用します。

インストールには、Muleのライセンスキーとアクティベーションデータが必要です。

3. AWS CLI を用いた EKS クラスターの構築

今回は AWS CLI を使って AWS の環境を設定していきます。その前に CLI に権限を付与するために IAM の設定を行います。

まずは AWS のコンソールにログインします。

メニューバーの Services の検索バーからから IAM と検索し選択します。

左のメニューから Users を選択します。

Add users を選択します。

User name を指定します。
ここでは例として aws-cli と設定します。

AWS credential type は Access key - Programmatic access を選択します。
AWS CLI のように access key IDsecret access key を使う場合はこちらを選びます。

今回は既存のポリシーを利用するので Attach existing policies directly を選択します。
次に AdministratorAccess を選択します。

タグの追加画面ですが、今回は指定しません。

レビュー画面ですが、問題なければ Create user を押して進みます。

ユーザの追加が完了すると、ユーザとその Access key ID および Secret access key が表示されます。
これらを使って aws cli でリソースを作成していきます。

Download .csv でクレデンシャル情報を保存しておくと、アクセスできなくなった際に役立ちます。

ここからは再び Windows Terminal に戻って aws-cli の設定を行っていきます。
以下のコマンドでaws-cliの設定を行います。

aws configure

AWS Access Key ID [None]: と表示されるので、先程取得した Access key ID を指定します。

同様に AWS Secret Access Key [None]: と表示されるので、 Secret access key を指定します。

次に Default region name [None]: と表示され、デフォルトのAWSリージョンを設定します。
任意のリージョンを指定してください。ここでは us-east-1 を指定します。

最後に Default output format [None]: と表示されるので json を指定します。

これで全て aws-cli のクレデンシャルの設定は完了です。
完了すると AWS のクレデンシャルとして .aws/ 直下に
configcredentials のファイルが作成されます。
credentials のファイルには先程設定した、アクセスキーとシークレットが設定されています。

次に EKS のクラスターを作成します。
Webコンソールから作成することも可能ですが、手順が長く間違いやすいため、今回は代わりに aws-cli の eksctl コマンドを使って作成します。

今回作成するコマンドは以下の通りです。

eksctl create cluster --name=rtf-demo-1 --version=1.20 --region=ap-northeast-1 --nodegroup-name=standard-workers --node-type=t2.medium --nodes-min=1 --nodes-max=1

コマンドについて簡単に解説します。

  • --name=rtf-demo-1 は作成するEKSクラスターの名前です。今回は Anypoint Platform と同じ名前を設定します。(ここでは過去に作成したクラスターが存在していたため -1 を付けています)
  • --version=1.21 は作成するKubenretesクラスターのバージョンです。現時点で Runtime Fabric が対応している Kubernetes の最新バージョンは 1.23 です。
  • --region=ap-northeast-1 は作成するリソースのリージョンを指定します。
  • --nodegroup-name=standard-workersstandard-workers という名前でノードグループを作成します。
  • --node-type=t2.medium ノードに t2.medium インスタンスを指定します。
  • --nodes-min=1 --nodes-max=1 は最小1ノード、最大4ノードを指定します。

このコマンドを Windows Terminal で実行します。

コマンドを見ると、Avaliablity Zone の設定、サブネットの設定、ノードグループの設定、Kubernetes のバージョンの指定、EKSクラスターの作成などが実行されていることが分かります。

しばらくすると、以下のようなコマンドが表示され、完了していることが分かります。

2022-11-14 12:55:18 [✔]  EKS cluster "rtf-demo-1" in "ap-northeast-1" region is ready

4. kubectl の設定

EKSでKubernetesクラスターの作成が完了すると .kube フォルダ直下に config ファイルが作成されます。

Kubernetes の config は yaml ファイルで定義され、クラスターの認証情報が記載されます。
簡単に config ファイルについて説明します。

  • clusters: Kubernetes のクラスター情報です。複数のクラスターを管理できます。
  • current-context: 複数クラスターを管理している場合、現在の kubectl の接続先を指定します。
  • users: 接続するユーザ情報です。

作成した Kubernetes クラスターに接続できるか確認しましょう。

kubectl get svc

以下のように表示されたら問題ないかと思います。

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   87m

5. rtfctl の設定

Runtime Manager に戻って activation data を取得します。
activation data は作成した Runtime Fabric を選択し RTFCTL を押すと表示できます。

次に以下のコマンドで Kubernetes環境に対して Runtime Farbic をインストール可能かどうか確認します。

rtfctl validate <activation_data>

実際のインストールは以下のコマンドを実行します。

rtfctl install <activation_data>

Runtime Fabric is ready. と表示されると完了です。

再び、Runtime Manager より Runtime Fabric を表示してください。
少し時間を置いた後にページを開くと、以下のように表示されます。

表示されている画面について簡単に解説します

  • Version は Runtime Fabric のバージョンです
  • Kubernetes Version は Runtime Fabric が稼働している Kubernetes クラスターのバージョンです

Associated Environments タブに切り替えると、ProductionやSandboxといった環境の設定ができます。
今回はデモなので Sandbox とします。

6. Runtime Fabric のアプリケーションの作成

次に Runtime Fabric にデプロイするアプリケーションを作成します。
Anypoint Studio でのアプリケーションの作成についてはここでは割愛します。

今回は Scheduler で 5分おきに、"Hello": "Hello! Runtime Fabric" のペイロードを返すアプリケーションを作成しました。

Configuration XML 例

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
	<flow name="rtf-demoFlow" doc:id="f91a257f-15c6-45ca-97f7-1c14699e5798" >
		<scheduler doc:name="Scheduler" doc:id="1046383f-d8ad-4059-b8b9-39134814c819" >
			<scheduling-strategy >
				<fixed-frequency frequency="5" timeUnit="MINUTES"/>
			</scheduling-strategy>
		</scheduler>
		<ee:transform doc:name="Transform Message" doc:id="1f453640-7ce2-4b73-8097-9b8479db7de7" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
	"Hello": "Hello! Runtime Fabric"
}]]></ee:set-payload>
			</ee:message>
		</ee:transform>
		<logger level="INFO" doc:name="Logger" doc:id="14a35c79-cad2-4b29-abee-7d951122f630" />
	</flow>
</mule>


デプロイする際は、プロジェクトを選択し [Export] → [Mule] → [Anypoint Studio Project...] を選択
Finishを行い Export を行うと jar ファイルが作成されます。

次に作成したアプリケーションのデプロイを行います。
Runtime Manager の左のメニューの [Appliations] を選択し、 [Deploy application] を押下します。

Deploy Application の画面が表示されます。次のように設定します。

  • Application Name: ここは任意ですが今回は rtf-demo とします
  • Deployment Target: Runtime Fabric の中の demo-rtf を選択します。
  • Application File: Anypoint Studio で作成した jar ファイルを指定します。
  • それ以外はデフォルトの指定で問題ありません。

デプロイされると、次のような画面となるかと思います。
デプロイが失敗しますが、これはライセンスが適用されていないためです。

ライセンスの適用はコマンドラインで実施します。
まず license.lic ファイルを以下のコマンドで base64 エンコードします。

base64 -i license.lic > license.txt

出力したファイルは改行されているため改行を削除した上で以下のコマンドでライセンスを適用します。

rtfctl apply mule-license <LINCENSE_KEY>

ライセンスを適用し、Runtime Manager のデプロイした API を見てみると、正常に稼働していることが分かるかと思います。

7. Podの動作確認

Pod の動作を確認しましょう。
ターミナルで以下のコマンドを実行します。

kubectl get pods --all-namespaces

実行すると以下のように表示され demo-rtf の Pod は demo-rtf-8576c95d5c-js89g といった名称で稼働していることが分かります。

NAMESPACE                              NAME                                      READY   STATUS      RESTARTS   AGE
dd527597-dc8b-4578-958f-183028649ccd   demo-rtf-8576c95d5c-js89g                 2/2     Running     0          131m
kube-system                            aws-node-zn5qj                            1/1     Running     0          21h
kube-system                            coredns-54bc78bc49-fxt2t                  1/1     Running     0          21h
kube-system                            coredns-54bc78bc49-lhsfh                  1/1     Running     0          21h
kube-system                            kube-proxy-bpvm8                          1/1     Running     0          21h
rtf                                    agent-8c5c75ddc-z6dw7                     2/2     Running     0          20h
rtf                                    agent-upgrade-nrldp                       0/1     Completed   0          20h
rtf                                    mule-clusterip-service-665d75c964-mn82n   1/1     Running     0          20h
rtf                                    resource-cache-74d6b47676-7g4j5           2/2     Running     0          20h
rtf                                    rtf-install-job-8hznj                     0/1     Completed   0          20h

次に Runtime Manager に戻り Replicas3 に設定します。

再度以下のコマンドを実行すると demo-rtf のレプリカが3つ稼働してることが確認できます。

kubectl get pods --all-namespaces
NAMESPACE                              NAME                                      READY   STATUS      RESTARTS   AGE
dd527597-dc8b-4578-958f-183028649ccd   demo-rtf-8576c95d5c-js89g                 2/2     Running     0          137m
dd527597-dc8b-4578-958f-183028649ccd   demo-rtf-8576c95d5c-jvq4c                 2/2     Running     0          51s
dd527597-dc8b-4578-958f-183028649ccd   demo-rtf-8576c95d5c-sdlbh                 2/2     Running     0          51s

次に AWS EKS のノード数を1から3に追加します。
まずは EKS の Web コンソールから作成したクラスター rtf-demo-1 を選択します。

次にノードを管理しているノードグループ standard-workers を選択します。

ノードグループが表示されると Edit を押下します。

ここでノードの希望数、最小数、最大数を設定することができます。
今回は3ノード構成を実現するので、全て3を設定します。


ノードの追加が完了したら、以下のコマンドで正しくノードが追加されたか確認します。
問題がなければ以下の結果のように3ノード構成となっています。

kubectl get nodes
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-39-46.ap-northeast-1.compute.internal    Ready    <none>   19m   v1.20.15-eks-ba74326
ip-192-168-5-58.ap-northeast-1.compute.internal     Ready    <none>   21h   v1.20.15-eks-ba74326
ip-192-168-75-142.ap-northeast-1.compute.internal   Ready    <none>   19m   v1.20.15-eks-ba74326

次に現在のPodの配置状況について見ていきたいと思います。
以下のコマンドで Pod の配置状況を確認します。
結果は全て ip-192-168-5-58.ap-northeast-1.compute.internal のノードに配置されていることが分かります。

kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName --all-namespaces
NAME                                      NODE
demo-rtf-8576c95d5c-js89g                 ip-192-168-5-58.ap-northeast-1.compute.internal
demo-rtf-8576c95d5c-jvq4c                 ip-192-168-5-58.ap-northeast-1.compute.internal
demo-rtf-8576c95d5c-sdlbh                 ip-192-168-5-58.ap-northeast-1.compute.internal

次に Pod を各ノードに分けて配置するように設定します。
Runtime Manager に戻ります。

Enforce deploying replicas across nodes のチェックを入れて Apply Changes を押下しデプロイします。

デプロイが完了すると 3/3 Replicas started といったメッセージが表示されます。

再度、以下のコマンドで Pod の配置状況を確認します。
作成した3つのノードにPodが分かれて配置されていることが分かります。

kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName --all-namespaces
NAME                                      NODE
demo-rtf-76d99d8f59-btrkb                 ip-192-168-75-142.ap-northeast-1.compute.internal
demo-rtf-76d99d8f59-nctjt                 ip-192-168-39-46.ap-northeast-1.compute.internal
demo-rtf-76d99d8f59-zggh6                 ip-192-168-5-58.ap-northeast-1.compute.internal

8. Podのログを確認する

最後に作成したアプリケーションのログを確認していきましょう。
まずは Runtime Fabric が動いている namespace に切り替えます。
以下のコマンドを実行します。

kubectl config set-context --current --namespace=dd527597-dc8b-4578-958f-183028649ccd
Context "MasterKey@rtf-demo-1.ap-northeast-1.eksctl.io" modified.

次に、namespace を切り替えたことを確認します。
Pod一覧を取得します。

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
demo-rtf-76d99d8f59-btrkb   2/2     Running   0          24m
demo-rtf-76d99d8f59-nctjt   2/2     Running   0          24m
demo-rtf-76d99d8f59-zggh6   2/2     Running   0          24m

Podの中に入るコマンドを実行します。
取得したPod一覧から入りたいPod名を指定します。

kubectl exec -it demo-rtf-76d99d8f59-nctjt bash

Pod の中でコマンドを実行することが出来ます。
以下のディレクトリのログを見ましょう。

cat /opt/mule/logs/rtf-demo.log
INFO  2022-11-15 04:30:45,424 [ArtifactDeployer.start.01] [processor: ; event: ] org.mule.runtime.core.internal.logging.LogUtil:
**********************************************************************
* Application: demo-rtf                                              *
* OS encoding: UTF-8, Mule encoding: UTF-8                           *
*                                                                    *
**********************************************************************
INFO  2022-11-15 04:30:45,518 [[MuleRuntime].uber.02: [demo-rtf].rtf-demoFlow.CPU_INTENSIVE @1a3f8eb4] [processor: rtf-demoFlow/processors/1; event: 45a33e50-649e-11ed-aaf4-6608a699046f] org.mule.runtime.core.internal.processor.LoggerMessageProcessor:
org.mule.runtime.core.internal.message.DefaultMessageBuilder$MessageImplementation
{
  payload={Hello=Hello! Runtime Fabric}
  mediaType=application/java; charset=UTF-8
  attributes=<not set>
  attributesMediaType=*/*
}

作成したアプリケーションが動いていることが分かります。

参考

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eksctl.html
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/
https://docs.mulesoft.com/runtime-fabric/2.0/install-rtfctl

Discussion

ログインするとコメントできます