【MuleSoft】 AWS EKS で Runtime Fabric を動かしてみる
MuleSoftを業務で扱うことになったので、勉強がてら AWS EKS に Runtime Fabric を構築してみました。
手順
-
- 環境構築
-
- Anypoint Platform でのRuntime Fabric の設定
-
- AWS CLI を用いた EKS クラスターの構築
-
- kubectl の設定
-
- rtfctl の設定
-
- Runtime Fabric のアプリケーションの作成
-
- Podの動作確認
-
- 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 を開きます
左のメニューから Runtime Fabric を選択する
- Runtime Fabric をインストールする先を選択します
- Runtime Fabric の名前を設定します
- 今回は
demo-rtf
とします。 - この名前は、アプリのデプロイメント ターゲットを選択するときに表示されます。英字、数字、ハイフンを使用できます。
- 今回は
- 今回はAmazon Elastic Kubernetes Service を選択します
- VMs or bare metal を選択した場合は、KubernetesとDockerがバンドルされたソフトウェアアプライアンスを利用できます。
- Runtime Fabric の名前を設定します
メッセージが表示されます。
問題なければ 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 ID
と secret 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/
直下に
config
と credentials
のファイルが作成されます。
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-workers
はstandard-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 に戻り Replicas
を 3
に設定します。
再度以下のコマンドを実行すると 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=*/*
}
作成したアプリケーションが動いていることが分かります。
参考
Discussion