だいごろうのブログ

熊本出身で大阪、東京、パリを転勤して、今は福岡でデータエンジニアです

[MEMO]katacodaでLearn Kubernetes ver9 Kubeless

www.katacoda.com

Kubeless

build up kubeless service

KubelessはKubenetes上で、Serverlessを構築するOSS

kubelessのネームスペース作り、オフィシャルに配布されてるYamlを適応させれば、環境を作れるみたい。

kubectl create ns kubeless
kubectl create -f https://github.com/kubeless/kubeless/releases/download/v1.0.0-alpha.8/kubeless-v1.0.0-alpha.8.yaml

cli

kubelessっていうクライアントがいて、それを用いて、functionのデプロイができるみたい。

Deployの仕方。Runtimeは他に何があるんだろう

kubeless function deploy hogehoge --runtime python2.7 \
                              --handler hogehoge.handler \
                              --from-file hogehoge.py

hogehoge.pyの中身はこんな感じになるっぽい。割とシンプルですな。 公式ページ読んでわかったが、 handlerは"XXXX.YYYY" XXXXはdeploy名で YYYYはfrom-fileの中から呼びたいメソッド名になるっぽい。

def handler(event, context):
   print event
   return event['data']

kubelessからもコールできるので、これは検証用って感じかな。

kubeless function call hogehoge --data '{"hello":"world"}'

あと、kubectl proxyでproxy立てて、そこからアクセスも可能。

curl --data '{"hello":"world"}' localhost:8080/api/v1/namespaces/default/services/hogehoge:8080/proxy/ --header "Content-Type:application/json"

CONTINUE
Terminal   
toy-7c8fc67549-knc52

ログ見たり、詳細見たり。

kubeless function logs hogehoge
kubeless function describe hogehoge

Kubelessについて詳しく調べる

いつもどおり、公式とgithubを理解しよう

github.com

Readme

kubelessは custom-resource-definitionsを使って、kubenetes上に作られてるみたい。 Extend the Kubernetes API with CustomResourceDefinitions - Kubernetes 現状、HTTPかPubSub mechanismに対応してる。 PubSubはKafkaとか。

強豪で、 fissionとfunktion等がいるらしいが、kubelessが一番kubernetes naitiveだと信じてるって書いてあるわ。こういう、思想みたいなのは好きだなぁ。技術選択のときに、こういう開発者の信念とか書いてあると、プロダクトの方向性がわかっていいですよね。

実行環境

実際に、実行して見るときはここに気をつけて。 kubernetesのバージョンの互換性がある。僕が見たとき2019/07/25だと、 1.9以上っていうのがあるみたい。 https://github.com/kubeless/kubeless#compatibility-matrix-with-kubernetes

Sample code

https://github.com/kubeless/kubeless/tree/master/examples ballerina golang java nodejs php python ruby

結構なサポートある。Runtimeさえあればどれでもいけるのか。 もうちょいそこの関係を勉強する必要あるな。

公式サイトみる

kubeless.io

ピックアップ

  • AWS Lambda CLI互換。
  • Kafka messaging and HTTP events対応
  • Prometheus監視をデフォルトでサポート。function callとlatency

Kubernetesは最近はPrometheusを利用するケースが多いみたい。 weaveもそうだったし。

Kafkaを紐付けるのどうするんだろう

https://kubeless.io/docs/pubsub-functions/

公式からの引用だが、このコマンドを用いることによって、kafkaへのtriggerを作るらしい。このケースはtestってfunctionを先に作っておいて、test-topicのEventに紐付けるみたい。

$ kubeless trigger kafka create test --function-selector created-by=kubeless,function=test --trigger-topic test-topic

Kafkaを登録する方法はここを参照 https://kubeless.io/docs/use-existing-kafka/

kubelessネームスペースにkafka-trigger-controllerという名のDeployを作り、その中で、特定のpodをbroker名とcert系の設定を持って、Objectを作れば自動的にそれを利用するのかな。2つKafkaを使いたい場合はどうするんだろう。もっと調べなければ。

Autoscale

Kubelessにはpodのautoscaleの機能が備わっていて、cpuやqpsのしきい値を超えたらスケーするようなことが可能なようだ。便利だなこれも。

kubeless autoscale create --help
automatically scale function based on monitored metrics

Usage:
  kubeless autoscale create <name> FLAG [flags]

Flags:
  -h, --help               help for create
      --max int32          maximum number of replicas (default 1)
      --metric string      metric to use for calculating the autoscale. Supported
      metrics: cpu, qps (default "cpu")
      --min int32          minimum number of replicas (default 1)
  -n, --namespace string   Specify namespace for the autoscale
      --value string       value of the average of the metric across all replicas.
      If metric is cpu, value is a number represented as percentage. If metric
      is qps, value must be in format of Quantity

https://kubeless.io/docs/autoscaling/

ただ、そもそもKubernetesにも"Horizontal Pod Autoscaler"というものがあり、それを用いることでCPUベースで自動スケール設定を入れることが可能なようだ。 で、Custom MetricsでCPU以外でもしきい値を設定できるみたいなので(1.6以降)、それを用いて、 kubelessはオートスケールをしてるんだとおもう。

kubernetes.io

まとめ

Kubelessも初めて知ったときから、進化してるように感じる。本番での安定性とか気になるが、この実装の簡単さはいいですね。あと、Prometheus等との連携を考えると実運用でもかなり使えるんじゃないかなと思う。まぁ、すぐに使う用途がなさそうなことが悔しいですね。

余談

下記のコマンドでhttpアクセスへのproxyをローカルに建てれるみたいだけど、知らなかった。ちょっと、あとで調べよう

kubectl proxy --port 8080 &