[MEMO]katacodaでLearn Kubernetes ver9 Kubeless
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を理解しよう
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さえあればどれでもいけるのか。 もうちょいそこの関係を勉強する必要あるな。
公式サイトみる
ピックアップ
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はオートスケールをしてるんだとおもう。
まとめ
Kubelessも初めて知ったときから、進化してるように感じる。本番での安定性とか気になるが、この実装の簡単さはいいですね。あと、Prometheus等との連携を考えると実運用でもかなり使えるんじゃないかなと思う。まぁ、すぐに使う用途がなさそうなことが悔しいですね。
余談
下記のコマンドでhttpアクセスへのproxyをローカルに建てれるみたいだけど、知らなかった。ちょっと、あとで調べよう
kubectl proxy --port 8080 &