はじめに

Kubernetes のスケーラビリティ モデル (水平および垂直) は、独立したリクエストのストリームを処理するアプリケーションのスケーリングに最適化されており、スケーラビリティ要件の変化に応じて Pod の動的な再起動を可能にします。さらに、水平モデルでは、Service によって外部に公開されている 1 つのポートの背後で複数の Pod を実行できます。これらのモデルは、Load Test のスケーラビリティ メカニズムには適していません。Load Test コントローラーは、負荷テストの開始時に特定のホストおよびポートでリモートマシンへの永続的な接続を確立します。この接続は、負荷テストの実行中ずっと開いたままにする必要があります。Load Test のリモート マシンで実行されている Pod が、スケーラビリティ要件の変更に応じて再起動されると、コントローラーとの接続が失われ、このマシン/Pod は現在の負荷テストに参加しなくなります。さらに、サービスの背後で複数の Pod が実行されている場合、永続的な接続はそのうちの 1 つの Pod に対してのみ確立され、負荷テストの実行中は他の Pod はアイドル状態になります。このため、Kubernetes の水平および垂直自動スケーリングを Load Test で使用することは推奨しません。ただし、このドキュメントで説明しているように、Kubernetes クラスターのコンピューティング リソースを使用して負荷テストをスケールアップすることは可能です。

Kubernetes への Load Test サーバーのデプロイ

Load Test サーバーを Kubernetes にデプロイするには、まず次の内容の YAML ファイルを作成します (この例では、loadtest-pod-1.yaml と呼びます)。

apiVersion: v1
kind: Pod
metadata:
  name: loadtest-1
  labels:
    app: loadtest-1
spec:
  containers:
  - name: loadtest-1
    image: parasoft/soavirt
    imagePullPolicy: IfNotPresent
    ports:
    - name: loadtest-port-1
      containerPort: 8189
    command: [ "/usr/local/parasoft/soavirt/loadtest" ]
    args: [ "-loadtestserver" ]
    env:
    - name: ACCEPT_EULA
      value: "true"
# If you expect other Pods to be running on the same node, make sure to
# reserve permanent resources for the Load Test server. Assign the CPU
# and Memory amounts according to the expected load level.  
# You do not have to do it if Load Test server is the only Pod on a
# Node – in this case all Node’s resource will be available to Load Test.
    resources:
      requests:
        memory: "4Gi"
        cpu: "4"
      limits:
        memory: "4Gi"
        cpu: "4"

# Map each Load Test server to a specific Node, so that when
# you run a load test you can monitor each Node resource
# utilization and adjust the remote machine's load accordingly.
# Set the nodeName value to the actual name of the Node you selected
# for this Load Test server instance:
  nodeName: YOUR_NODE_NAME

# If you expect other Pods to be running on the same Node use
# Guaranteed QoS class to insure availability of Node’s resources.
status:
  qosClass: Guaranteed

---
kind: Service
apiVersion: v1
metadata:
  name: loadtest-1
spec:
  selector:
    app: loadtest-1
  type: NodePort
  ports:
    - name: loadtest-port-1
      protocol: TCP
      port: 8189
      targetPort: 8189
      nodePort: 30089 

この YAML ファイルを使用して、次のコマンドを実行し、単一の Load Test サーバー用の Service と Pod を作成します (loadtest-pod-1.yaml の代わりに、ご使用の YAML ファイル名を指定します)。

kubectl apply -f loadtest-pod-1.yaml

次の出力が表示されます。

pod/loadtest-1 created 
service/loadtest-1 created

複数の Load Test サーバー インスタンスをデプロイするには:

  1. 上記の YAML ファイルのコピーを作成し、名前を変更します (例: loadtest-pod-2.yaml)。
  2. ファイル内で、loadtest-1 を loadtest-2 に、loadtest-port-1 を loadtest-port-2 に名前変更します。
  3. Service nodePort を別の値 (例: 30099) に設定します。
  4. 8189 のポート値は変更しないでください。

YAML ファイルを使用して、2 番目の Load Test Service/Pod インスタンスを作成します (loadtest-pod-2.yaml の代わりにご使用の YAML ファイル名を指定します)。

kubectl apply -f loadtest-pod-2.yaml

さらに Load Test Pod が必要な場合は、このプロセスを繰り返します。

Load Test 構成を使用した Load Test リモートマシンの設定

Kubernetes Load Test リモートマシンを負荷テスト構成に追加します (詳細については、「リモート マシンでの負荷テストの実行」を参照してください)。リモートマシンを右クリックして [検証] を選択すると、そのマシンの可用性を確認できます。

テスト対象アプリケーション (AUT) が Kubernetes クラスターの外部に公開されていない場合は、以下のスクリーンショットに示すように、コントローラーマシン (localhost) の負荷レベルをゼロに設定してください。Load Test コントローラーはクラスターの外部で実行されるため、AUT の内部 IP アドレスを参照できません。一方、負荷ジェネレーターはクラスター内で実行されるため、AUT の内部 IP アドレスにアクセスできます。

Load Test の実行

任意の Kubernetes モニタリング ツール (Prometheus/Graphana など) を使用して、Load Test サーバー ポッドを割り当てたノードの CPU とメモリの使用率を確認します。Load Test シナリオの実行とテスト実行時間の測定の精度を確保するには、CPU とメモリの使用率が平均で 75~80% を超えないようにする必要があります。