Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

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

25.1. 概要

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

25.2. Horizontal Pod Autoscaler の要件

Horizontal Pod Autoscaler を使用するには、OpenShift Container Platform メトリクスサーバーをインストールする必要があります。

$ ansible-playbook \
/usr/share/ansible/openshift-ansible/playbooks/metrics-server/config.yml \
-e openshift_metrics_server_install=true

以下を実行して、サーバーが正常にインストールされていることを確認できます。

$ oc adm top node
$ oc adm top pod

これらのコマンドについての追加情報は、「ノードの表示」および「Pod の表示」を参照してください。

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

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

表25.1 メトリクス

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

CPU の使用率

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

autoscaling/v1autoscaling/v2beta1

メモリーの使用率

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

autoscaling/v2beta1

25.4. 自動スケーリング

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 が使用可能であるかどうかを判別します。

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

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

例:

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

このサンプルコマンドにより、以下の定義を持つ既存の DeploymentConfig の Horizontal Pod Autoscaler が作成されます。

Horizontal Pod Autoscaler オブジェクト定義

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: frontend 1
spec:
  scaleTargetRef:
    apiVersion: apps.openshift.io/v1 2
    kind: DeploymentConfig 3
    name: frontend 4
    subresource: scale
  minReplicas: 1 5
  maxReplicas: 10 6
  targetCPUUtilizationPercentage: 80 7

1
この Horizontal Pod Autoscaler オブジェクトの名前。
2
スケーリングするオブジェクトの API バージョン:
  • ReplicationController の場合は、v1 を使用します。
  • DeploymentConfig の場合は、apps.openshift.io/v1 を使用します。
3
スケーリングするオブジェクトの種類 (ReplicationController または DeploymentConfig のいずれか)。
4
スケーリングする既存オブジェクトの名前。
5
スケールダウン時のレプリカの最小数。デフォルトは 1 です。
6
スケールアップ時のレプリカの最大数。
7
各 Pod が使用していることが期待される要求された CPU のパーセンテージ。

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

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-cpu 1
spec:
  scaleTargetRef:
    apiVersion: 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 バージョン:
  • ReplicationController の場合は、v1 を使用します。
  • DeploymentConfig の場合は、apps.openshift.io/v1 を使用します。
3
スケーリングするオブジェクトの種類 (ReplicationController または DeploymentConfig のいずれか)。
4
スケーリングする既存オブジェクトの名前。
5
スケールダウン時のレプリカの最小数。デフォルトは 1 です。
6
スケールアップ時のレプリカの最大数。
7
各 Pod が使用していることが予想される要求された CPU の平均のパーセンテージ。

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

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

重要

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

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

注記

メモリーベースの自動スケーリングは、自動スケーリング API の v2beta1 バージョンでのみ利用できます。

メモリーベースの自動スケーリングを使用するには、以下を実行します。

  1. メモリーベースの自動スケーリングを有効にします。

    1. 以下を master-config.yaml ファイルに追加します。

      ...
      apiServerArguments:
        runtime-config:
        - apis/autoscaling/v2beta1=true
      ...
    2. OpenShift Container Platform サービスを再起動します。

      $ master-restart api
      $ master-restart controllers
  2. 必要な場合は、スケーリングするオブジェクトの名前を取得します。

    $ oc get dc
    
    NAME                  REVISION   DESIRED   CURRENT   TRIGGERED BY
    frontend              1          5         0         config
  3. 以下を hpa.yaml などのファイルに置きます。

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

    $ oc create -f hpa.yaml
重要

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

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

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

25.5. 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 を使用している場合、状況条件が表示されます。

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

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

注記

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

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

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

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

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

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

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 の最大値または最小値で制限されていることを示します。「True」の状態は通常、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: