はじめに
この記事は、Oracle Cloud Infrastructure Advent Calendar 2022 その1 Day 21の記事として書かれています。
みなさんはKnativeをご存知でしょうか?
KnativeはKubernetes上でサーバレス & イベントドリブンワークロードを動作させるためのプラットフォームです。
今回はKnativeをOKEで動作させるチュートリアル的な内容を簡単にご紹介します。
Knativeとは
まず、Knativeについて簡単にご紹介します。
Knativeは、大きく以下の2つのコンポーネントに分かれています。
- サーバレスワークロードを実行可能なKnative Serving
- イベントドリブンなアーキテクチャを構築可能なKnative Eventing
今回はKnative Servingの方を取り上げます。
Knative Servingについて
Knative Servingは以下のようなコンポーネントをもちます。
こちらはドキュメントに記載されている図になります。
最上位に位置するService
はKubernetesの標準リソースであるService
とはまた別のリソースになっており、基本的にはこのService
を作成することにより、いかに紐づくリソースが自動的に作成されるようになっています。
また、Knativeのコンポーネントだけではなく、Kubernetesの標準リソースであるPod,Deployment,Ingressなども一緒に作成してくれます。
Kubernetesの基本的なリソース部分の面倒を見てくれるという意味では、まさにサーバレス
です!!
文字だけだと分かりづらいので、早速実際に動かしてみましょう。
OKEでKnative Servingを動かしてみよう
OKEクラスタの構築については、こちらを参考に行ってください。
ここからはKnativeのドキュメントをベースに進めていきます。
今回は、v1.8.3
を利用します。
まずは、Knativeのカスタムリソースとコアコンポーネントをインストールします。
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-core.yaml
次にKnativeのnetworking layerとしてKourierをインストールします。
Knativeは他にもIstio、Contourなどのサービスをサポートしています。
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.8.1/kourier.yaml
デフォルトでは、networking layerの設定がIstioになっているので、変更します。
kubectl patch configmap/config-network \
--namespace knative-serving \
--type merge \
--patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'
最後にサーバレスワークロードにアクセスするためのDNS設定を行っていきます。
今回はsslip.ioというDNSを利用します。
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.8.3/serving-default-domain.yaml
これでKnativeのインストールは完了です!簡単ですね!!
では、実際にサーバレスワークロードを動かしてみましょう。
まず、以下のようなManifestを作成し、applyします。
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します。
kubectl apply -f knative.yaml
applyできたら、以下のコマンドでKnative Serviceについて確認します。
kubectl get ksvc
以下のように出力されます。
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を確認してみると・・・
kubectl get pods
何も出力されないはずです。
※もし、出力されている場合はしばらく待機するとPodが消えると思います。
No resources found in default namespace.
では、curlでアクセスしてみます。
curl http://helloworld-go.default.xxx.xxx.xxx.xxx.sslip.io
以下のように出力されます。
Hello World!
そしてPodを確認すると・・・
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworld-go-00001-deployment-6986cb9fbf-6zxhw 2/2 Running 0 42s
先ほどまではなかったPodが生成されています!これがKnativeの特徴です。
このように、Knativeを利用すると簡単にワークロードのゼロスケールやオートスケールを行うことができます。
まとめ
KnativeはKubernetes上でのワークロード実行時に非常に強力な武器を提供してくれます。
みなさんもぜひ使ってみてください!!
参考資料