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

大規模ゲームインフラとしての Kubernetes とノーメンテナンス運用

大規模ゲームインフラとしての Kubernetes とノーメンテナンス運用

Avatar for Tsubasa Nagasawa

Tsubasa Nagasawa

December 03, 2021
Tweet

More Decks by Tsubasa Nagasawa

Other Decks in Programming

Transcript

  1.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 2
 Table of Contents


    • ソーシャルゲームのバックエンド
 • ゲームインフラのアーキテクチャ変遷
 • Kubernetes 及び GKE のリリースサイクル
 • GKE バージョン更新や新機能の導入戦略
 • 課題と今後について

  2.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 3
 About Me
 •

    長澤 翼 (Tsubasa Nagasawa)
 • インフラエンジニア
 • 株式会社コロプラ所属 (2020.3-)
 • 横断的なチームでゲームタイトルの GKE クラスター運用と改善
 • 外部登壇
 ◦ Zero Scale Abstraction in Knative Serving
 ◦ Reliable and Performant DNS Resolution with High Available NodeLocal DNSCache

  3.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 4
 Original Backend Components


    • API Server
 ◦ ゲームロジックが実装された REST API サーバー
 • Realtime Game Server
 ◦ UDP/TCP でメッセージをやり取り
 ◦ 対戦・協力・チャットルーム
 ◦ コロプラ内製の仕組み
 ▪ Game Server の管理
 ▪ リアルタイム通信のフレームワーク 

  4.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 6
 Original Architecture
 •

    API Gateway クラスター
 ◦ HAProxy とフォワードプロキシが動作
 • API Server クラスター
 ◦ 複数クラスターで同一のコンポーネントを動かす
 ▪ Kubernetes のコントロールプレーンへの負荷軽減 
 ▪ Application のデプロイ時間の短縮 
 ▪ Blast radius の縮小
 ◦ HAProxy でトラフィック分割
 ▪ 5% (canary) クラスター
 ▪ 割合は問題が起きない限り固定 

  5.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 7
 Original Architecture
 •

    Game Server クラスター
 ◦ パブリッククラスターでクライアントが Pod (ノード) に直接接続
 ◦ コロプラ内製の仕組みの上で動く
 • GKE 上でデータストアを動作
 ◦ 揮発性のキャッシュ
 ◦ 更新頻度の低いリレーショナルデータ
 ▪ 自作の MySQL Operator を駆使 
 ◦ 複雑なマルチクラスターのサービスディスカバリー
 ▪ NodeLocal DNSCache (CoreDNS) + CoreDNS 

  6.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 8
 No Maintenance Policy


    • ノーメンテナンスで GKE を運用する上で避けられない作業
 ◦ GKE クラスターの定期的なバージョン更新
 ◦ GKE の新機能への移行
 ◦ アプリケーションの展開とイベント前の台数調整
 ▪ 開発者が気軽に実行できるようにパイプラインを組む 
 ◦ GKE 上で動作するミドルウェアやツールの更新
 ▪ こまめに更新できる仕組みを作る 
 ◦ 外部システムのメンテナンスに耐える
 ▪ e.g. キューにタスクを積んで後処理 

  7.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 9
 Original Upgrade Strategy


    • クラスター切り替えによる GKE バージョン更新
 ◦ API Gateway クラスター
 ◦ API Server クラスター
 ◦ Datastore クラスター
 • Surge upgrade による GKE バージョン更新
 ◦ Game Server クラスター
 ◦ Miscellaneous クラスター
 ◦ Spinnaker クラスター

  8.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 10
 Original Upgrade Strategy


    • API Gateway クラスター
 ◦ Terraform で新規クラスターと必要なリソース作成
 ◦ ベースの Helm chart を手動インストール
 ◦ HAProxy の設定で古いクラスターに向ける
 ◦ 動作確認
 ◦ DNS レコードを切り替えて 2 週間程度待つ
 ◦ HAProxy の設定で徐々に新クラスターに向ける
 ◦ HAProxy の設定から古いクラスターの情報を削除

  9.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 11
 Original Upgrade Strategy


    • API Server クラスター
 ◦ Terraform で新規クラスターと必要なリソース作成
 ◦ ベースの Helm chart を手動インストール
 ◦ Spinnaker への登録とパイプライン作成と展開
 ◦ QA 含めた動作確認
 ◦ Pod の最小台数をピーク時の台数に調整
 ◦ 切り替えが終わったら Pod の最小台数を元に戻す

  10.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 12
 Original Upgrade Strategy


    • Datastore クラスター
 ◦ Terraform で新規クラスターと必要なリソース作成
 ◦ ベースの Helm chart を手動インストール
 ◦ クラスター間のサービスディスカバリの設定
 ◦ MySQL のスナップショットの作成と復元
 ◦ RabbitMQ に残ったメッセージの後始末

  11.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 13
 Original Upgrade Strategy


    • 安全だが工数が掛かる
 ◦ 2 人月程度
 ◦ 開発チームとの調整事項が多い
 ▪ データベースの更新停止期間の調整 
 ▪ QA のお願い
 ▪ Spinnaker のパイプライン移行の共有 
 ▪ …
 ◦ 毎回この工数を掛けられない
 ▪ 横断チームなので運用タイトルが増えると破綻する 
 ▪ GKE のバージョン更新の頻度は? 

  12.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 14
 Kubernetes Release Cycle


    • Kubernetes のリリースは年間 3 回 (2021/4~)
 ◦ v1.23 -> 2021/12/7
 ◦ v1.24 -> 2022/4/12
 ◦ v1.25 -> 2022/8/9
 ◦ v1.26 -> 2022/12/6
 • 最新の 3 つのマイナーバージョンがサポート対象
 ◦ マスターとノードは 2 つのマイナーバージョンまで離れても動作可

  13.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 15
 GKE Release Channel


    • Rapid channel
 ◦ Kubernetes の新機能を試す人向け
 • Regular channel
 ◦ 新機能をある程度安定した状態で利用したい人向け
 ◦ Google Cloud のオススメ
 • Stable channel
 ◦ 新機能よりも安定度を優先
 ◦ コロプラで利用したいが...
 出典: https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#what_channel_should_i_use
  14.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 16
 GKE Release Channel


    • Release channel を使用するとノードも強制的に自動更新
 ◦ ノードの自動更新をオフにできない
 ◦ Google Cloud の推奨する更新方法
 • クラスターの更新時刻はメンテナンスウィンドウで指定可能
 ◦ 32 日間で 48 時間以上確保が必要
 ◦ クラスターの更新順序を明示的に指定不可
 ◦ メンテナンスの除外設定もあるにはあるが制限がある
 ◦ 開発/本番環境で release channel を変えることを推奨
 • ノーメンテナンスで Release channel を使うのは怖い...

  15.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 17
 GKE Release Cycle


    • GKE release schedule が公開
 ◦ 各マイナーバージョンが利用可能になる大まかな日程が分かる
 ◦ Stable channel のデフォルトバージョンの更新予定は非公開
 • GKE のマイナーバージョンのサポート期間
 ◦ Regular channel で利用可能になってから 14 ヶ月で EOL
 ▪ 12 ヶ月のサポートと 2 ヶ月のメンテナンス期間 
 ▪ 強制的なノードのバージョン更新が開始 

  16.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 18
 GKE Upgrade Cycle

    in Colopl
 • No channel で Stable channel 風な運用
 ◦ Stable channel のマイナーバージョンの更新サイクルに合わせる
 ▪ Stable channel のデフォルトバージョンが一番安定なはず... 
 ▪ No channel ならノードの自動更新を無効にできる 
 ▪ 3 - 4 ヶ月に 1 回は更新作業が発生 
 ◦ コントロールプレーンは自動で上がる
 ▪ ノードとパッチバージョンの差異は目をつむる 
 ▪ CVE やクリティカルなバグ修正が入る場合はノードも上げる 
 • 事前に検証環境で負荷を掛けながら動作確認

  17.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 19
 Difficulties in Original

    Architecture
 • API Gateway クラスターの切り替えに時間が掛かる
 ◦ HAProxy の DNS 切り替えが浸透するまで待つ時間
 ◦ HAProxy の設定ファイルの更新とリロードが手動作業
 • Datastore クラスターの切り替えに時間が掛かる
 ◦ MySQL の移行に工数が掛かる
 ◦ RabbitMQ のメッセージが微妙に残る問題
 ◦ 複雑なサービスディスカバリ
 • アプリケーションの実装に変更はないが QA が必要
 ◦ マニフェストの更新に伴って動作が変わる場合がある

  18.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 20
 Current Backend Components


    • API Server
 ◦ ゲームロジックが実装された REST API サーバー
 • Realtime Game Server
 ◦ UDP/TCP でメッセージをやり取り
 ◦ 対戦・協力・チャットルーム
 ◦ Agones で Game Server の管理
 ◦ リアルタイム通信部分は内製のフレームワーク
 • Live Streaming
 ◦ 配信用の UDP リレーサーバー

  19.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 22
 Current Architecture
 •

    API Gateway クラスター (廃止)
 ◦ HAProxy とフォワードプロキシをそれぞれ VM に移行
 • API Server クラスター
 ◦ 以前とほぼ変更なし
 ◦ 定期実行のバッチ処理を Misc から移動
 ▪ 複数起動でロック取得できた子が処理 
 ◦ Grafana を各クラスターで起動
 ▪ Cloud SQL バックエンド
 ▪ HAProxy で各クラスターに振り分け 

  20.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 23
 Current Architecture
 •

    Game Server クラスター
 ◦ Agones Controller が SPOF
 ▪ Game Server の台数とライフサイクルの管理 
 ▪ 複数クラスターにして冗長性を担保 
 ▪ 割り当て済みの Game Server に影響はない 
 ◦ Allocator を独自実装
 ▪ Game Server に複数の”部屋”を作る 
 ▪ 部屋を割り当てて接続先を返却 
 ▪ クライアントは部屋に直接接続
 ▪ 部屋の割り当てに失敗したらクライアント側でリトライ 

  21.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 24
 Current Architecture
 •

    Game Server クラスター
 ◦ Live Streaming
 ▪ ゲーム + 配信というコロプラの新しい試み 
 ▪ 複数クラスター構成に現状できない 
 • 配信システムのコンポーネントを冗長化 
 • UDP 接続が不安定な場合に CDN にフォールバック 

  22.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 25
 Current Architecture
 •

    Datastore クラスター (廃止)
 ◦ RabbitMQ (VM)
 ▪ 外部システム依存な処理や非同期処理で利用 
 ◦ MySQL (VM) or TiDB Cloud (MySQL 互換)
 ▪ 利用用途で使い分け
 ▪ MySQL Operator を VM 対応
 ◦ Redis (VM) or Redis Enterprise
 ▪ レスポンスキャッシュ, KVS, ランキング, ... 

  23.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 26
 Current Architecture
 •

    Infra Tools クラスター
 ◦ ArgoCD
 ▪ Helmfile + go-task (Makefile) でマニフェストを生成 
 ▪ GitLab と ArgoCD を連携して GitOps 風 
 ▪ App of Apps で ArgoCD Application を Helm chart 化 
 ◦ Temporal
 ▪ Uber の Cadence からスピンオフ
 ▪ 耐障害性のある状態を持った Workflow エンジン 
 • Azure Durable Functions に似てる 
 ▪ インフラ作業をコード化して実行 

  24.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 27
 Current Upgrade Strategy


    • GKE バージョン更新は Surge upgrade
 ◦ Agones の破壊的変更などがなければ
 • GKE の新機能や CA 証明書の更新
 ◦ これまで通りクラスター切り替えで対応
 ◦ 重いクラスターがいないので以前よりは楽なはず...

  25.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 28
 Current Upgrade Strategy


    • GKE バージョン更新は Surge upgrade
 ◦ ステートレスなワークロードなら問題なし
 ▪ アプリケーションの展開と挙動は同じ 
 ▪ PDB を正しく設定する
 ◦ K8s に依存する部分の更新は慎重に
 ▪ Agones の更新は最悪切り替えを覚悟 
 ◦ K8s の API バージョンの更新対応はすぐに
 ◦ HAProxy のトラフィック分割の設定は基本的に触らない
 ▪ Canary クラスターから更新
 ◦ 工数が大幅に削減 (2 人月 -> 2 人日)

  26.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 29
 Current Upgrade Strategy


    • GKE バージョン更新のワークフローを Temporal + Go で実装
 ◦ コントロールプレーン
 ▪ バージョン更新
 ▪ 更新完了待ち
 ◦ ノードプール
 ▪ Max surge の台数を割合から動的に計算 
 ▪ 自動修復の機能を無効化
 ▪ バージョン更新
 ▪ 更新完了待ち
 ▪ 自動修復の有効化

  27.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 30
 Current Upgrade Strategy


    • GKE バージョン更新のワークフローを Temporal + Go で実装
 ◦ 時間指定でワークフローを実行
 ◦ 複数クラスターを順々に更新するワークフローを実行

  28.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 31
 Upcoming Major Changes


    • GKE Dataplane v2 (1.20.6-)
 ◦ Cilium によるコンテナネットワークの置き換え
 ◦ eBPF ベースのルーティング、ネットワークポリシーとロギング
 ◦ さようなら kube-proxy
 ◦ 有効にするにはクラスターの再作成が必須
 ▪ クラスター切り替えが必須
 ◦ その他に固有の新機能が登場する可能性

  29.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 32
 Other Considerations
 •

    GKE (Kubernetes) が内部的に使用している証明書の更新
 ◦ CA 証明書の更新とそれに伴う発行済みの証明書の更新
 ◦ GKE における CA 証明書の有効期限は 5 年
 ▪ 有効期限が切れると GKE クラスターが壊れてサービス影響が出る 
 ◦ 証明書の in-place での更新も可能だが...
 ▪ ノードプールが再作成される
 ▪ コントロールプレーンの IP も変わる 
 ▪ kubeconfig の更新
 • Spinnaker などのツール
 • kubectl のクライアントを実行する環境 

  30.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 33
 Planned Changes 


    • Container-Optimized OS (COS) への移行
 ◦ Ubuntu のノードイメージの安定性の問題
 ◦ COS でしか使えない機能の登場
 • Compute Engine persistent disk CSI Driver への移行
 ◦ 既存の In-tree GCE PD Volume Plugin も使えるが...
 • Artifact Registry への移行
 ◦ Artifact Registry でしか使えない機能の登場
 • マルチクラスター間通信のネイティブ実装への移行
 ◦ Multi-cluster Services/Gateways

  31.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 34
 Summary
 • GKE

    のノーメンテナンス運用は可能
 ◦ クラスター切り替えと Surge upgrade の使い分け
 ▪ GKE のバージョン更新は基本的に Surge upgrade 
 ▪ GKE の一部の新機能の導入はクラスター切り替え 
 ◦ 運用しながらアーキテクチャを変えられるように
 ▪ 最初から完璧なアーキテクチャを目指さない 
 ▪ コンポーネントは置き換え可能な形で設計 
 ▪ コンポーネントの最新化も短いスパンで定期的に 

  32.           COLOPL, Inc. All Rights Reserved|CONFIDENTIAL 35
 We are Hiring!


    • コロプラでは Kubernetes エンジニアを積極採用中です!!
 ◦ GKE, Cloud Spanner を使ったゲームや基盤の開発
 ◦ Kubernetes のエコシステムを含めた Cloud Native への取り組み
 コロプラ 採用 検索 ▼詳しくは https://be-ars.colopl.co.jp/recruit/career/engineer/kubernetes.html