2.4.4. ベストプラクティス
最適なパフォーマンスを得るには、すべての Pod のリソース要求を設定します。頻繁なレプリカの変動を防ぐには、クールダウン期間を設定します。
- すべての Pod にリソース要求が設定されていること
- HPA は、OpenShift Container Platform クラスター内の Pod の観測された CPU またはメモリー使用量の値に基づいてスケーリングの決定を行います。使用率の値は、各 Pod のリソース要求のパーセンテージとして計算されます。リソース要求値が欠落していると、HPA の最適性能に影響を与える可能性があります。
詳細は、「リソース要求および制限について」を参照してください。
- クールダウン期間の設定
-
Horizontal Pod Autoscaling 中に、時間差なしでイベントが急速にスケーリングされる可能性があります。頻繁なレプリカの変動を防ぐために、クールダウン期間を設定します。
stabilizationWindowSecondsフィールドを設定することで、クールダウン期間を指定できます。安定化ウィンドウは、スケーリングに使用するメトリクスが変動し続ける場合に、レプリカ数の変動を制限するために使用されます。自動スケーリングアルゴリズムは、このウィンドウを使用して以前の必要な状態を推測し、ワークロードスケールの不要な変更を回避します。
たとえば、scaleDown フィールドに安定化ウィンドウが指定されています。
behavior:
scaleDown:
stabilizationWindowSeconds: 300
前の例では、過去 5 分間のすべての意図された状態が考慮されます。これにより、ローリング最大値が近似され、スケーリングアルゴリズムによって Pod が頻繁に削除され、その直後に同等の Pod が再作成されるという事態が回避されます。
詳細は、「スケーリングポリシー」を参照してください。
2.4.4.1. スケーリングポリシー リンクのコピーリンクがクリップボードにコピーされました!
autoscaling/v2 API を使用して、Horizontal Pod Autoscaler に スケーリングポリシー を追加します。スケーリングポリシーは、OpenShift Container Platform の Horizontal Pod Autoscaler (HPA) が Pod をスケーリングする方法を制御します。スケーリングポリシーを使用すると、特定の期間にスケーリングするように特定の数または特定のパーセンテージを設定して、HPA が Pod をスケールアップまたはスケールダウンするレートを制限できます。安定化ウィンドウ を定義することもできます。これはメトリクスが変動する場合に、先に計算される必要な状態を使用してスケーリングを制御します。同じスケーリング方向に対して複数のポリシーを作成し、変更の量に基づいて使用するポリシーを決定できます。タイミングが調整された反復によりスケーリングを制限することもできます。HPA は反復時に Pod をスケーリングし、その後の反復で必要に応じてスケーリングを実行します。
スケーリングポリシーを適用するサンプル HPA オブジェクト
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-resource-metrics-memory
namespace: default
spec:
behavior:
scaleDown:
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 10
periodSeconds: 60
selectPolicy: Min
stabilizationWindowSeconds: 300
scaleUp:
policies:
- type: Pods
value: 5
periodSeconds: 70
- type: Percent
value: 12
periodSeconds: 80
selectPolicy: Max
stabilizationWindowSeconds: 0
...
- 1
scaleDownまたはscaleUpのいずれかのスケーリングポリシーの方向を指定します。この例では、スケールダウンのポリシーを作成します。- 2
- スケーリングポリシーを定義します。
- 3
- ポリシーが反復時に特定の Pod の数または Pod のパーセンテージに基づいてスケーリングするかどうかを決定します。デフォルト値は
podsです。 - 4
- 反復ごとに Pod の数または Pod のパーセンテージのいずれかでスケーリングの量を制限します。Pod 数でスケールダウンする際のデフォルト値はありません。
- 5
- スケーリングの反復の長さを決定します。デフォルト値は
15秒です。 - 6
- パーセンテージでのスケールダウンのデフォルト値は 100% です。
- 7
- 複数のポリシーが定義されている場合に、最初に使用するポリシーを決定します。最大限の変更を許可するポリシーを使用するように
Maxを指定するか、最小限の変更を許可するポリシーを使用するようにMinを指定するか、HPA がポリシーの方向でスケーリングしないようにDisabledを指定します。デフォルト値はMaxです。 - 8
- HPA が必要な状態を確認する期間を決定します。デフォルト値は
0です。 - 9
- この例では、スケールアップのポリシーを作成します。
- 10
- Pod 数によるスケールアップの量を制限します。Pod 数をスケールアップするためのデフォルト値は 4% です。
- 11
- Pod のパーセンテージによるスケールアップの量を制限します。パーセンテージでスケールアップするためのデフォルト値は 100% です。
スケールダウンポリシーの例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-resource-metrics-memory
namespace: default
spec:
...
minReplicas: 20
...
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 4
periodSeconds: 30
- type: Percent
value: 10
periodSeconds: 60
selectPolicy: Max
scaleUp:
selectPolicy: Disabled
この例では、Pod の数が 40 より大きい場合、パーセントベースのポリシーがスケールダウンに使用されます。このポリシーでは、selectPolicy による要求により、より大きな変更が生じるためです。
80 の Pod レプリカがある場合、初回の反復で HPA は Pod を 8 Pod 減らします。これは、1 分間 (periodSeconds: 60) の (type: Percent および value: 10 パラメーターに基づく) 80 Pod の 10% に相当します。次回の反復では、Pod 数は 72 になります。HPA は、残りの Pod の 10% が 7.2 であると計算し、これを 8 に丸め、8 Pod をスケールダウンします。後続の反復ごとに、スケーリングされる Pod 数は残りの Pod 数に基づいて再計算されます。Pod の数が 40 未満になると、Pod ベースの数がパーセントベースの数よりも大きいため、Pod ベースのポリシーが適用されます。HPA は、残りのレプリカ (minReplicas) が 20 になるまで、30 秒 (periodSeconds: 30) で一度に 4 Pod (type: Pods および value: 4) を減らします。
selectPolicy: Disabled パラメーターは HPA による Pod のスケールアップを防ぎます。必要な場合は、レプリカセットまたはデプロイメントセットでレプリカの数を調整して手動でスケールアップできます。
設定されている場合、oc edit コマンドを使用してスケーリングポリシーを表示できます。
$ oc edit hpa hpa-resource-metrics-memory
出力例
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/behavior:\
'{"ScaleUp":{"StabilizationWindowSeconds":0,"SelectPolicy":"Max","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":15},{"Type":"Percent","Value":100,"PeriodSeconds":15}]},\
"ScaleDown":{"StabilizationWindowSeconds":300,"SelectPolicy":"Min","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":60},{"Type":"Percent","Value":10,"PeriodSeconds":60}]}}'
...