k6を使ったKubernetes環境での負荷テスト
レビュー投稿日の情報になります
グリーエックス株式会社 / Rintaro Takata
メンバー / バックエンドエンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
最終更新日投稿日
| 利用プラン | 利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
|---|---|---|---|---|
OSS | 負荷テスト | 10名以下 | 2025年10月 | B to B |
| 利用プラン | OSS |
|---|---|
| 利用機能 | 負荷テスト |
| ツールの利用規模 | 10名以下 |
| ツールの利用開始時期 | 2025年10月 |
| 事業形態 | B to B |
アーキテクチャ

アーキテクチャの意図・工夫
- Kubernetes Job方式の採用: 同一GKEクラスター内でJobとして実行することで、ネットワーク的に近い環境からテストを実施
- 内部サービスへの負荷テスト: マイクロサービスアーキテクチャを運営しており、外部からのリクエストを公開していない内部サービスに対しても、Kubernetes内にPodを立てることでクラスター内部から直接リクエストを送信できる。これにより、外部公開されていないAPIやgRPCサービスに対しても負荷テストが可能
- ConfigMapによるスクリプト管理: テストスクリプトとサンプルデータをConfigMapとして管理し、柔軟に変更可能な構成
- Makefileによる運用効率化: ConfigMapの作成、テストの実行、ログ確認、クリーンアップなど、一連の操作をMakeコマンドで実行可能に
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
- 急激なリクエスト量増加への対応: 運用しているサービスでは、短時間の間にリクエスト量が倍以上増加することがあり、そのような状況に対処できるか事前に確認する必要があった
- 最適なリソース設定の不明確さ: リクエスト数増加を見越した最適なPod数やリソース量の設定値が明確でなかった
- 複数プロトコルへの対応: REST APIサーバーに加えて、gRPCサーバーも運用しているため、状況によっては両方のプロトコルに対する負荷テストが必要だった
- 継続的なテスト実施体制の未整備: 負荷テスト環境が整っておらず、システムの健全性を継続的に確認する仕組みがなかった
どのような状態を目指していたか
- トラフィック急増に対する耐性の確認: 急激なリクエスト量増加を負荷テストのシナリオに組み込み、システムの挙動を把握する
- 適切なリソース設定の決定: 負荷テスト結果を基に、最適なPod数やリソース量を設定する
- 継続的なテスト実行環境の構築: Kubernetes環境で効率的に負荷テストを実行し、定期的にシステムの健全性を確認できる体制を整える
- 開発チーム全体での負荷テスト実施: インフラ担当だけでなく、開発者も扱いやすいツールを選定し、チーム全体で負荷テストに取り組める環境を作る
比較検討したサービス
- JMeter: 老舗のGUIベースの負荷テストツール
- k6: JavaScriptベースの負荷テストツール(採用)
比較した軸
開発チームとの親和性
- JavaScriptでのシナリオ記述: インフラ担当だけでなくアプリ開発者でも扱いやすい言語であること
- バージョン管理: テストスクリプトをGitで管理し、レビューやCI/CDに組み込みやすいこと
- テストの再現性: コードベースであり、環境に依存しない再現性の高いテストが実現できること
技術的優位性
- 軽量性とスケーラビリティ: メモリ消費が少なく、大規模な負荷テストでもリソース効率よく実行できること
- プロトコル対応: HTTP/REST、gRPC、WebSocketなど、複数のプロトコルに対応していること
- クラウドネイティブ: Kubernetes環境での実行に最適化されていること
選定理由
今回の要件への適合性
- Kubernetes統合: Kubernetes Jobとしての実行が標準サポートされており、GKE環境に適している
- 開発効率: JavaScriptでの設定により、チーム内での保守性が高い
- プロトコル対応: gRPCプロトコルにネイティブ対応しており、将来的な拡張に対応可能
- 柔軟な負荷パターン: ramping-arrival-rateなど段階的な負荷増加が設定可能で、実際のトラフィック変動を想定したテストシナリオを組める
技術的な決定要因
- Go製による軽量性: JMeterなどの他の負荷試験ツールと比べてメモリ消費が少なくスケールしやすい
- 開発者ファーストの思想: 従来のGUIベースの負荷テストツールとは異なり、開発者が慣れ親しんだプログラミング言語を使用して直感的にテストを作成できる
- モダンなDevOpsワークフローへの適応: CI/CDパイプラインとの統合、Infrastructure as Code(IaC)との親和性が高い
導入の成果
改善したかった課題はどれくらい解決されたか
- システムの耐性確認: 100 RPS程度の負荷に対応可能であることを確認でき、現在の設定で目標とする負荷に耐えられることが分かった
- オートスケーリングの検証: HPAによるオートスケーリングが適切に動作し、負荷増加に対応してPod数が調整されることを確認
- リソース設定の最適化: 最大負荷時においてもCPUリソースを使い切ることなくリクエストを捌けていることが確認でき、適切なリソース設定の指標を得られた
どのような成果が得られたか
- 効率的な負荷テスト環境の構築: k6 + Kubernetes Jobの組み合わせにより、簡単に負荷テストを実行できる環境を構築
- 現実的なテストシナリオの実現: 段階的負荷増加パターン(ramping-arrival-rate)により、実際のトラフィック変動を想定したテストを実現
- システムの健全性確認: レスポンス時間が全体を通して安定しており、システムの健全性を定量的に確認
- 継続的なテスト実施体制: Makefileによるコマンド化により、誰でも簡単に負荷テストを実行できる体制を整備
導入時の苦労・悩み
- Kubernetes Job定義ファイルの作成と設定の調整: k6をKubernetes Job方式で実行するための設定ファイルの構成を検討する必要があった
- ConfigMapを使ったスクリプトファイルの配置方法: テストスクリプトやサンプルデータをどのようにKubernetes環境に配置するか、ConfigMapを使った方法を調査・実装する必要があった
ただし、k6の公式ドキュメントは非常に充実しており、Kubernetes環境での実行方法やスクリプトの書き方、各種設定項目について詳細な説明と豊富なサンプルコードが提供されています。そのため、ドキュメントを参照しながら実装を進めることで、上記の課題も段階的に解決することができました。特に、Kubernetes統合やramping-arrival-rateの設定例など、実践的なユースケースがドキュメント化されているため、初めて導入する場合でも安心して取り組めます。
導入に向けた社内への説明
上長・チームへの説明
導入当時は、リクエスト量が増加するにあたって、最適なpod数、リソース量を設定するタスクを担当していました。負荷テストの環境が整っておらず、負荷テスト環境の構築が必要であるということは上長・チームメンバーとの共通認識の上で以下の内容を伝えました。
- 技術的な優位性: k6のクラウドネイティブな特性、軽量性、開発チームとの親和性
- コスト効率: OSSツールであり、既存のGKE環境で実行できるため追加コストが少ない
- 将来性: 継続的なテスト実施体制の構築により、長期的なサービス品質向上に貢献
活用方法
利用頻度と場面
- 新機能のリリース前やインフラ設定変更時に負荷テストを実施
- トラフィック増加が予想されるイベント前に、事前の性能確認として実施
- 本番環境でのパフォーマンス問題発生時に、ステージング環境での再現テストとして利用
- Pod数やリソース設定の最適化を検討する際に、複数パターンでの負荷テストを実施
よく使う機能
- ramping-arrival-rate: 一定時間あたりのリクエスト数を段階的に変更する機能
- 多段階負荷パターン: stagesを使った複数段階の負荷変動シナリオ
- check関数: レスポンスステータスの検証
ツールの良い点
- 軽量で高パフォーマンス: Go言語で実装されており、メモリ消費が少なく大規模な負荷テストでもリソース効率が良い
- 開発者フレンドリー: JavaScriptでシナリオを記述でき、開発者にとって扱いやすい
- Kubernetesとの親和性: 公式Dockerイメージが提供され、Kubernetes Jobとして簡単に実行可能
- 柔軟な負荷パターン: 段階的な負荷増加など、現実的なテストシナリオを簡単に実装できる
- プロトコル対応の広さ: HTTP/REST、gRPC、WebSocketなど多様なプロトコルに対応
- バージョン管理との親和性: コードベースでテストを管理でき、Gitでのバージョン管理やCI/CD統合が容易
- 監視ツールとの連携: PrometheusやGrafanaとの統合が標準でサポート
ツールの課題点
- GUIがないため、初めて触る人には学習コストがある
ツールを検討されている方へ
- クラウドネイティブ環境での負荷テストに最適: Kubernetes環境で運用している場合、k6は非常に適している
- 開発チーム全体での活用: JavaScriptでシナリオを記述できるため、インフラ担当だけでなく開発者も扱いやすい
- コードベースでの管理: テストスクリプトをGitで管理でき、レビューやCI/CDへの組み込みが容易
- 段階的な導入: まずは簡単なHTTPリクエストのテストから始め、徐々に複雑なシナリオに発展させるのがおすすめ
- 公式ドキュメントの充実: 公式ドキュメントが充実しているため、学習リソースには困らない
今後の展望
- 異なる負荷パターンでのテスト実施: スパイクテスト、ストレステスト、ソークテストなど、多様なシナリオでのテスト実施
- 定期的な負荷テストの自動化: CI/CDパイプラインに組み込み、定期的に自動で負荷テストを実施する体制を構築
- gRPCサーバーへの負荷テスト: 現在はREST APIに対してのみテストを実施しているが、今後はgRPCサーバーへの負荷テストも実施予定
- 負荷テスト環境の継続的改善: システムの成長に合わせて、負荷テスト環境も継続的に改善していく
グリーエックス株式会社 / Rintaro Takata
メンバー / バックエンドエンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
2024年1月~2025年3月 株式会社zooba エンジニア(長期インターン) 2025年4月~現在 グリーホールディングス株式会社 エンジニア
よく見られているレビュー
グリーエックス株式会社 / Rintaro Takata
メンバー / バックエンドエンジニア / 従業員規模: 301名〜500名 / エンジニア組織: 51名〜100名
2024年1月~2025年3月 株式会社...
もっとみる
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


