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

Pocket

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をいれればすぐ使えるか)。おもしろそうなので触ってくぞー。

1 Comment

Leave a Reply

Your email address will not be published. Required fields are marked *