Cloud RunはKnativeをどこまでマネージしてくれているのか

Cloud RunかわいいよCloud Run

コンテナアプリ作っておけば「どこかで動いているKubernetes上」で
それを動かすことのできるサーバレスコンテナ環境、Cloud Run。
Webアプリコンテナだったら独自ドメインも使えるし、
Lets Encryptですけど自動で証明書もあててくれるし、いい感じです。
Cloud Runは正確には「どこかのKubernetes上で動いているKnative環境」で、
GCPがそれらの面倒を見てくれている(マネージドなKnative)わけですので、
Cloud Runを理解するためには、Knativeを理解する必要があります。
GAになったとはいえ、Cloud RunはKnativeの機能の一部しか利用できないため
今どこまでマネージドにできていて今後何ができそうなのか、というところを見ていきます。
また、一旦Knativeの構成要素のうち、「Serving」にフォーカスします。
Cloud Runも今はServingしか提供してないですし。

Knativeって?

ということで、Cloud Runを理解すると書きつつ、
ここからはKnativeを理解していきます。
概念や構築、基本的な機能は以下のハンズオンが参考になりますので端折ります。
https://github.com/toshi0607/build-your-own-platform-with-knative
公式はこちら。
https://knative.dev/

Cloud Runの機能とKnativeの機能の対応

ここからはCloud Runに現在ある機能(設定)が
Knativeのどの機能(設定)に対応しているのか、について確認します。
Cloud Runのサービス作成時の入力項目をベースに見ていきます。

認証

外部からアクセス可能か否か。
KnativeのServingはデフォルトで外にオープンなので
内部向けにするには設定を入れる必要があります。
https://knative.dev/docs/serving/cluster-local-route/
これを切り替えてくれてるんですね。
ちなみに実際に上記ドキュメントどおりにKnativeでやろうと思ったら
svc名.ns名.svc.cluster.localでkube-dnsがひいてくれない。。。
https://medium.com/google-cloud/cluster-local-issue-with-knative-eventing-v0-9-0-a1fee2215cfe
ググってこれで解決。内部用のgatewayが必要なのかしら。(よく読んでない

リクエスト数

RevisionリソースのcontainerConcurrencyの値っぽい。

タイムアウト

RevisionリソースのtimeoutSecondsの値っぽい。

コンテナポート

Cloud Runのサービスを作成するとhttpsのエンドポイントが生成されます。
なので基本http443(or 80)で外部からの通信を待ち受けます。
コンテナポートは、エンドポイントにアクセスがきたらどのポートでアプリ側のコンテナに渡すか、という設定になります。
たとえばWebアプリコンテナで8080で待ち受けてる、とかであればそのポートを設定することになります。
実際のKnative環境でも、Servingを作成するとデフォルトでhttp80で待ち受けるエンドポイントが作成されます。
これがKnativeのどこで設定されてるかちょっとわからなかったのでまた調べる。

自動スケーリング

これ
https://knative.dev/docs/serving/configuring-autoscaling/

Cloud SQL接続

使ってないので一旦置き

サービスのドメイン

Cloud Runで作ったアプリには[サービス名]-[識別子?].a.run.appっていうドメインが割り当てられる。
KnativeのConfig Mapでドメインを変更できるので、そこで設定しているのでしょう。
https://knative.dev/docs/serving/using-a-custom-domain/

カスタムドメイン&SSL化

カスタムドメインも同様に、設定時はサービスとドメインを入力するので
その情報をもってConfig Mapを更新していると思われる。
カスタムドメインの設定と同時にLets Encryptによる自動更新の証明書が
当てられていると思われる。
https://knative.dev/docs/serving/using-auto-tls/

まとめ

ざっと見た感じ、KnativeにあってCloud RunにないServingの機能って
Observabilityのところと、Routingの細かい制御くらいなのでは?
と思いました。(Knativeのドキュメントベースで)
https://knative.dev/docs/serving/
Routingできれば、Canaryリリースとかできるようになってひとまずだいたいいい感じになりそう。