TatsuyaのテクTechブログ

IT技術を中心に勉強したことを書くブログ

Knativeハンズオンをやってみた

1月上旬にKnativeハンズオンが公開されたので、発表当初から気になっていたのもありやってみた。ハンズオンでできることと、Knativeのことについてまとめておく。ちなみに、Knativeは当然だが、Kubernetesを触ってみたのも今回が初めて。

 

目次

 

Knativeとは?

 Google Cloud Next'18で発表されたコンテナ実行環境上でサーバレスを提供するOSSKubernetesが提供しているカスタムリソース定義(CRD)を使ったAPI群とOSSのセットであり、Kubernetes上で簡易にPaaS/FaaS環境を実現できるようになるというもの。

www.publickey1.jp

github.com

背景

 Knativeが出てきた背景は、以下にある記事を読むと、目的としてはサーバレスにおけるクラウドのロックイン回避と運用ロジック(API)の標準化。インフラ環境としてどこを使ってもよいが、その上で動作させるソフトウェアを運用するロジックは標準化(OSS化)させるべきという考えらしい。

www.atmarkit.co.jp

 Google Cloudは以前から、クラウドベンダーロックイン回避のため、GCPをいつ始めても止めても構わないという話もしているし、そのためにKubernetesも提供しているので、サーバレスにおいて似たような背景からKnativeを出したのは自然な流れだと思う。

できること

 Knativeでできることは以下3種類のAPIで提供されている機能となる。

 (Knativeハンズオンから引用)

 

  • Knative Serving:トラフィックを処理するアプリケーションをホストするのに役立つ一連API。カスタムルーティングや自動スケーリングなどの機能を提供します。
  • Knative Build:クラスタ内でビルド(ソースコードに対する任意の変換)を実行できるようにするAPIのセット。たとえば、Knative Buildを使用してアプリをコンテナイメージにコンパイルし、そのイメージをレジストリにプッシュすることができます。
  • Knative Eventing:イベントソースとアプリケーションへのイベント配信を宣言できるようにするAPIのセット。

  ざっと読んだ感じ、今までGoogle App Engine、Cloud FunctionsやAWS Lambdaで提供されている機能を自前で用意しなくても、Kubernetesを使っていればAPIベースで簡単に使えるようになると読める。

直近の動き

 Kanative関連の直近(2019/1/15)で大きなニュースは以下2つあり、Knativeを拡張した新たなサーバレス環境や既存FaaSの互換環境を提供するなど、サーバレス界隈の中心となっているように見える。

www.publickey1.jp

www.publickey1.jp

Knativeハンズオン概要

 ここからハンズオンの内容に入る。実施にあたって、Kubernetesを動かす環境が必要なる。Googleのcodelabsだからだと思うが、GKEベースでのハンズオンとなっている。また、CLIGCPのCloud Shellを推奨している。もし、他環境で試したい場合はGitHubのインストールガイドにドキュメントがある。また、Kubernetesの基礎知識と、できればIstioの知識もあると理解しやすい。

所要時間は、GKEとKubernetesを初めて触る私で3~4時間。ただし、コマンドの意味を知るために別の記事を読むなどの脱線を含めた時間。

codelabs.developers.google.com

 ハンズオンで実施することは以下の通り。基礎知識の学習とKnative Eventingを除いたAPIの基本機能を試すことができる内容となっている。

  • Knative概要と機能の学習
  • Knativeインストール(Kubernetesクラスタ作成を含む)
  • KnativeへのWebアプリケーションのデプロイ
  • オートスケール機能利用とPodの監視
  • Knative Servingを使ったBlue/Greenデプロイ
  • Knative Buildを使ったビルドのテンプレート化

所感は後述するが、パブリッククラウドを使った場合はハンズオン後忘れずにKubernetesクラスタを削除しましょう。GKE未経験だったので詳しく知らなかったが、裏でGCEが動いており、放置するとノード数分課金されます。

Knativeハンズオンの一例

 ハンズオンにある内容なので、詳細は割愛するが、インストールは以下のコマンドを使うことで実行できる。

Knativeインストール

 1.Istioインストール  

kubectl apply --filename https://raw.githubusercontent.com/knative/serving/v0.2.1/third_party/istio-1.0.2/istio.yaml

kubectl label namespace default istio-injection=enabled

kubectl get pods --namespace=istio-system

  ハンズオンでIstioインストール後のpodの状態

username@cloudshell:~ (project name)$ kubectl get pods --namespace=istio-system
NAME READY STATUS RESTARTS AGE
istio-citadel-746c765786-bc8jd 1/1 Running 0 25m
istio-cleanup-secrets-bqchr 0/1 Completed 0 25m
istio-egressgateway-7b46794587-npc57 1/1 Running 0 25m
istio-galley-75c6976d79-8cb8h 1/1 Running 0 25m
istio-ingressgateway-57f76dc4db-pb5vz 1/1 Running 0 25m
istio-pilot-6495978c49-68j4t 2/2 Running 0 25m
istio-policy-6677c87b9f-mprxf 2/2 Running 0 25m
istio-sidecar-injector-879fd9dfc-r49wz 1/1 Running 0 25m
istio-statsd-prom-bridge-549d687fd9-d64sd 1/1 Running 0 25m
istio-telemetry-7d46d668db-2df7p 2/2 Running 0 25m

 2.Knative(Serving&Build)のインストール

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.2.1/release.yaml

kubectl get pods --namespace=knative-serving

kubectl get pods --namespace=knative-build

  ハンズオンでKnativeインストール後のpodの状態

username@cloudshell:~ (project name)$ kubectl get pods --namespace=knative-serving
NAME READY STATUS RESTARTS AGE
activator-db79694db-lnjfv 2/2 Running 0 6m
activator-db79694db-n4hds 2/2 Running 0 6m
activator-db79694db-tbw9k 2/2 Running 0 6m
autoscaler-86d954bffc-hznf5 2/2 Running 0 6m
controller-5cc6f8cc95-rzm6k 1/1 Running 0 6m
webhook-654c8d7bff-kcdqm 1/1 Running 0 6m

username@cloudshell:~ (project name)$ kubectl get pods --namespace=knative-build
NAME READY STATUS RESTARTS AGE
build-controller-79d6cc9d57-j2vhd 1/1 Running 0 6m
build-webhook-f97d479f9-mdt27 1/1 Running 0 6m

 

所感

 ハンズオンをやってみて、以下の様に感じた(薄い感想)。

  • GAEでできること(Blue/Greenデプロイ)が、環境を選ばずに簡単に準備できるのは便利そう。
  • GKEを使ってKubernetesクラスタを構築するの簡単だった(Knative関係ない)。
  • Knative環境には、複数のサービスが動いており、リソースと運用が大変そう。(Kubernetes、Istio以外に、監視サービスのためにPrometheusとGrafanaがデフォルトでインストールされ動作している。)

次やってみたいこと