ローカルでKnativeを動かす

## Knativeとは
https://knative.dev/docs/

Kubernetes上でサーバーレスなアプリケーションをデプロイ・実行・管理するコンポーネントセットです
開発者が複雑なインフラストラクチャを気にせずコードに集中するための環境を提供してくれます

* ゼロスケーリングと自動スケール
* Kubernetes上であればベンダーロックインされない
* 一般的な言語やフレームワークの多くをサポート

コンテナの実行とスケーリング、リビジョン管理に関するServingと、イベントのサブスクリプションを管理するEventing、2つのコンポーネントから構築されます

ローカル環境でKnativeを構築してコンテナのデプロイと実行を試してみます

## 環境
macOS Big Sur 11.4

## Knativeの構築
https://knative.dev/docs/getting-started/

※`quickstart`プラグインが出ているので、以下手順は少し古い

事前準備

```sh
$ brew install kind
$ brew install kubectl 
$ brew install knative/client/kn
```

[kind](https://kind.sigs.k8s.io/)と[konk](https://github.com/csantanapr/knative-kind)を使って構築します

```sh
$ curl -sL install.konk.dev | bash
# 割と時間かかる
```

確認

```sh
$ kind get clusters
knative

# ネームスペースと複数のリソースが作成されてる
$ kubectl get ns | grep knative
knative-eventing     Active   3m40s
knative-serving      Active   5m8s

$ kubectl get all -n knative-serving
NAME                                      READY   STATUS    RESTARTS   AGE
3scale-kourier-control-5b464bcd66-4snkz   1/1     Running   0          4m50s
activator-8bf774c58-tw8kt                 1/1     Running   0          5m32s
...

$ kubectl get all -n knative-eventing
NAME                                        READY   STATUS    RESTARTS   AGE
pod/eventing-controller-8548bbf497-6ggpg    1/1     Running   0          4m42s
pod/eventing-webhook-5fffb9c9cf-6bqzc       1/1     Running   0          4m41s
...
```

## アプリケーションのデプロイと実行
https://knative.dev/docs/getting-started/first-service/

```sh
$ kn service create hello \
--image gcr.io/knative-samples/helloworld-go \
--port 8080 \
--env TARGET=World \
--revision-name=world

$ curl http://hello.default.127.0.0.1.nip.io
Hello World!

# デフォルトのネームスペースにPodが立ち上がってる
$ kubectl get po
NAME                                      READY   STATUS    RESTARTS   AGE
hello-world-deployment-7c68546989-x4gk8   2/2     Running   0          105s
```

## ゼロスケーリングの確認
https://knative.dev/docs/getting-started/first-autoscale/

PodをwatchしているとしばらくしてPodが削除されます
Podが存在しない状態で先程のエンドポイントを叩くと再度Podが作成されます

```sh
$ kubectl get pod -l serving.knative.dev/service=hello -w
NAME                                      READY   STATUS    RESTARTS   AGE
hello-world-deployment-7c68546989-2fslw   2/2     Running   0          52s
hello-world-deployment-7c68546989-2fslw   2/2     Terminating   0          63s
hello-world-deployment-7c68546989-2fslw   1/2     Terminating   0          65s
hello-world-deployment-7c68546989-2fslw   0/2     Terminating   0          96s
hello-world-deployment-7c68546989-bzv8g   0/2     Pending       0          0s
hello-world-deployment-7c68546989-bzv8g   0/2     Pending       0          0s
hello-world-deployment-7c68546989-bzv8g   0/2     ContainerCreating   0          0s
hello-world-deployment-7c68546989-bzv8g   1/2     Running             0          1s
hello-world-deployment-7c68546989-bzv8g   1/2     Running             0          2s
hello-world-deployment-7c68546989-bzv8g   2/2     Running             0          3s
```

## 構築した環境の削除
```sh
$ kn service delete hello
$ kind delete clusters knative
```

## まとめ
割と簡単に試せました

本番環境に構築する際は以下のドキュメントが参考になります
https://knative.dev/docs/admin/install/

最後に、こちらの記事で詳細にKnativeの解説がされています

https://qiita.com/toshi0607/items/6dbdff717e1ba0aba4f6