🙌

knative Servingのチュートリアルやってみよう

2023/02/14に公開

今回はKnativeのチュートリアルをもとにKnative Servingを試してみたいと思う。
自分がやったことの記録なので、軽い和訳だと思ってください。
これ通りにやればうまく動かせるかと思います。

Knaticeとは

Kubernetes上にサーバレスコンピューティングの基盤を構築するためのオープンソースソフトウェア。負荷に応じてコンテナの実行数を0から任意の数まで自由にスケーリングしてくれる。
一般的に使用される機能としてKnative ServingとKnative Eventingがある。

Knatice Servingとは

Kubernetes上でコンテナ化されたアプリケーションをデプロイおよびスケーリングする機能

Knatice Servingのユースケースの例

  • サーバーレス コンテナーの迅速なデプロイ
  • Podをゼロにスケーリングすることを含む自動スケーリング
  • 既存の環境に統合するための、Contour、Kourier、Istio などの複数のネットワーク レイヤーのサポート

今回はこの機能を試してみる。

環境構築

  1. Knative CLIをインストール
brew install knative/client/kn
  1. Knative quickstart pluginをインストール
brew install knative-sandbox/kn-plugins/quickstart
  1. Knative quickstart pluginを実行
kn quickstart kind

※kindがインストールされてない場合は一番下のkindのインストール方法(補足)を参照

下記コマンドが実行してknativeが返ってくれば構築完了

kind get clusters

Knative Serviceのデプロイ

  1. デプロイ
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!が返ってくれば問題なし

  1. オートスケール
    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サービスの異なるリビジョン間でトラフィックを分割する

  1. 新しい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)が変更される。

  1. 新しいRivisionへアクセス
curl "$(kn service describe hello -o url)"

Revisionがアップデートされてることがわかる

Hello Knative!
  1. 現在の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
  1. トラフィックの分割
    トラフィックを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