Horizontal Pod Autoscalerについて

kubernetes

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くらいから見るとその様子が確認できます。

まとめ

今回は、高トラフィックに対して自動的にスケールアウトする機能について確認をしていきました。

これで、インフラ担当者はすこしは安心して眠れるのではないでしょうか。

タイトルとURLをコピーしました