Cloud Run ことはじめ
概要
Cloud Runって?
- フルマネージドのコンテナ向けサーバレス
- 使っていない時はゼロまでスケールインする。
- AWSのFargateに近いが、時間制限によってLambdaとFargateの中間、みたいな使い勝手に個人的には感じる。
- 処理時間に応じて課金(100ms単位)
- かなり安い(1vCPU秒あたり$0.000024, メモリ1GiB/秒あたり$0.000025, 100万リクエストあたり$0.40)。
- Always Free(有料アカウントでも使える無料枠)もある。
- Knative(後述)をベースにしている。
- 実行時間の制限あり。(デフォルト5分、最大15分)
- イメージのデプロイ時に設定可能。(参考: 公式: リクエスト タイムアウトの設定)
- AWS Fargateは時間なしだったような。
- GPUは使えない。
- Cloud Run for Anthosでは GPU使えるけど、15分制限は同じ。
ユースケース
k8sを使うほどではないマイクロサービスに向いているとのこと。
参考:
GKE と Cloud Run、どう使い分けるべきか
公式ドキュメントに記載されているもので個人的にしっくりきたものを以下に抜粋。
- シンプルな構成のAPIやWebサイト
- GSuiteと連携するバックエンドアプリケーション
- 短時間で終わるデータ処理でコンテナ使いたいとき
基本的にはシンプルな構成のアプリケーションでコンテナを使いたい場合、になると思う。
また、制限時間があるので1つのコンテナ処理時間が短いもの。
基本的な使い方
- GCRにDockerイメージをpush
- Cloud Runをデプロイ
これだけ。
デプロイすると、ダッシュボード上で簡単なメトリクスが見れたり。
StackDriverのログが見れたり。
デプロイしたコンテナごとに固有のHTTPSエンドポイントが付与される。
(
カスタムドメインのマッピングも出来るけどベータっぽい。)
このエンドポイントにリクエストを送ることで、コンテナ内のアプリケーションが実行される。
コンテナ内のコードは
PORT 環境変数で定義されたポートで HTTP リクエストをリッスンする必要があります。
参照: コンテナをビルドする
つまりバッチ処理だろうが、Flask的なHTTPサーバをコンテナ内に用意しなければならない。
この理由からバッチ処理よりは、REST APIやWebアプリケーションに向いてそう。
Knative
k8s上でサーバレスワークロードを開発・管理するためのプラットフォーム。
Knativeとは?をやり出すと膨大になるので割愛(というか知識不足で説明できない)
参考:
公式ドキュメント
ちなみにKubeflowのサービング(
KFServing)にもKnativeが使われている。
デプロイ、サービング、オートスケールなど、コンテナアプリケーションの構築で面倒なところを助けてくれる。
Cloud RunはKnativeをベースにすることで、Kubenetes, Cloud Run, Cloud Run for Anthos間の移行がスムーズになっているとのこと。
起動時間
ゼロにスケールする、ということはゼロから新規起動時には遅そう。
公式ドキュメントにも、コールドスタートが発生するとあるらしい。
よく検証されているブログがあったのでリンクを貼っておく。
Cloud Runをコールドスタートからレスポンスタイムが安定化されるまでどのぐらいかかるか
コールドスタートの発生を防ぐために、一部のインスタンスをアイドル状態にすることがあるらしい。(
公式ドキュメント: インスタンスをアイドル状態にしてコールド スタートを最小限に抑える)
多分、アイドル状態時に課金はされないはず。(されないでくれ)
Cloud Schedulerなどで定期的にリクエストをCloud Runに投げる、など工夫も可能。 参考: [Cloud OnAir] Cloud Run Deep Dive ~ GCP で実践するモダンなサーバーレス アプリケーション開発 ~ 2019年9月12日 放送
一緒に使いそうなサービス
Cloud Build
GCPのCIサービス。Cloud Buildのコンテナ内でビルドしたDockerイメージをGCRにpushできる。
Cloud Runのデプロイ時に、GCRにあげたイメージ名を指定する。
(Cloud Buildを使わなくても、ローカルでdocker buildしてGCRにpushしてもOK)
Cloud Tasks
マネージドなキュー。非同期実行したいときに使う。
Cloud Pub/Sub
マネージドなPub/Sub。同じく非同期実行したいときに使う。