Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第26章 Pod の自動スケーリング

26.1. 概要

HorizontalPodAutoscaler オブジェクトで定義される Horizontal Pod Autoscaler は、レプリケーションコントローラーに属する Pod から収集されるメトリクスまたはデプロイメント設定に基づいて、システムがレプリケーションコントローラーまたはデプロイメント設定のスケールの増減を自動的に設定する方法を指定します。

26.2. Horizontal Pod Autoscaler の要件

Horizontal Pod Autoscaler を使用するには、クラスター管理者は「クラスターメトリクスを適切に設定」している必要があります。

26.3. サポートされるメトリクス

以下のメトリクスは Horizontal Pod Autoscaler でサポートされています。

表26.1 メトリクス

メトリクス説明API バージョン

CPU の使用率

要求される CPU のパーセンテージ

autoscaling/v1autoscaling/v2beta1

メモリーの使用率

要求されるメモリーの割合

autoscaling/v2beta1

26.4. 自動スケーリング

oc autoscale コマンドを使用して Horizontal Pod Autoscaler を作成し、実行する Pod の最小数および最大数を指定すると共に Pod がターゲットとして設定すべき「CPU の使用率」または「メモリーの使用率」を指定することができます。

重要

メモリー使用率の自動スケーリングはテクノロジープレビュー機能のみとして提供されています。

Horizontal Pod Autoscaler の作成後に、これは Heapster で Pod のメトリクスのクエリーを試行します。Heapster が初期メトリクスを取得するまでに 1 分から 2 分の時間がかかる場合があります。

メトリクスが Heapster で利用可能になると、Horizontal Pod Autoscaler は必要なメトリクスの使用率に対する現在のメトリクスの使用率の割合を計算し、随時スケールアップまたはスケールダウンを実行します。スケーリングは一定間隔で実行されますが、メトリクスが Heapster に移されるまでに 1 分から 2 分の時間がかかる場合があります。

レプリケーションコントローラーの場合、このスケーリングはレプリケーションコントローラーのレプリカに直接対応します。デプロイメント設定の場合、スケーリングはデプロイメント設定のレプリカ数に直接対応します。自動スケーリングは Complete フェーズの最新デプロイメントにのみ適用されることに注意してください。

OpenShift Container Platform はリソースに自動的に対応し、起動時などのリソースの使用が急増した場合など必要のない自動スケーリングを防ぎます。unready 状態の Pod には、スケールアップ時の使用率が 0 CPU と指定され、Autoscaler はスケールダウン時にはこれらの Pod を無視します。既知のメトリクスのない Pod にはスケールアップ時の使用率が 0% CPU、スケールダウン時に 100% CPU となります。これにより、HPA の決定時に安定性が増します。この機能を使用するには、readiness チェックを設定して新規 Pod が使用可能であるかどうかを判別します。

26.5. CPU 使用率の自動スケーリング

oc autoscale コマンドを使用して、少なくとも指定される時間に実行する Pod の最大数を指定します。オプションとして Pod の最小数と Pod がターゲットとする平均の CPU 使用率を指定できます。指定しない場合は、OpenShift Container Platform サーバーからのデフォルト値がそれらに指定されます。

以下に例を示します。

$ oc autoscale dc/frontend --min 1 --max 10 --cpu-percent=80
deploymentconfig "frontend" autoscaled

上記の例では、Horizontal Pod Autoscaler の autoscaling/v1 を使用して以下の定義で Horizontal Pod Autoscaler をする作成方法を示しています。

例26.1 Horizontal Pod Autoscaler オブジェクト定義

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: frontend 1
spec:
  scaleTargetRef:
    kind: DeploymentConfig 2
    name: frontend 3
    apiVersion: apps/v1 4
    subresource: scale
  minReplicas: 1 5
  maxReplicas: 10 6
  cpuUtilization:
    targetCPUUtilizationPercentage: 80 7
1
この Horizontal Pod Autoscaler オブジェクトの名前
2
スケーリングするオブジェクトの種類
3
スケーリングするオブジェクトの名前
4
スケーリングするオブジェクトの API バージョン
5
スケールダウン時のレプリカの最小数
6
スケールアップ時のレプリカの最大数
7
各 Pod が使用していることが期待される要求された CPU のパーセンテージ

