OKE(Oracle Container Engine for Kubernetes)でJMeterクラスター環境構築_その2

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で結果を視覚化する。

  • 下図の赤枠の構成を構築します。 f:id:s-oomori:20190318115333p:plain


前提

  • 作業端末でkuberctlコマンド等のK8sを扱うに当たって必要なコマンドを導入しておく。
     ※私はMac Bookで実装。別途専用Linuxを立ち上げると自分のPCに余計なツールを導入する必要がなくなります。

  • OCIのCLIを導入しておく。
     ※導入方法はCloudiiブログでもUPしてますので参考にしてください。
      Oracle Cloud Infrastructure CLIの導入 - Cloudii blogOracle 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が提供しているデフォルトのファイルでのテストも可能ですので、好きな方をご利用ください。 

github.com


今回のイメージを図で表すと下図の橙色点線の中を作成します。 ※橙色点線以外は第1回で作成したK8sクラスターイメージ図になります。 f:id:s-oomori:20190323215324p:plain


1.今回参考にするKubernautsのGitHubから作業端末にクローンします。
github.com

今回はMacの場合で書いていきます。

#任意のディレクトリを作成
$ 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
IP:                       10.96.53.11
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も先程のスクリプトで設定済みである事も確認できます。 f:id:s-oomori:20190323143902p:plain


5.grafanaのダッシュボードを作成します。

  • cloudii-blog/oke at master · shinpy/cloudii-blog · GitHubから取得したファイルを利用ください。

  • 「Home」をクリック f:id:s-oomori:20190323144411p:plain

  • 「Inport dashboard」から、テストに対応したダッシュボードをインポートする。 ※GrafanaJMeterTemplate_cloudii.json f:id:s-oomori:20190323144513p:plain f:id:s-oomori:20190323150330p:plain

  • 問題なければ、下図の「Import」をクリック f:id:s-oomori:20190323150557p:plain

  • grafanaのダッシュボードが表示されます。 f:id:s-oomori:20190323150703p:plain


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


下図のように値が表示されます。 f:id:s-oomori:20190323162228p:plain
マウスを合わせるとレスポンスタイムも確認できます。 f:id:s-oomori:20190323162309p:plain



このように、簡単にJMeterクラスター環境を構築することができます。
今回は、DBにInfluxdb、視覚化用にgrafanaを使いましたが、Elasticsearch+grafanaにしたり、とElasticsearch+Kibanaを使っても対応できると思います。
jmxファイルも今回はKubernautsさんが提供しているファイルを読み替えて使いましたが、一度GUI環境で視覚的に作成してから、作成すると分かりやすいです。

次(第3回)は、podを操作してみたり、スケールしてみたりして遊んでみます。