はじめに
こんにちは、TIG所属の村田です。
フューチャー夏休み自由研究連載10本目の記事です。今回は夏休みの自由研究企画ということで、Cloud RunのベースであるKnativeを触ってみたいと思います!
実際に触ってみる
今回利用した各コンポーネントのバージョン
利用したコンポーネントとバージョンは以下です。記事投稿時点(2020.08.14)での最新バージョンを利用しています。
コンポーネント | バージョン |
---|---|
Kubernetes (GKE) | 1.17.8-gke.17 |
Knative (Serving) | v0.16.0 |
kn | v0.16.0 |
Istio | v1.6.8 |
Kubernetes Clusterの構築
今回はKnativeが主役なのでクラスタはGKEを使ってさくっと構築してしまいます。
なるべく最新に近いバージョンを使いたいのでRelease ChannelをRapid Channelに設定。
課金を抑えるためにPreemptibleインスタンスに設定。
Istioは自前インストールしたいので Enable Istio
のオプションにはチェックを入れないように。
上記以外の設定はデフォルトのままでクラスタを構築します(名称は my-summer
としました)。
また、以降の手順にて kubectl
コマンドを使うため、手元の端末で設定しておきます。
gcloud container clusters get-credentials my-summer --zone <YOUR_ZONE> --project <YOUR_PROJECT_ID> |
Knativeのインストール
次にKnativeのインストールを進めます。
Knative v0.16.0 requires a Kubernetes cluster v1.16 or newer
https://knative.dev/docs/install/any-kubernetes-cluster/
とありますが、今回利用するGKEバージョンは 1.17.8-gke.17
なので問題なさそうです。
以下のコマンドでCRDとcore-componentをインストールします。個々のコンポーネントがどのような役割をしているかまでは追えてないですが、Autoscalingなどベースとなる挙動を支えるコンポーネント群がインストールされます。
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/serving-crds.yaml |
Istioのインストール
次にネットワークレイヤの設定をします。筆者はてっきりIstioが必須かと思ってのですが、執筆時点で Ambassador
Contour
Gloo
Kong
Kourier
も選択肢にありました。
筆者はIstioが好きなので今回はIstioを選びました。記事投稿時点(2020.08.14)での最新バージョンである 1.6.8
をダウンロードします。
$ curl -L https://istio.io/downloadIstio | sh - |
実行バイナリにPATHを通しておきます。
cd istio-1.6.8 |
Istioをインストールします。インストール先は ~/.kube/config
で current-context
に設定されているクラスタです。
istioctl install |
ちゃんとIstioのインストールができてそうですね。
$ kubectl get pod --all-namespaces |
Knativeの設定
さて、次にKnative Istio Controllerをインストールします。これによりKnativeとIstioが連携可能になります。
$ kubectl apply --filename https://github.com/knative/net-istio/releases/download/v0.16.0/release.yaml |
次にDNSの設定をします。本来はしっかりとDNSの設定をするのですが、今回はxip.ioを使用して名前解決を行います。以下のKubernetes Jobで xip.io
がDNSのsuffixとして利用されるように設定されます。
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/serving-default-domain.yaml |
少しだけxip.ioについて補足しておくと、例えば 10.0.0.1.xip.io
というドメインは 10.0.0.1
と名前解決されることになります。今回はこの仕組みを利用します。
ここまででServing Componentのインストールは完了です。
Knative Servingの動作確認
Go製のサンプルアプリがGCRから取得可能なので動作を確認してみます。アプリはKnative CLIの kn
から行うのが一番簡単とのことで、筆者のMac端末へはHomebrew経由でインストールしました。
brew tap knative/client |
アプリをデプロイします。
kn service create helloworld-go --image gcr.io/knative-samples/helloworld-go --env TARGET="Go Sample v1" |
しっかりPodがデプロイされていることを確認できました!
$ kubectl get po |
立ち上がったアプリへリクエストをなげてみます。まずはエンドポイントの確認から実施するのですが、確認は kn
経由と kubectl
経由の2種類の方法があるようです。
kn
経由の場合は以下。
$ kn service describe helloworld-go |
kubectl
の場合は以下。
$ kubectl get ksvc helloworld-go |
当然ですが kn
経由のほうがアプリのリビジョンなど参照可能な情報がたくさんあります。これによってエンドポイントが分かりました。
http://helloworld-go.default.xx.xx.xx.xx.xip.io |
リクエストを投げてみます。
$ curl http://helloworld-go.default.xx.xx.xx.xx.xip.io |
このサンプルアプリは TARGET
という環境変数に渡した値を利用して Hello World: ${TARGET}!
と返してくるらしいので、期待通りに動作していることが確認できました。
また、ちゃんとscale-to-zeroの挙動も確認できました。リクエストが途切れてから90秒ほどでPodがTerminatingの状態になり、最終的にPodがKillされることを確認できました。
$ kubectl get po |
もう一度リクエストを投げてみると、レスポンスに少し時間がかかっていた(体感ですが2秒ほど)のでPod起動のリードタイムがかかっていると考えられます。
$ curl http://helloworld-go.default.xx.xx.xx.xx.xip.io |
ちなみにPodのREADYは 1/2
の状態でもレスポンスを返しているみたいだったのでPodの中身をもう少し見てみます(リクエストから90秒以内に確認コマンドを打つ必要があるので注意してください)
$ kubectl describe pod helloworld-go-txzsq-1-deployment-758cc788c-lg8w4 |
Pod内には user-container
と queue-proxy
の2つのContainerが起動しますが、 user-container
が起動した時点でレスポンスの返却はできてるみたいですね。
調べてみたところ queue-proxy
は user-container
のサイドカーコンテナとしてデプロイされるもので、プロキシとしてアプリケーションへのトラフィック量を監視する役割を担うようです。
The queue-proxy’s main purpose is to measure and limit concurrency to the user’s application.
queue-proxy
の情報は autoscaler
というコンポーネントが収集し、Podのスケールサイズ決定に利用されています。
kubectl get service -n knative-serving |
最後に
今回はKnativeに触ってみましたが、「Cloud RunはKnativeベースである」というふわっとした理解だった部分について、より具体的なイメージが湧きました。「Cloud RunはきっとKnativeをいい感じにラップしてるんだろうな」と思っていましたが、触ってみた感じだとあまりラップ層は分厚くなく割と素に近い状態で使われているのではと感じました。
また、個人的に一番学びだったのは「KnativeにとってIstioは必須ではない」という部分です。勝手にKnativeはIstioベースのサービスメッシュ機構に依存するものだと思っていたのですがそれは違いました。
最近はクラウドベンダーからマネージドサービスとして提供されるOSSも多いですが、あえて自前での構築を試してみると意外な発見があって面白いですね!!
さて、次回のエントリーは新人の仁木さんが担当されます! 仁木さんは研修中に競プロのバーチャルコンテストを企画しちゃったスーパーな新人さんです。ぜひご期待ください!
入社1か月の新人が競技プログラミングのバーチャルコンテストを企画するまで
また、本記事で触れたCloud Run・Istioについては以下のような記事もあがっているので読んでみてください。