または、Horizontal Pod Autoscaler の v2beta1 バージョンを使用して、oc autoscale コマンドにより、以下の定義で Horizontal Pod Autoscaler をする作成方法を示しています。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-cpu 1
spec:
  scaleTargetRef:
    apiVersion: apps/v1 2
    kind: ReplicationController 3
    name: hello-hpa-cpu 4
  minReplicas: 1 5
  maxReplicas: 10 6
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50 7
1
この Horizontal Pod Autoscaler オブジェクトの名前
2
スケーリングするオブジェクトの API バージョン
3
スケーリングするオブジェクトの種類
4
スケーリングするオブジェクトの名前
5
スケールダウン時のレプリカの最小数
6
スケールアップ時のレプリカの最大数
7
各 Pod が使用すべき、要求された CPU の平均的な割合

26.6. メモリー使用率の自動スケーリング

重要

メモリー使用率の自動スケーリングはテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。

Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。

CPU ベースの自動スケーリングとは異なり、メモリーベースの自動スケーリングでは、oc autoscale コマンドの代わりに YAML を使用してAutoscaler を指定することが必要です。オプションとして、Pod の最小数および Pod がターゲットとする必要のある平均のメモリー使用率を指定できます。これらを指定しない場合は、OpenShift Container Platform サーバーからのデフォルト値がこれらに指定されます。

  1. メモリーベースの自動スケーリングは、自動スケーリング API の v2beta1 バージョンでのみ利用できます。以下をクラスターの master-config.yaml ファイルに追加してメモリーベースの自動スケーリングを有効にします。

    ...
    apiServerArguments:
      runtime-config:
      - apis/autoscaling/v2beta1=true
    ...
  2. 以下を hpa.yaml などのファイルに置きます。

    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    metadata:
      name: hpa-resource-metrics-memory 1
    spec:
      scaleTargetRef:
        apiVersion: apps/v1 2
        kind: ReplicationController 3
        name: hello-hpa-memory 4
      minReplicas: 1 5
      maxReplicas: 10 6
      metrics:
      - type: Resource
        resource:
          name: memory
          targetAverageUtilization: 50 7
    1
    この Horizontal Pod Autoscaler オブジェクトの名前
    2
    スケーリングするオブジェクトの API バージョン
    3
    スケーリングするオブジェクトの種類
    4
    スケーリングするオブジェクトの名前
    5
    スケールダウン時のレプリカの最小数
    6
    スケールアップ時のレプリカの最大数
    7
    各 Pod が使用していることが予想される要求されたメモリーの平均のパーセンテージ
  3. 次に上記のファイルから Autoscaler を作成します。

    $ oc create -f hpa.yaml
重要

メモリーベースの自動スケーリングを機能させるには、メモリー使用量がレプリカ数と比例して増減する必要があります。平均的には以下のようになります。

  • レプリカ数が増えると、Pod ごとのメモリー (作業セット) の使用量が全体的に減少します。
  • レプリカ数が減ると、Pod ごとのメモリー使用量が全体的に増加します。

OpenShift web コンソールを使用して、アプリケーションのメモリー動作を確認し、メモリーベースの自動スケーリングを使用する前にアプリケーションがそれらの要件を満たしていることを確認します。

26.7. Horizontal Pod Autoscaler の表示

Horizontal Pod Autoscaler のステータスを表示するには、以下を実行します。

  • oc get コマンドを使用して CPU 使用率および Pod 制限の情報を表示します。

    $ oc get hpa/hpa-resource-metrics-cpu
    NAME                         REFERENCE                                 TARGET    CURRENT  MINPODS        MAXPODS    AGE
    hpa-resource-metrics-cpu     DeploymentConfig/default/frontend/scale   80%       79%      1              10         8d

    出力には以下が含まれます。

    • Target: デプロイメント設定で制御されるすべての Pod でターゲットに設定された平均 CPU 使用率です。
    • Current: デプロイメント設定で制御されるすべての Pod における現在の CPU 使用率です。
    • Minpods/Maxpods: Autoscaler で設定できるレプリカの最小数および最大数です。
  • Horizontal Pod Autoscaler オブジェクトの詳細情報を参照するには oc describe コマンドを使用します。

    $ oc describe hpa/hpa-resource-metrics-cpu
    Name:                           hpa-resource-metrics-cpu
    Namespace:                      default
    Labels:                         <none>
    CreationTimestamp:              Mon, 26 Oct 2015 21:13:47 -0400
    Reference:                      DeploymentConfig/default/frontend/scale
    Target CPU utilization:         80% 1
    Current CPU utilization:        79% 2
    Min replicas:                   1 3
    Max replicas:                   4 4
    ReplicationController pods:     1 current / 1 desired
    Conditions: 5
      Type                  Status  Reason                  Message
      ----                  ------  ------                  -------
      AbleToScale           True    ReadyForNewScale        the last scale time was sufficiently old as to warrant a new scale
      ScalingActive         True    ValidMetricFound        the HPA was able to successfully calculate a replica count from pods metric http_requests
      ScalingLimited        False   DesiredWithinRange      the desired replica count is within the acceptable range
    Events:
    1
    各 Pod が使用していることが予想される要求されたメモリーの平均のパーセンテージ。
    2
    デプロイメント設定で制御されるすべての Pod における現在の CPU 使用率。
    3
    スケールダウン時のレプリカの最小数。
    4
    スケールアップ時のレプリカの最大数。
    5
    オブジェクトが v2alpha1 API を使用している場合、状況条件 が表示されます。

26.7.1. Horizontal Pod Autoscaler の状況条件の表示

状況条件セットを使用して、Horizontal Pod Autoscaler がスケーリングできるかどうかや、現時点でこれがいずれかの方法で制限されているかどうかを判別できます。

Horizontal Pod Autoscaler の状況条件は、自動スケーリング API の v2beta1 バージョンで利用できます。

kubernetesMasterConfig:
  ...
  apiServerArguments:
    runtime-config:
    - apis/autoscaling/v2beta1=true

以下の状況条件が設定されます。

  • AbleToScale は Horizontal Pod Autoscaler がスケールをフェッチし、更新できるかどうかや、いずれかのバックオフ条件がスケーリングを防いでいないかどうかを示します。

    • True 条件はスケーリングが許可されることを示します。
    • False 条件は指定される理由によりスケーリングが許可されないことを示します。
  • ScalingActive は Horizontal Pod Autoscaler が有効にされており (ターゲットのレプリカ数がゼロでない)、必要なメトリクス (scale) を計算できるかどうかを示します。

    • True 条件はメトリクスが適切に機能していることを示します。
    • False 条件は通常フェッチするメトリクスに関する問題を示します。
  • ScalingLimited は、レプリカの最大または最小数に達したために自動スケーリングが許可されないことを示します。

    • True 条件は、スケーリングするためにレプリカの最小または最大数を引き上げるか、または引き下げる必要があることを示します。
    • False 条件は、要求されたスケーリングが許可されることを示します。

この行を追加または編集する必要がある場合には、OpenShift Container Platform サービスを再起動します。

# master-restart api
# master-restart controllers

Horizontal Pod Autoscaler に影響を与える条件を表示するには、oc describe hpa を使用します。条件は status.conditions フィールドに表示されます。

$ oc describe hpa cm-test
Name:                           cm-test
Namespace:                      prom
Labels:                         <none>
Annotations:                    <none>
CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
Reference:                      ReplicationController/cm-test
Metrics:                        ( current / target )
  "http_requests" on pods:      66m / 500m
Min replicas:                   1
Max replicas:                   4
ReplicationController pods:     1 current / 1 desired
Conditions: 1
  Type                  Status  Reason                  Message
  ----                  ------  ------                  -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
Events:
1
Horizontal Pod Autoscaler の状況メッセージです。
  • AbleToScale 条件では、HPA がスケールを取得して更新できるか、またバックオフ関連の条件によりスケーリングを防止できるかどうかを指定します。
  • ScalingActive の条件は、HPA を有効にするか (たとえば、ターゲットのレプリカ数は 0 でないなど)、任意のスケーリングを計算できるかどうかを指定します。「False」の状態は通常、メトリクスの取得に問題があることを示します。
  • ScalingLimited の条件は、任意のスケーリングが Horiontal Pod Autoscaler の最大値または最小値で制限されていることを示します。「False」の状態は通常、Horizontal Pod Autoscaler で最小または最大レプリカ数の制限を増減する必要があります。

以下は、スケーリングできない Pod の例です。

Conditions:
  Type           Status    Reason            Message
  ----           ------    ------            -------
  AbleToScale    False     FailedGetScale    the HPA controller was unable to get the target's current scale: replicationcontrollers/scale.extensions "hello-hpa-cpu" not found

以下は、スケーリングに必要なメトリクスを取得できなかった Pod の例です。

Conditions:
  Type                  Status    Reason                    Message
  ----                  ------    ------                    -------
  AbleToScale           True     SucceededGetScale          the HPA controller was able to get the target's current scale
  ScalingActive         False    FailedGetResourceMetric    the HPA was unable to compute the replica count: unable to get metrics for resource cpu: no metrics returned from heapster

以下は、要求される自動スケーリングが要求される最小数よりも小さい場合の Pod の例です。

Conditions:
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
Events: