Cloud RunとGKEの使い分けまとめ

Cloud RunとGKEはどちらもコンテナを動かすサービスなので、「複数サービスに分けるならGKE」「マイクロサービスならKubernetes」といった規模やアーキテクチャの基準で選び分けようとしがちです。ところがこの基準は間違いのもとで、それっぽい選択肢を出されたときに誤答します。

この記事では、『GKE概要まとめ』までで見たKubernetesの前提を踏まえ、Cloud RunとGKEの本当の分かれ目を整理します。結論を先に言うと、分かれ目は「マイクロサービスかどうか」ではなく「Kubernetesの運用モデルが必要かどうか」です。

この記事でわかること
  • Cloud Runでもマイクロサービスは作れるという事実
  • Cloud RunとGKEの本当の分かれ目
  • それぞれが向くケースと判断の早見表

前提: Cloud Runでもマイクロサービスは作れる

まず誤解を解きます。マイクロサービスはKubernetesでしか作れないものではありません。『マイクロサービスの概要まとめ』で見たとおり、マイクロサービスはアプリケーションを独立したサービスに分ける設計の話で、実行基盤とは別レイヤーだからです。

Cloud Runは、コンテナを渡すだけで動かせるサーバーレスなコンテナ実行環境です。サービスごとにコンテナを用意して別々のCloud Runサービスとしてデプロイし、API通信や非同期メッセージングで連携させれば、Cloud Runだけでマイクロサービスは成立します。

つまり「サービスを複数に分けている=Kubernetesが要る」ではありません。分割はどちらでもできます。分かれ目は別のところにあります。

違いはKubernetesの運用モデルが必要かどうか

Cloud RunとGKEの本当の分かれ目は、Kubernetesの制御モデルを自分で握る必要があるかどうかです。

GKEはKubernetesなので、『Kubernetesのデプロイ概要まとめ』で見たような、Podの配置・スケール・ネットワークの細かな制御を、Kubernetesのリソースを通じて自分で宣言できます。その代わり、Kubernetesという仕組み自体を理解し、運用する前提があります。

Cloud Runは、その制御モデルを表に出しません。コンテナと「同時実行数」「最大インスタンス数」といった少数の設定を渡せば、スケールも含めてプラットフォームが面倒を見ます。Podやクラスタという概念は登場しません。

観点Cloud RunGKE
実行の考え方コンテナを渡すと動くKubernetes上でコンテナを運用する
スケールリクエストに応じて自動。ゼロまで縮小できるHPAやCluster Autoscalerを構成して制御
制御できる範囲少数の設定に絞られるKubernetesのリソースで細かく制御できる
運用の前提Kubernetesの知識は不要Kubernetesの理解と運用が前提
向く方向運用を任せて手離れを良くしたい制御モデルを握って作り込みたい

同じコンテナを動かすにしても、「制御モデルを握るか、任せるか」で立ち位置が正反対です。これが規模ではなく判断の軸になります。

Cloud RunとGKEのメリット・デメリット

Cloud RunとGKEは、どちらが上位という関係ではありません。運用を任せて速く動かすCloud Runと、Kubernetesの制御を使って作り込むGKEの違いとして捉えると整理しやすくなります。

  • Cloud Run
    • メリット
      • コンテナを渡すだけで動き、サーバーやKubernetesを管理しなくてよい
      • アクセスがないときはゼロまで縮小できる
      • 少ない設定で素早くサービスを公開できる
    • デメリット
      • Pod配置やクラスタ構成のようなKubernetesの細かな制御はできない
      • Kubernetesのエコシステムを前提にした構成には向かない
  • GKE
    • メリット
      • Kubernetesのリソースを使って、配置・スケール・ネットワークを細かく制御できる
      • Service Meshや各種コントローラなど、Kubernetesの周辺エコシステムを使いやすい
      • 多数の常時稼働サービスをクラスタとしてまとめて運用しやすい
    • デメリット
      • Kubernetesの理解と運用が前提になる
      • Cloud Runより管理する概念が増える

Cloud Runが向くケース

次のような場合は、Kubernetesの運用モデルを持ち込む必要がなく、Cloud Runが向きます。

  • HTTPリクエストやイベントに応じて動くサービスで、細かな配置制御が要らない
  • アクセスがないときはゼロまで縮小し、コストを抑えたい
  • Kubernetesの運用に人手をかけたくない
  • サービスを素早く立ち上げ、手離れよく運用したい

「Kubernetesでしかできないこと」を必要としていないなら、Cloud Runで十分、というのが基本の判断です。

GKEが向くケース

次のような、Kubernetesの制御モデルそのものが必要な場合はGKEが向きます。

  • Podの配置やスケールを細かく制御したい(ノードの指定、GPU利用など)
  • Kubernetesのエコシステム(後述のService Meshや各種コントローラ)を活用したい
  • 常時稼働する多数のサービスを、クラスタとして一元的に運用したい
  • すでにKubernetesで作られたシステムがあり、それを前提に動かす

言い換えると、GKEを選ぶ理由は「Kubernetesが要るから」であって、「マイクロサービスだから」ではありません。

判断の早見表

要件からの判断を早見表にすると以下です。

要件・状況向く選択肢
コンテナを動かしたいが、Kubernetesの制御は要らないCloud Run
アクセスがないときゼロまで縮小してコストを抑えたいCloud Run
Podの配置やスケールを細かく制御したいGKE
Kubernetesのエコシステムを活用したいGKE
既存のKubernetes資産を前提に運用するGKE

迷ったときの目安は「Kubernetesならではの制御を挙げられないならCloud Runで十分」です。

まとめ

Cloud RunとGKEは、規模やアーキテクチャではなく、Kubernetesの運用モデルが必要かどうかで選び分けます。要点は以下です。

  • マイクロサービスは実行基盤の話ではなく、Cloud Runでも作れる。分割の有無は判断軸にならない
  • 本当の分かれ目は、Kubernetesの制御モデルを自分で握る必要があるかどうか
  • Cloud Runはコンテナを渡すと動き、制御を任せる。Kubernetesの知識は不要
  • GKEはKubernetesの制御を細かく握れるが、Kubernetesの理解と運用が前提
  • 迷ったら、Kubernetesならではの制御を挙げられないならCloud Runで十分

参考

タグ: GCP, マイクロサービス, システム設計