knative Servingのチュートリアルやってみよう
今回はKnativeのチュートリアルをもとにKnative Servingを試してみたいと思う。
自分がやったことの記録なので、軽い和訳だと思ってください。
これ通りにやればうまく動かせるかと思います。
Knaticeとは
Kubernetes上にサーバレスコンピューティングの基盤を構築するためのオープンソースソフトウェア。負荷に応じてコンテナの実行数を0から任意の数まで自由にスケーリングしてくれる。
一般的に使用される機能としてKnative ServingとKnative Eventingがある。
Knatice Servingとは
Kubernetes上でコンテナ化されたアプリケーションをデプロイおよびスケーリングする機能
Knatice Servingのユースケースの例
- サーバーレス コンテナーの迅速なデプロイ
- Podをゼロにスケーリングすることを含む自動スケーリング
- 既存の環境に統合するための、Contour、Kourier、Istio などの複数のネットワーク レイヤーのサポート
今回はこの機能を試してみる。
環境構築
- Knative CLIをインストール
brew install knative/client/kn
- Knative quickstart pluginをインストール
brew install knative-sandbox/kn-plugins/quickstart
- Knative quickstart pluginを実行
kn quickstart kind
※kindがインストールされてない場合は一番下のkindのインストール方法(補足)を参照
下記コマンドが実行してknativeが返ってくれば構築完了
kind get clusters
Knative Serviceのデプロイ
- デプロイ
kn service create hello \
--image gcr.io/knative-samples/helloworld-go \
--port 8080 \
--env TARGET=World
下記のようなログが出力されたらデプロイ成功
Service 'hello' created to latest revision 'hello-00001' is available at URL:
http://hello.default.127.0.0.1.sslip.io
試しにcurlしてみる
curl http://hello.default.127.0.0.1.sslip.io
Hello World!が返ってくれば問題なし
- オートスケール
Knative Servingは、自動スケーリングを提供している。
Knativeサービスが使用されていない場合、デフォルトで実行中のポッドがゼロになるまでスケールダウンする。
現在動いているKnative Servingを表示
kn service list
NAME URL LATEST AGE CONDITIONS READY
hello http://hello.default.${LOADBALANCER_IP}.sslip.io hello-00001 13s 3 OK / 3 True
オートスケールを監視する
kubectl get pod -l serving.knative.dev/service=hello -w
現在のPodの稼働状況が表示される
hello-00001-deployment-5948f76bc5-f5dfv 0/2 Terminating 0 93s
hello-00001-deployment-5948f76bc5-2hnll 0/2 Pending 0 0s
hello-00001-deployment-5948f76bc5-2hnll 0/2 Pending 0 0s
hello-00001-deployment-5948f76bc5-2hnll 0/2 ContainerCreating 0 0s
hello-00001-deployment-5948f76bc5-2hnll 1/2 Running 0 1s
hello-00001-deployment-5948f76bc5-2hnll 2/2 Running 0 1s
hello-00001-deployment-5948f76bc5-2hnll 2/2 Terminating 0 62s
hello-00001-deployment-5948f76bc5-2hnll 1/2 Terminating 0 90s
hello-00001-deployment-5948f76bc5-2hnll 0/2 Terminating 0 92s
PodにアクセスするとPodが起動したり、時間が立つとPodがスケールダウンするのがわかる。
curl "$(kn service describe hello -o url)"
トラフィックの分割
トラフィックの分割はブルーグリーンデプロイやカナリヤリリースでよく使われる。
Revisionは、アプリケーションコードと構成のスナップショット。Knative サービスの設定を変更するたびに、新しいRevisionが作成される。トラフィックを分割する場合、Knativeは Knativeサービスの異なるリビジョン間でトラフィックを分割する
- 新しいRevisionの作成
TARGET=WorldをTARGET=Knativeに変更する。
kn service update hello --env TARGET=Knative
Service 'hello' created to latest revision 'hello-00002' is available at URL:
http://hello.default.${LOADBALANCER_IP}.sslip.io
URLは変わらないが、新しいRevisionは名前(hello-00002)が変更される。
- 新しいRivisionへアクセス
curl "$(kn service describe hello -o url)"
Revisionがアップデートされてることがわかる
Hello Knative!
- 現在のRevisionの情報を見る。
kn revisions list
NAME SERVICE TRAFFIC TAGS GENERATION AGE CONDITIONS READY REASON
hello-00002 hello 100% 2 30s 3 OK / 4 True
hello-00001 hello 1 5m 3 OK / 4 True
- トラフィックの分割
トラフィックを2つのRevisionに分割する
kn service update hello \
--traffic hello-00001=50 \
--traffic @latest=50
Revisionの情報を見る
kn revisions list
NAME SERVICE TRAFFIC TAGS GENERATION AGE CONDITIONS READY REASON
hello-00002 hello 50% 2 10m 3 OK / 4 True
hello-00001 hello 50% 1 36m 3 OK / 4 True
TRAFFICが2つのRevisionに50%振り分けられていることがわかる。
何回かcurlしてみる。
curl "$(kn service describe hello -o url)"
トラフィックが分割されてることがわかる。
Hello Knative!
Hello World!
Hello Knative!
Hello World!
所感
KubernetesクラスターにKnatice Servingを簡単に導入することができた。0からのスケールもすぐできるのはかなり驚きで、限られたリソースを有効活用していくのにかなり使えそうな機能だと思った。このチュートリアルは一時間ほどできたので、興味ある人は試してみることをおすすめします。
kindのインストール方法(補足)
インストールコマンド
brew install kind
kindについて
- 名前はKubernetes IN Dockerの略
- Docker コンテナ「ノード」を使用してローカルKubernetesクラスターを実行するためのツール
- ローカル開発や CI に使用することができる
Discussion