id:s-oomori です。
「OKE(Oracle Container Engine for Kubernetes)でJMeterクラスター環境構築」の第2回になります。
※第一回はこちら
今回は前回OKEで構築したKubernetes(K8s)にJMeterクラスターの環境を構築します。
発表資料
- 今回のブログ内容では資料中の図が参考になりますので、参照しながら進めるとより理解し易いと思います。
- 最後の2枚の背景が半透明にならない。。。(実際は半透明です) speakerdeck.com
参考にしたサイトは以下になります。
blog.kubernauts.io
JMeterクラスター記事(全3回)の到達目標
- OKEでクラスター構築する。
-
JMeterクラスターを構成しテストを実行し、Grafanaで結果を視覚化する。
-
下図の赤枠の構成を構築します。
前提
-
作業端末でkuberctlコマンド等のK8sを扱うに当たって必要なコマンドを導入しておく。
※私はMac Bookで実装。別途専用Linuxを立ち上げると自分のPCに余計なツールを導入する必要がなくなります。 -
OCIのCLIを導入しておく。
※導入方法はCloudiiブログでもUPしてますので参考にしてください。
Oracle Cloud Infrastructure CLIの導入 - Cloudii blogとOracle Cloud Infrastructure CLIの導入 (後編:環境設定) - Cloudii blog -
OCIのService Limitを解除しておく。
※1リージョンあたりのCompute同時構築数が制限されているので、検証でも増やしておくことを推奨します。
※Computeのシェープ種類も用途によっては解除してください。
※解除方法はOCI Web上から英語文で申請すれば解除してくれます。または、SRからの解除申請も可能です。 -
推奨:OCIでOKE用のCompartmentを作成しておく。また、必要に応じて、権限等のセキュリティ周りも設定しておく。
※今回は、「test-container」というCompatmentを事前に作成しておいたので、このCompartmentを利用します。 -
今回は「us-Phoenix-1」リージョンを使います。
JMeterクラスター環境構築
今回私が少し手を加えた「jmxファイル」と「grafanaテンプレート」は下記からダウンロード可能です。
また、jmxファイルは「https://cloudii.jp/」が設定されてますので、「cloudii.jp」と記載されている箇所を任意のサイトURLに更新してご利用ください。
※「cloudii.jp」のままで簡易テストしていただいてもOKですが(アクセス数が伸びるなんて思ってませんw
※Kubernautsが提供しているデフォルトのファイルでのテストも可能ですので、好きな方をご利用ください。
今回のイメージを図で表すと下図の橙色点線の中を作成します。 ※橙色点線以外は第1回で作成したK8sクラスターイメージ図になります。
1.今回参考にするKubernautsのGitHubから作業端末にクローンします。
github.com
今回はMacの場合で書いていきます。
-
「Clone or download」→URLをコピーします。
-
作業端末にGit Cloneします。
#任意のディレクトリを作成 $ mkdir ~/git $ cd ~/git #先程コピーしたURLでClone $ git clone https://github.com/kubernauts/jmeter-kubernetes.git $ cd jmeter-kubernetes
2.「jmeter_cluster_create.sh」を実行し、JMeterクラスター環境を構築します。
#スクリプトに実行権限を付与 $ chmod +x jmeter_cluster_create.sh dashboard.sh start_test.sh #スクリプト実行 $ ./jmeter_cluster_create.sh #途中「namespace」の入力を求められるので、任意の名前を入力:今回は「k8s」 Enter the name of the new tenant unique name, this will be used to create the namespace k8s #スクリプト実行完了後、podが作成されていることを確認 $ kubectl -n k8s get pod -o wide ※計5つのpodが可動していることを確認。 ※「kubectl -n k8s get pod」のみでも可。 ※「-n k8s」はネームスペースを指定している。 ※「-o wide」はpodの実行ホストIPも表示する。。 NAME READY STATUS RESTARTS AGE IP NODE influxdb-jmeter-f899f8948-958l9 1/1 Running 0 5h 10.244.2.4 10.0.12.2 jmeter-grafana-5dc58ddb59-vj8th 1/1 Running 0 5h 10.244.1.5 10.0.11.2 jmeter-master-66cb9c8bfb-4zl6b 1/1 Running 0 5h 10.244.1.4 10.0.11.2 jmeter-slaves-6d5b7d457c-c4czg 1/1 Running 0 5h 10.244.1.3 10.0.11.2 jmeter-slaves-6d5b7d457c-r9xls 1/1 Running 0 5h 10.244.2.3 10.0.12.2
※namespaceについてはこちらを参考にしてください。
※kubectlコマンドについてはこちらを参考にしてください。
3.「dashboard.sh」を実行し、DBを作成し、grafanaと接続まで設定します。
#Infuluxdbを作成し、grafanaにInfluxdbのData Source設定を実施
$ ./dashboard.sh
4.grafanaの画面に接続します。
- 今回、プライベート環境で構築しているので、直接IPに接続しようとしても接続できません。接続方法はいくつかありますが、今回はポートフォワードを使って接続してみます。
#External IPが無い $ kubectl describe -n k8s svc jmeter-grafana Name: jmeter-grafana Namespace: k8s Labels: app=jmeter-grafana Annotations: <none> Selector: app=jmeter-grafana Type: NodePort Port: <unset> 3000/TCP TargetPort: 3000/TCP NodePort: <unset> 32516/TCP Endpoints: 10.244.1.5:3000 Session Affinity: None External Traffic Policy: Cluster Events: <none>
-
先程の手順でpod情報を表示した結果のgrafanaのNAMEをコピーします。
※今回は「jmeter-grafana-5dc58ddb59-vj8th」 -
次のコマンドをターミナルで実行します。
#namespaseを指定するのを忘れないでください。grafanaのpod名はご自身のpod名にしてください。 $ kubectl -n k8s port-forward jmeter-grafana-5dc58ddb59-vj8th 3001:3000
- ブラウザで下記のURLにアクセスします。
http://127.0.0.1:3001/
grafanaの画面が表示されます。
※data sourceも先程のスクリプトで設定済みである事も確認できます。
5.grafanaのダッシュボードを作成します。
-
cloudii-blog/oke at master · shinpy/cloudii-blog · GitHubから取得したファイルを利用ください。
-
「Home」をクリック
-
「Inport dashboard」から、テストに対応したダッシュボードをインポートする。 ※GrafanaJMeterTemplate_cloudii.json
-
問題なければ、下図の「Import」をクリック
-
grafanaのダッシュボードが表示されます。
6.JMeterでテストを実行します。
-
jmxファイルについて、「cloudii.jmx」を使う場合は下記の3つの値を更新してテストしてください。最初は易しめで!!
-
「cloudii.jmx」を使う場合は、cloudii-blog/oke at master · shinpy/cloudii-blog · GitHubから取得したファイルを利用ください。
-
変更対象:LoopController.loops(回数)、ThreadGroup.num_threads(スレッド数、Users)、ThreadGroup.ramp_time(秒間)
-
下記の値の場合、今回はJMeter Slaveのpodが2つですので、1秒間に2User(1potあたり1User)がcloudiiのサイトにアクセスするテストになります。
-
10ループ(10回)だとすぐ終わってしまうので、値を100くらいのほうがダッシュボードで確認しやすいかもしれません。または、接続先でログを見ると良いです。
#cloudii.jmxファイル内の一部 <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">10</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <longProp name="ThreadGroup.start_time">1363247040000</longProp> <longProp name="ThreadGroup.end_time">1363247040000</longProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration">0</stringProp> <stringProp name="ThreadGroup.delay">0</stringProp> </ThreadGroup>
- JMeter実行
#下記のスクリプト+jmxファイルを指定してテストを実行すると、JMeterMaster→各JMeter Slaveにjmxファイルのテスト内容が送信され実行されます。
$ ./start_test.sh cloudii.jmx
下図のように値が表示されます。
マウスを合わせるとレスポンスタイムも確認できます。
このように、簡単にJMeterクラスター環境を構築することができます。
今回は、DBにInfluxdb、視覚化用にgrafanaを使いましたが、Elasticsearch+grafanaにしたり、とElasticsearch+Kibanaを使っても対応できると思います。
jmxファイルも今回はKubernautsさんが提供しているファイルを読み替えて使いましたが、一度GUI環境で視覚的に作成してから、作成すると分かりやすいです。
次(第3回)は、podを操作してみたり、スケールしてみたりして遊んでみます。