OKEでKnative Servingを動かしてみよう

# はじめに

この記事は、[Oracle Cloud Infrastructure Advent Calendar 2022 その1 Day 21](https://qiita.com/advent-calendar/2022/oci)の記事として書かれています。

みなさんはKnativeをご存知でしょうか？

KnativeはKubernetes上でサーバレス & イベントドリブンワークロードを動作させるためのプラットフォームです。

今回はKnativeをOKEで動作させるチュートリアル的な内容を簡単にご紹介します。

# [Knative](https://knative.dev/docs/)とは

まず、Knativeについて簡単にご紹介します。

Knativeは、大きく以下の2つのコンポーネントに分かれています。

* サーバレスワークロードを実行可能な[Knative Serving](https://knative.dev/docs/serving/)
* イベントドリブンなアーキテクチャを構築可能な[Knative Eventing](https://knative.dev/docs/eventing/)

今回はKnative Servingの方を取り上げます。 

# Knative Servingについて

Knative Servingは以下のようなコンポーネントをもちます。

![スクリーンショット 2022-12-20 13.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/81914375-f327-4820-f533-c31ba2a0078d.png)
こちらは[ドキュメント](https://knative.dev/docs/serving/)に記載されている図になります。

最上位に位置する`Service`はKubernetesの標準リソースである`Service`とはまた別のリソースになっており、基本的にはこの`Service`を作成することにより、いかに紐づくリソースが自動的に作成されるようになっています。
また、Knativeのコンポーネントだけではなく、Kubernetesの標準リソースであるPod,Deployment,Ingressなども一緒に作成してくれます。
Kubernetesの基本的なリソース部分の面倒を見てくれるという意味では、まさに`サーバレス`です！！

文字だけだと分かりづらいので、早速実際に動かしてみましょう。

# OKEでKnative Servingを動かしてみよう

OKEクラスタの構築については、[こちら](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-commons/)を参考に行ってください。

ここからは[Knativeのドキュメント](https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/)をベースに進めていきます。
今回は、`v1.8.3`を利用します。

まずは、Knativeのカスタムリソースとコアコンポーネントをインストールします。

```sh
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-crds.yaml
```

```sh
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-core.yaml
```

次にKnativeのnetworking layerとして[Kourier](https://github.com/knative-sandbox/net-kourier)をインストールします。
Knativeは他にもIstio、Contourなどのサービスをサポートしています。

```sh
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.8.1/kourier.yaml
```

デフォルトでは、networking layerの設定がIstioになっているので、変更します。  

```sh
kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
```

最後にサーバレスワークロードにアクセスするためのDNS設定を行っていきます。
今回は[sslip.io](https://sslip.io/)というDNSを利用します。

```sh
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-default-domain.yaml
```

これでKnativeのインストールは完了です！簡単ですね！！

では、実際にサーバレスワークロードを動かしてみましょう。

まず、以下のようなManifestを作成し、applyします。

```yaml:knative.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/helloworld-go
          ports:
            - containerPort: 8080
          env:
            - name: TARGET
              value: "World"
```

ここでの`Service`は、上記で説明したKnativeのコンポーネントです。（標準リソースの`Service`はありません）
`apiVersion`を見ると、`serving.knative.dev/v1`となっており、Knativeのカスタムリソースであることがわかります。  

applyします。

```sh
kubectl apply -f knative.yaml
```

applyできたら、以下のコマンドでKnative Serviceについて確認します。  

```sh
kubectl get ksvc
```

以下のように出力されます。

```sh
NAME            URL                                                   LATESTCREATED         LATESTREADY           READY   REASON
helloworld-go   http://helloworld-go.default.xxx.xxx.xxx.xxx.sslip.io   helloworld-go-00001   helloworld-go-00001   True    
```

`URL`列に記載されている値でブラウザやcurlからアクセスできますが、その前に確認しておくことがあります。

今回実行しているのは`サーバレスワークロード`なので、トラフィックやリクエストが発生していない今はアプリケーションが停止されています。

試しにPodを確認してみると・・・

```sh
kubectl get pods
```

何も出力されないはずです。
※もし、出力されている場合はしばらく待機するとPodが消えると思います。

```sh
No resources found in default namespace.
```

では、curlでアクセスしてみます。

```sh
curl http://helloworld-go.default.xxx.xxx.xxx.xxx.sslip.io  
```

以下のように出力されます。

```sh
Hello World!
```

そしてPodを確認すると・・・

```sh
$ kubectl get pods
NAME                                              READY   STATUS    RESTARTS   AGE
helloworld-go-00001-deployment-6986cb9fbf-6zxhw   2/2     Running   0          42s
```

先ほどまではなかったPodが生成されています！これがKnativeの特徴です。

このように、Knativeを利用すると簡単にワークロードのゼロスケールやオートスケールを行うことができます。

# まとめ

KnativeはKubernetes上でのワークロード実行時に非常に強力な武器を提供してくれます。

みなさんもぜひ使ってみてください！！

# 参考資料

https://knative.dev/docs/install/

https://knative.dev/docs/serving/

https://knative.dev/docs/getting-started/first-service/