k8sの醍醐味であるHorizontal Pod Autoscalerについて
laravelのminikubeへのデプロイを通じて、k8sの基礎的なリソースについて学んできました。
scaleコマンドを使って、deploymentをスケールアウトする方法についても学んできましが、Horizontal Pod Autoscalerは、あなたが眠っている間にもリソースの状態を監視し、必要であればスケールアウトする仕組みです。
システムが出来ることはどんどんシステムに丸投げし、人間は手や頭のスペースを開けて多くことが、シンギュラリティーの時代において最も大切な事となります。
Horizontal Pod Autoscaler関するPodの設定
これは前回のLaravelをminikubeへデプロイの時にも掲載したDeploymentのyamlですが、前回敢えて説明しなかった部分があります。
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: laravel-study
name: laravel-study
spec:
replicas: 1
selector:
matchLabels:
run: laravel-study
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: laravel-study
spec:
containers:
- image: kamayla/laravel-study
name: laravel-study
ports:
- containerPort: 9000
envFrom:
- configMapRef:
name: laravel-study-config
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 30m
memory: 30Mi
- image: kamayla/nginx-study
name: nginx-study
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: laravel-study-config
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 30m
memory: 30Mi
volumes:
- name: laravel-study-config
configMap:
name: laravel-study-config
status: {}
それはcontainersのimageに設定されているresourcesの中の設定です。
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 30m
memory: 30Mi
この様に、このPodのcpuやmemoryの使用上限を決め、この上限対するパーセンテージで臨界点を設定し、それをトリガーとしてpodを自動的にスケールアウトします。
minikubeにmetrics serverをenableする
metrics serverとは、本来k8sリソースのモニタリングに使用するシステムです。
これが、podの使用率などを算出するので今回のオートスケールにも必要となります。
minikubeの場合は以下のコマンドで簡単に使用できます。
$ minikube addons enable metrics-server
本番環境ではhelmなどを使いインストールしてあげる必要があります。
hpa.yamlを確認
まずは以下のコマンドでyamlを作成します、
$ kubectl autoscale deployment laravel-study \
--min 1 \
--max 30 \
--cpu-percent=80 \
--namespace default \
--dry-run \
-o yaml > hpa.yaml
autoscaleの対象をdeploymentであるlaravel-studyに設定し、podの最小値と最大値を1から30に設定している。
今回の場合はcupの使用率が80%を超えた時、自動的にスケールアウトするよう設定しています。
以下は生成されるyamlです。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
creationTimestamp: null
name: laravel-study
spec:
maxReplicas: 30
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: laravel-study
targetCPUUtilizationPercentage: 80
status:
currentReplicas: 0
desiredReplicas: 0
コマンドで設定したないようが反映されているのが観察できます。
これをapplyします。
$ kubectl apply -f hpa.yaml
apache benchでストレステスト
apache benchとは、簡単にいうとすんごい沢山のリクエストをurlに送るコマンドです。
$ ab -n [総リクエスト数] -c [同時リクエスト数] [URL]
実際にapache benchでストレスを与えて、podがスケールアウトする様子の動画です。
割と長いので、1:46くらいから見るとその様子が確認できます。
まとめ
今回は、高トラフィックに対して自動的にスケールアウトする機能について確認をしていきました。
これで、インフラ担当者はすこしは安心して眠れるのではないでしょうか。