Upgrade to Pro — share decks privately, control downloads, hide ads and more …

分散負荷試験の自動化を実現するGatling Operatorの紹介

Avatar for ksudate ksudate
March 29, 2022

分散負荷試験の自動化を実現するGatling Operatorの紹介

Avatar for ksudate

ksudate

March 29, 2022
Tweet

More Decks by ksudate

Other Decks in Programming

Transcript

  1. 分散負荷試験の自動化を実現する Gatling Operatorの紹介
 Kubernetes Meetup Tokyo #49 2022/03/29 株式会社ZOZO 技術本部

    SRE部 ECプラットフォーム基盤SREブロック 巣立健太郎 Copyright © ZOZO, Inc.
  2. © ZOZO, Inc. 株式会社ZOZO 技術本部 SRE部 ECプラットフォーム基盤SREブロック 巣立 健太郎 新卒SREとして、

    ZOZOTOWNリプレイスプロジェクトに参画 Kubernetes歴はもうすぐ1年 Twitter: @tmrekk_ 
 
 2
  3. © ZOZO, Inc. https://zozo.jp/ 3 • ファッション通販サイト • 1,500以上のショップ、8,400以上のブランドの取り扱い •

    常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品を掲載(2021年12月末時点) • ブランド古着のファッションゾーン「ZOZOUSED」や コスメ専門モール「ZOZOCOSME」、靴の専門モール 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン 「ZOZOVILLA」を展開 • 即日配送サービス • ギフトラッピングサービス • ツケ払い など
  4. © ZOZO, Inc. https://wear.jp/ 4 • ファッションコーディネートアプリ • 1,500万ダウンロード突破、コーディネート投稿総数は1,200万 件以上(2021年12月末時点)

    • ピックアップタグから最新のトレンドをチェック • コーディネート着用アイテムを公式サイトで購入可能 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレン ト・デザイナー・インフルエンサーといった各界著名人も参加
  5. © ZOZO, Inc. 6 目次 • 開発背景 • Gatling Operatorについて

    ◦ Gatlingとは ◦ Gatling Operatorとは • 使い方 • まとめ
  6. © ZOZO, Inc. 7 開発背景 ZOZOTOWN冬セール対策の負荷試験における課題 • 冬セールは1年で最もユーザアクセスの多いイベント • 大規模な負荷試験を本番相当の環境を使って実施

    • 大量のGatling実行用ノードの準備、実行タイミング調整、レポート生成が必要 Amazon ECSからAWS Fargateをデータプレーンとして利用する方式を採用 (2020年)
  7. © ZOZO, Inc. 8 開発背景 Amazon ECSからAWS Fargateをデータプレーンとして利用する方式を採用 大量のGatling実行用ノードを並べて分散負荷試験の実行やレポート生成などを自動化した しかし、AWS

    Fargateの制約から発生した課題に直面 • AWS Fargate スロットリングの制限 ◦ 各AWS アカウントの Amazon ECS RunTask API リクエストをスロットリングするため、制限 緩和申請などが必要になる • サービスあたりのタスクの最大数の制限 ◦ タスク用に予約可能なvCPUとメモリの選択の幅が狭く、目標スループットを実現するには実 行可能なタスク数が多くなり、結果として最大数以上のタスクが必要になる • 起動時間の遅さ
  8. © ZOZO, Inc. 9 開発背景 これらの課題を解決するために開発されたのが、Gatling Operator • AWS Fargate

    スロットリングの制限 ◦ Fargateを使用しないため制限なし • サービスあたりのタスクの最大数の制限 ◦ EKSではNodegroupあたりの最大Node数などがあるが、十分に大きいため影響がない • 起動時間の遅さ ◦ 事前にNodegroupを準備できるため、AWS Fargateのインスタンスの起動に比べて高速 また、負荷試験がマニフェストで宣言的に管理できることも大きなメリット
  9. © ZOZO, Inc. 10 Gatling Operatorについて Gatlingとは • オープンソースの負荷試験ツール •

    独自のDSLを使用して、Java・Scala・Kotlinのいずれかでテストシナリオを記述する • 試験終了後にHTMLレポートを自動生成
  10. © ZOZO, Inc. 12 Gatling Operatorについて Gatling Operatorとは • Kubernetesクラスタ上でGatlingを実行するKubernetes

    Operator • HTMLレポートをクラウドプロバイダー(S3やGCS)にアップロード • HTMLレポートへのリンクをWebhook URL(Slackなど)を用いて送信 https://github.com/st-tech/gatling-operator
  11. © ZOZO, Inc. 13 Gatling Operatorとは Gatling Operatorについて • Kubebuilderを使用

    • 3つのReconcileロジックを持つ • Kubernetesクラスタ上でGatlingを実行する ◦ gatlingRunnerReconcile • HTMLレポートをクラウドプロバイダー(S3やGCS)に送信 ◦ gatlingReporterReconcile • HTMLレポートへのリンクをWebhook URL(Slackなど)を用いて送信 ◦ gatlingNotificationReconcile
  12. © ZOZO, Inc. 16 Gatling Operatorとは gatlingRunnerReconcileについて • Gatling Runner

    Job ◦ gatlingRunnerReconcileが管理するJob ◦ Gatlingを実行 ◦ HTMLレポート用ログファイル(simulation.log)をS3にアップロード
  13. © ZOZO, Inc. 17 Gatling Operatorとは Gatling Runner Jobについて 1.

    Gatling Runner Jobの作成 2. JobのParallelism分のGatling Runner Podを作成 3. (オプション)HTMLレポート用ログファイルをS3やGCSなどにアップロード
  14. © ZOZO, Inc. 18 Gatling Operatorとは Gatling Runner Podについて •

    gatling-waiter ◦ 全てのPodが開始されるまで待機し、全てのPodでGatlingが実行されるタイミングを同期 • gatling-runner ◦ Gatlingの実行とHTMLレポート用ログファイルをemptyDirボリュームへ格納 • gatling-result-transfer ◦ emptyDirボリュームに格納されたHTMLレポート用ログファイルをrcloneを用いてS3などに アップロード
  15. © ZOZO, Inc. 19 Gatling Operatorとは Gatling Runner Podについて Initコンテナでは、1つ以上のコンテナを定義することが可能になっており、Kubeletはそれらの

    Initコンテナを1つずつ順番に実行する gatling-waiter、gatling-runner、gatling-result-transferはそれぞれ順番に実行される必要があ るため、Initコンテナを使用した構成になっている そのためHTMLレポート用ログファイルのアップロードをしない場合は、gatling-runnerはメイン コンテナで実行される
  16. © ZOZO, Inc. 20 Gatling Operatorとは gatlingReporterReconcileについて Gatling Reporter Job

    • gatlingReporterReconcileが管理するJob • HTMLレポート用ログファイルをS3やGCSから取得 • HTMLレポート(index.html)をS3やGCSにアップロード
  17. © ZOZO, Inc. 21 Gatling Operatorとは Gatling Reporter Jobについて 1.

    Gatling Reporter Jobの作成 2. Gatling Reporter Podの作成 3. HTMLレポート生成 a. S3からHTMLレポート用ログファイルをダウンロード b. HTMLレポート用ログファイルからHTMLレポートを(gatling.shより)生成し、S3にアップ ロード
  18. © ZOZO, Inc. 22 Gatling Operatorとは クラウドストレージ上のファイルのアップロード・ダウンロードはRcloneを使用 クラウドストレージ上のファイルを管理するためのコマンド Amazon S3やGoogle

    Cloud Storageなど40を超えるクラウドストレージサービスに対応 RcloneのインターフェイスでS3にもGCSにもファイル転送可能 Gatling Operatorでは、Rcloneを用いてクラウドストレージ上からファイルのアップロード・ ダウンロードを行っている https://rclone.org
  19. © ZOZO, Inc. 25 使い方 Gatling カスタムリソース(以下、CR)について Gatlingをクラスタ上で実行するにはCRのGatlingをデプロ イする必要がある 3つのフラグとGatlingを実行するRunner

    PodのpodSpec や、クラウドストレージの設定情報を定義する cloudstorageSpec、通知先のwebhook urlを定義する notificationSpec、Gatlingのテストシナリオ・データや Gatlingを並列実行するための設定情報などを定義する testScenarioSpecなどの設定が可能 詳しくは、API Reference or テックブログを参照
  20. © ZOZO, Inc. 29 使い方 - 事前準備 gatling-worker-service-account.yaml Gatling Runner

    Podで使用するサービスアカウントやRole、RoleBindingを定義
  21. © ZOZO, Inc. 30 使い方 - 事前準備 SlackのWebhook URLをbase64 エンコードした値をSecretに保存

    gatling-waiterコンテナがPodの 状態を取得するために必要なRole など
  22. © ZOZO, Inc. 31 使い方 - 事前準備 先程のサービスアカウントを指定 generateReport: trueにより、

    HTMLレポートの生成を行う notifyReport: trueにより、 S3へのリンクの通知を行う AmazonS3FullAccessを付与した IAMユーザのIDとKEYを指定 先程作成したSecretを指定 parallelismにより、Runner Pod の数を指定 ログ送信先のバケット名を指定 今回はAmazon S3のgatling-log バケットにアップロード
  23. © ZOZO, Inc. 35 使い方 - Gatlingの実行 Gatling Runner Podのコンテナ

    Initコンテナにgatling-waiterとgatling-runner、メインコンテナにgatling-result-transferがそ れぞれ設定されていることが確認できる
  24. © ZOZO, Inc. 36 使い方 - Gatlingの実行 Gatling Runner Pod

    gatling-result-transferコンテナ実行完了後に、HTMLレポート用ログファイルがgatling-demo バケットにアップロードされていることを確認
  25. © ZOZO, Inc. 37 使い方 - HTMLレポートの生成・アップロード Gatling Reporter Pod

    Gatling Runner Podの完了後に、Gatling Reporter Podが作成される
  26. © ZOZO, Inc. 38 使い方 - HTMLレポートの生成・アップロード Gatling Reporter Podのコンテナ

    Initコンテナにgatling-result-aggregatorとgatling-report-generator、メインコンテナに gatling-report-transfererがそれぞれ設定されていることが確認できる
  27. © ZOZO, Inc. 39 使い方 - HTMLレポートの生成・アップロード バケットの確認 Gatling Reporter

    Podの完了後にgatling-logバケットを確認し、HTMLレポートがアップロードさ れていることを確認
  28. © ZOZO, Inc. 40 使い方 - HTMLレポートのS3 URIをSlackへ送信 Slackの確認 Webhook

    URLを設定したチャンネルへ、Gatling Reporter Podが生成したHTMLレポートまでの S3 URIが送信される