【Kubernetes】HPAを使いつつ手動でスケールさせる

スポンサーリンク

はじめに

HPA(Horizontal Pod Autoscaler)を使っている場合に、DeploymentのPodの数を手動でスケールアウト、スケールインする方法を紹介します。

HPAを使いつつ手動スケール

HPAを使っている場合は、スケールアウト・スケールインはHPAに任せることが基本になるかと思います。しかし、場合によっては事前に最低限のレプリカ数を増やしておく必要などがあったりします。そのような場合に、kubectl scaleコマンドを使ってレプリカ数を増やしたりしても、結局はHPAがレプリカ数をコントロールしてしまいます。

HPAを使っている場合に手動でスケールさせるには、下記のようにkubectl patchコマンドを使って、HPAのminReplicasを更新します。

kubectl patch hpa {hpa name} -p '{"spec":{"minReplicas":1}}'
kubectl patch hpa {hpa name} -p '{"spec":{"minReplicas":5}}'

minReplicasを更新することで、通常状態(負荷がかかっていない状態)のレプリカ数を増やすことができます。

また、kubectl editで更新することも可能です。

kubectl edit hpa {hpa name}

ただし、これらの方法だとkubectl scaleとは違いスケールするまでに若干時間がかかります。

kubectl patchについては、下記を参考にしてください。

kubectl patchでリソース更新
はじめにkubectl patchについて、実際の例を見ながら使い方を紹介していきます。kubectl patchkubectl patchはStrategic Merge Patch、JSON Merge Patch、JSON Patch...

実際に試してみる

では、実際に試してみたいと思います。

用意するDeployment(deployment.yml)とHPA(hpa.yml)は下記の通りになります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 30

DeploymentとHPAを作成します。

kubectl apply -f deployment.yml
kubectl apply -f hpa.yml

最小のレプリカ数が3のDeploymentがデプロイされました。

❯ kubectl get deploy,hpa
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           3m3s

NAME                                            REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx   0%/30%    3         10        3          2m49s

まずはminReplicasを更新して、スケールアウトしてみます。

kubectl patch hpa nginx-hpa -p '{"spec":{"minReplicas":5}}'

しばらくすると、レプリカ数が増えました。

❯ kubectl get deploy,hpa
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   5/5     5            5           5m19s

NAME                                            REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx   0%/30%    5         10        5          5m5s

次はminReplicasを減らして、スケールインしてみます。

kubectl patch hpa nginx-hpa -p '{"spec":{"minReplicas":1}}'

こちらも、しばらくするとレプリカ数が減りました。

❯ kubectl get deploy,hpa
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           16m

NAME                                            REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/nginx-hpa   Deployment/nginx   0%/30%    1         10        1          16m

参考

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