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