TL;DR
Horizontal Pod Autoscalerを有効化したDeploymentに簡易的な負荷テストを行い、
Pod数の増減を可視化してみました。
この記事では、負荷テストの手順について解説します。
この記事で取り扱うコード類: https://github.com/cacapouh/hpa-example
負荷テスト手順
1. 環境構築
まずは、Minikubeを用いて、k8s環境を構築します。
Horizontal Pod Autoscalerを動かすために、metrics-serverを有効化しています。
minikube delete --all
minikube start --memory=4096 # メモリのデフォルト値は2GBで気持ちやや少なめなので、4GBで起動
minikube addons enable metrics-server
2. サンプルアプリケーションを用意
以下は負荷テスト対象のアプリケーションの実装main.py
およびDockerfileです。
main.py
では、80ポートでHTTPサービスを提供するようにしています。
また、負荷テストのため故意に処理の重いforループを入れています。
from bottle import route, run
import math
@route('/')
def index():
x = 0.0001
for i in range(0, 1000000):
x += math.sqrt(i)
return "OK: {}".format(x)
if __name__ == '__main__':
run(host='0.0.0.0', port=80)
bottle
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r requirements.txt
COPY main.py /app
ENTRYPOINT python main.py
3. サンプルアプリケーションをビルド
dockerビルドして、minikube環境にイメージをロードします。
docker build . -t simple-app:latest
minikube image load simple-app:latest
4. サンプルアプリのデプロイとHPAの有効化
サンプルアプリは以下のマニフェストファイルを使ってデプロイします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-app
spec:
replicas: 2
selector:
matchLabels:
app: simple-app
template:
metadata:
labels:
app: simple-app
spec:
containers:
- name: simple-app
image: simple-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
limits:
cpu: "500m"
requests:
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: simple-app
spec:
type: NodePort
selector:
app: simple-app
ports:
- port: 80
targetPort: 80
以下のコマンドで、アプリケーションをデプロイし、HPAを有効化します。
このコマンドにより、CPU使用率が50%に近づくようにPod数が1~10の範囲で調節されます。
kubectl apply -f simple-app.yaml
kubectl autoscale deployment simple-app --cpu-percent=50 --min=1 --max=10
5. 負荷テストの実施
以下のコマンドで、負荷テストとして、
0.01秒毎にwgetで対象アプリにHTTPリクエストを送信します。
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://simple-app; done"
負荷テスト結果
以下は、負荷テストの結果です。
【0~50秒】
アプリケーションをデプロイした直後でして、
負荷テストが開始されていない状況ですので、Pod数はsimple-app.yaml
で指定した通り2つになっています。
【50~650秒】
こちらは負荷テスト中の期間になります。
Pod数が7個まで増えています。
【650秒~】
650秒付近で、負荷テストのwgetコマンドを停止しました。
そのため、CPU使用率が低下し、Pod数も1つまで減少しています。
また、こちらのリンクから、CPU使用率とPod数の遷移の詳細は、下記リンクからチェックすることができます。
watch 'kubectl get hpa'
コマンドの実行結果になります。
おわりに
kubectl autoscale deployment simple-app --cpu-percent=50 --min=1 --max=10
と...コマンドを1つ実行するだけで、自動スケーリングが実現できました。
非常に簡単でしたね