【レポート】 『アサルトリリィ Last Bullet』大規模プロジェクトにおけるKubernetes利用事例 #CEDEC2021 #classmethod_game

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!ゲームソリューション部の岡本です。

2021年08月24日から08月26日の間に開催されているCEDEC2021に参加していました。

参加したセッション『アサルトリリィ Last Bullet』大規模プロジェクトにおけるKubernetes利用事例についてレポートします。

セッション概要

  • スピーカー
    • 髙田 広 氏 株式会社ポケラボ ゲーム事業本部 エンジニアマネージャー
  • 資料

2021年1月20日に配信開始したソーシャルゲームアプリ「アサルトリリィ Last Bullet」では、Kubernetesを導入しています

本セッションではゲーム開発でのKubernetes利用事例を以下流れで紹介いたします

  • 1. 導入経緯
  • 2. 開発フェーズ 〜工夫した点と、起きた課題/解決方法〜
  • 3. 運用フェーズ 〜工夫した点と、起きた課題/解決方法〜
  • 4. これからの改修/導入したい事

セッション詳細

自己紹介

1.Docker / K8s を利用した経緯

  • ポータビリティ性
    • ローカル環境・開発環境・本番環境で動作が保証されている
    • パブリッククラウドの移行、運営移管などが容易
  • マイクロサービス化
    • ローカル環境でミドルウェアの追加/更新が容易
    • 大規模サービスを安全かつスピーディに開発可能
  • IaC
    • ミドルウェア・インフラ構成の設定値をコード化でき、保守性が向上
  • クラウドはAWSを利用中
    • 自社サービスで利用実績有
    •  開発着手時に Amazon EKS が東京リージョンに対応(2018/12)
    • 従来のEC2構成に比べ、試算上費用はほぼ変わらなかった

  • アプリケーションサーバはapche,phpで構成されたコンテナを使用
  • リアルタイムバトルのため、メッセージ転送ブロードキャスト用の常時接続サーバが存在。Cacheとセット
  • admin:運営問い合わせ用の管理ツールで使用
  • Batch:GvG等のマッチング処理用

2. 起きた課題、解決方法~開発フェーズ~

  • ①manifestファイルの管理
    • 実行環境が多く yaml ファイルが冗長的になり、管理が難しい
      • [解決]kustomize ツールを導入して base ファイルを作成することで、冗長化を防ぐ
    • インフラエンジニアとアプリケーションエンジニアの担当範囲が曖昧
      • [解決]ルートディレクトリを分割し、インフラエンジニアとアプリケーションエンジニアの担当範囲を明確化
  • ②開発用アプリサーバのコンテナに関して、access_log, php_error_log が pod 差し替えのタイミングで消える
    • 本番環境では、sumologicを利用して収集していたが、社内取り決め上開発環境では利用できなかった
    • [解決]DaemonSet として FluentD を設定して、Amazon CloudWatch Logs へログ転送を行う

  • ③Batchは従来のEC2と同様にbusybox crondを使用、podが再生成されるとプロセスが中断されてしまう
    • [解決]Batch専用の node を作成。Node Taints でスケジューリングを制御し、自動でのpod 再作成を抑制 バッチ実行中はデプロイしないよう、運用で解決する

起きた課題、解決方法~負荷試験~

  • rollout restart 中にエラーレートが増加。
    • 原因は AWS API のスロットリング発生によるもの
    • [解決]API 呼び出しの頻度を抑えるために maxSurge を減らして pod の入れ替え速度を遅くする。30% -> 2% に変更

  • 負荷試験はpodのアプリサーバ数は100で実施。
  • maxSurgeを2%にすると、デプロイ開始から完了まで15分程度掛かるが、安全性を優先し、リリース時は2%へ
  • 現在は負荷も減り、podの数も落ち着いているため10%で運用
  • DBとの接続において、接続エラー(abort to connect)が頻発
    • [解決]接続先エンドポイントの末尾にドットを付けて、search による補完を回避
    • core dns の pod 数を増やす

起きた課題、解決方法~運用フェーズ~

  • 従来のEC2構成だと、構築等時間のかかる作業だった
    • 本対応では構築含め1日も使わずに対応出来た

  • Production/app:常時接続サーバからのアクセス
  • Production/app-external:外部からのアクセス
  • 12:00からイベントを開始。開始時はapp-externalが増加傾向にある。
  • GvGは20時、21時、22時、23時に実施
  • 容量不足
    • [解決]AWS EC2上にJenkins専用のインスタンスを作成。EBSでボリュームサイズを容易に変更可能に
  • アクセス認証管理がプロダクト独自管理
    • [解決]社内からのアクセスのみ許可
    • 社内共通ADFSとの連携

改修/導入したい事

  • cronjobの利用
    • 現在のサーバ構成だと、バッチ起動中に pod が再生成されると処理が止まる
    • CronJobを使用しkubernetesの機能でスケジューリング出来るようしたい
  • Horizontal Pod Autoscalerの導入
    • 公式
    • 目的はサーバ費用適正化
    • CPU使用率やメモリ使用率の状況によってpodの自動スケーリングを可能としたい

まとめ

感想

  • k8sについて、実際のソーシャルゲームでの運用事例として出されているケースは貴重だと思います。
  • k8周りの情報もっと欲しい…!
  • レポートでは一部を纏めていますので、気になる方はぜひCEDiLの資料を見てみましょう!
    • CEDEC2020の資料では利用手順含め、今回の前段部分がプレゼンされています。こちらも見るとより理解が深まると思います。

ポケラボさんではアサルトリリィラストバレット関連のセッションを他にも3つ開催されていました。他3つのセッションもレポートしていますので興味があれば是非見てみて下さい。