repl.info

Knativeのオートスケール機能をminikubeで試したメモ

Knativeが発表されたので、GKEや手元のminikubeで遊んでいた。オートスケール機能について試したよ。autoscale-go/README.mdをminikubeでやった、という記録です。

GKEでもいいけど、今回はminikubeを使う。Mac上にhyperkitを使って構築するので、kubernetes/minikubeを参考にしてminikubeをhyperkitで使えるようにしておく必要があります。

Knative servingのインストール

基本的にドキュメントに従って進めればよいので割愛。

autoscale-goを試す

さて、autoscale-goを試してみる。サンプルアプリをビルドしてコンテナイメージをレジストリに置くのだけど、今回はhub.docker.comに置くことにした。minikubeの場合、minikube上でビルドしてしまえばレジストリに置く必要もないかも。

docker build \

  --tag "rtakaishi/autoscale-go" \

  --file=serving/samples/autoscale-go/Dockerfile .

プッシュ

docker push rtakaishi/autoscale-go

autoscale-go用のマニフェストを書き換えて、レジストリにプッシュしたイメージを使用する必要がある。公式ドキュメントを真似して、perlで書き換え。

perl -pi -e \

"s@github.com/knative/docs/serving/samples/autoscale-go@$REPO/autoscale-go@g" \

serving/samples/autoscale-go/service.yaml

diffを確認…

diff --git a/serving/samples/autoscale-go/service.yaml b/serving/samples/autoscale-go/service.yaml

index 299e730..867b594 100644

--- a/serving/samples/autoscale-go/service.yaml

+++ b/serving/samples/autoscale-go/service.yaml

@@ -22,4 +22,4 @@ spec:

       revisionTemplate:

         spec:

           container:

- image: github.com/knative/docs/serving/samples/autoscale-go

+ image: rtakaishi/autoscale-go

マニフェストができたのでapplyしましょう。

➤ kubectl apply -f serving/samples/autoscale-go/service.yaml

service.serving.knative.dev/autoscale-go created

これで、Knative servingによってPodが作られる。最初は1台しかない。

➤ kubectl get pods

NAME READY STATUS RESTARTS AGE

autoscale-go-00001-deployment-749bccf5cb-kfljg 3/3 Running 0 1m

minikubeの場合、ここから先少しやり方が変わる。スケールアウトのために大量にリクエストを投げるのだが、そこでアクセス用のアドレス・ポートを指定しておく。test.goのオプションで、ipとportを指定します。それぞれの値はMinikube用のインストールドキュメントを見ると確認方法が記載されている。fishの場合だと以下のようにする。

➤ echo (minikube ip):(kubectl get svc knative-ingressgateway -n istio-system -o 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')

192.168.64.2:32380

さて、アクセス先の情報も分かったので、test.goでリクエストを投げまくる。

➤ go run serving/samples/autoscale-go/test/test.go -ip 192.168.64.2 -port 32380 -sleep 100 -prime 1000000 -bloat 50 -qps 9999 -concurrency 10

すると…1台だったPodが増えていることが確認できる。minikubeだからか、なかなかRunningにならないのだけどGKEなどで試すと全てRunningになると思う。

➤ kubectl get pods

NAME READY STATUS RESTARTS AGE

autoscale-go-00001-deployment-749bccf5cb-br8tx 3/3 Running 0 3m

autoscale-go-00001-deployment-749bccf5cb-cbrzp 0/3 Pending 0 1m

autoscale-go-00001-deployment-749bccf5cb-cdm9w 0/3 Pending 0 36s

autoscale-go-00001-deployment-749bccf5cb-j64vp 3/3 Running 0 3m

autoscale-go-00001-deployment-749bccf5cb-jbfct 0/3 Pending 0 1m

autoscale-go-00001-deployment-749bccf5cb-jn8wb 3/3 Running 0 13m

autoscale-go-00001-deployment-749bccf5cb-pf9dq 0/3 Pending 0 1m

autoscale-go-00001-deployment-749bccf5cb-tql4c 0/3 Pending 0 1m

autoscale-go-00001-deployment-749bccf5cb-vlr6n 3/3 Running 0 3m

autoscale-go-00001-deployment-749bccf5cb-xgsfq 0/3 Pending 0 3m

autoscale-go-00001-deployment-749bccf5cb-xwzvs 0/3 Pending 0 3m

test.goの実行を止めると、Podが減っていくことも確認できる。

➤ kubectl get pods

NAME READY STATUS RESTARTS AGE

autoscale-go-00001-deployment-749bccf5cb-br8tx 2/3 Terminating 0 4m

autoscale-go-00001-deployment-749bccf5cb-j64vp 2/3 Terminating 0 4m

autoscale-go-00001-deployment-749bccf5cb-jn8wb 3/3 Running 0 14m

autoscale-go-00001-deployment-749bccf5cb-vlr6n 2/3 Terminating 0 4m

仕組み

スケールアウト・スケールインすることはわかったが、どういうロジックだろう?と思いドキュメントを眺めると、書かれていた。Pod毎の、完了していないリクエスト平均数(in-flight requestってこういう意味であってるかな)をベースとしているようだ。デフォルトは1.0なので、Podが処理しているリクエストが常に1.0となるようにPodの数を増減している、ということかな?また、より詳細な情報はDEVELOPMENT.mdにあれこれかかれているので読むと良さそう。

感想

スケールアウト機能がServingをインストールするだけでパッと使えたので手軽でよいと思いました(HPAもHeapsterをいれればすぐ使えるか)。おもしろそうなので触ってくぞー。