HPAの閾値設定を1000%にして思い込みをクリアにする

こんにちは。株式会社ユーザベース SaaS事業 酒井です。

「HPAの閾値設定は100%以上あんねん」。思い込みで閾値は100%が上限と勘違いしそうになるねという記事になります。


先日とあるシステムのIstioリソースを眺めていた所、Istio Ingress GatewaysのPodが頻繁に増減しているのに気が付きました。
istioctlとIstioOperator定義で管理されていたので確認すると、以下のようなデフォルト値が使われていました。

    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
        k8s:
          resources:
            limits:
              cpu: "2"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 128Mi
          hpaSpec:
            minReplicas: 2
            maxReplicas: 5
            metrics:
              - type: Resource
                resource:
                  name: cpu
                  target:
                    averageUtilization: 80
                    type: Utilization

この定義に従ってHPA等が設定されるのですが、見ての通りrequestsのcpu: 100mに対しての80%なので、平均cpu: 80mを超えるとPodが増える設定値となっていました。

kubernetes.io

requestsのcpuを適正値に修正するとしても、上限であるlimitsに近づいてきたらPodを増やしたいケースもあると思います。
例えば、今回のデフォルト値(cpu: 100m)のままcpu: "1"まで利用率が伸びた際にPodを増やすのであれば、以下のようにaverageUtilizationを修正することでイメージの挙動となります。

            metrics:
              - type: Resource
                resource:
                  name: cpu
                  target:
                    averageUtilization: 1000
                    type: Utilization
# 変更前
$ kubectl get hpa istio-ingressgateway
NAME                   REFERENCE                         TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
istio-ingressgateway   Deployment/istio-ingressgateway   9%/80%    2         5         2           83d

# 変更後
$ kubectl get hpa istio-ingressgateway
NAME                   REFERENCE                         TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
istio-ingressgateway   Deployment/istio-ingressgateway   8%/1000%   2         5         2          83d

設定内容だけ見るとそれはそうだよねという感じなのですが、なんとなく思い込みで100%が上限だと勘違いしそうになるお気持ち共有と、これが皆さんの何か新しい発見や気づきになれたら嬉しいです。

Page top