複数のインスタンスをデプロイするとアプリケーションの安定性は向上しますが、アイドルのリソースが発生し、クラスターのコストが高くなる可能性があります。手動でのスケーリングは手間がかかり、遅延が発生しがちです。Nginx Ingress を使用して、複数のアプリケーションに対して Horizontal Pod Autoscaler (HPA) を実装できます。HPA は、ワークロードに基づいて Pod レプリカの数を動的に調整します。これにより、アプリケーションの安定性と迅速な応答が保証されます。また、リソース使用率を最適化し、コストを削減します。このトピックでは、Nginx Ingress を使用して複数のアプリケーションに HPA を実装する方法について説明します。
Ingress は、外部リクエストをクラスター内のサービスに転送します。サービスは、リクエストを Pod に送信します。本番環境では、リクエスト量に基づいて自動スケーリングを設定できます。この量は、nginx_ingress_controller_requests メトリックによって公開されます。Nginx Ingress Controller のこの組み込みメトリックを使用して HPA を実装できます。ACK クラスターの Nginx Ingress Controller は、コミュニティ版の拡張バージョンであり、より使いやすくなっています。
準備
Nginx Ingress を使用して複数のアプリケーションに Horizontal Pod Autoscaling (HPA) を実装する前に、Alibaba Cloud Prometheus メトリックを HPA 互換のメトリックに変換する必要があります。
Alibaba Cloud Prometheus モニタリングコンポーネントをデプロイします。詳細については、「Alibaba Cloud Prometheus を使用したモニタリング」をご参照ください。
ack-alibaba-cloud-metrics-adapter コンポーネントをデプロイし、その
prometheus.urlフィールドを設定します。Apache Benchmark ストレステストツールをインストールします。
このチュートリアルでは、2 つの Deployment とそれに対応するサービスを作成し、異なるアクセスパスを持つ Ingress を設定して外部トラフィックをルーティングします。次に、nginx_ingress_controller_requests メトリックに基づいてアプリケーションの HPA を設定し、selector.matchLabels.service フィールドを使用してメトリックをフィルターします。これにより、Pod はトラフィックの変化に応じてスケールインおよびスケールアウトできます。
ステップ 1: アプリケーションとサービスの作成
次の YAML ファイルを使用して、アプリケーションの Deployment とそれに対応するサービスを作成します。
nginx1.yaml という名前のファイルを作成し、次の内容をコピーします。
次のコマンドを実行して、test-app アプリケーションとそれに対応するサービスを作成します。
kubectl apply -f nginx1.yamlnginx2.yaml という名前のファイルを作成し、次の内容をコピーします。
次のコマンドを実行して、sample-app アプリケーションとそれに対応するサービスを作成します。
kubectl apply -f nginx2.yaml
ステップ 2: Ingress の作成
ingress.yaml という名前のファイルを作成し、次の内容をコピーします。
次のコマンドを実行して Ingress リソースをデプロイします。
kubectl apply -f ingress.yaml次のコマンドを実行して Ingress リソースを取得します。
kubectl get ingress -o wide期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress nginx test.example.com 10.XX.XX.10 80 55sデプロイが成功すると、
/と/homeパスを使用してホストにアクセスできます。NGINX Ingress コントローラーは、リクエストパスに基づいてリクエストを sample-app および test-app アプリケーションに自動的にルーティングします。Alibaba Cloud Prometheus でnginx_ingress_controller_requestsメトリックをクエリして、各アプリケーションへのリクエストに関する情報を取得できます。
ステップ 3: Prometheus メトリックを HPA 互換のメトリックに変換する
adapter-config ファイルの変更
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
Helm ページで、ack-alibaba-cloud-metrics-adapter をクリックします。[リソース] セクションで adapter-config をクリックし、ページの右上隅にある [YAML の編集] をクリックします。
対応するフィールドの値を次のコードの値に置き換えます。次に、ページの下部にある [OK] をクリックします。
詳細については、「Alibaba Cloud Prometheus メトリックに基づく水平ポッド自動スケーリング」をご参照ください。
rules: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) name: as: ${1}_per_second matches: ^(.*)_requests resources: namespaced: false seriesQuery: nginx_ingress_controller_requests
メトリック出力の表示
次のコマンドを実行して、メトリック出力を表示します。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .クエリ結果は次のとおりです。
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "nginx_ingress_controller_per_second",
"metricLabels": {},
"timestamp": "2025-07-25T07:56:04Z",
"value": "0"
}
]
}ステップ 4: HPA の作成
hpa.yaml という名前のファイルを作成し、次の内容をコピーします。
次のコマンドを実行して、sample-app および test-app アプリケーション用の HPA をデプロイします。
kubectl apply -f hpa.yaml次のコマンドを実行して、HPA のデプロイメントステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 74s test-hpa Deployment/test-app 0/30 (avg) 1 10 1 59m
ステップ 5: 結果の検証
HPA がデプロイされた後、Apache Benchmark ツールを使用してストレステストを実行します。リクエスト数が増加するにつれてアプリケーションがスケールアウトするかどうかを観察します。
次のコマンドを実行して、ホストの
/homeパスにストレステストを実行します。ab -c 50 -n 5000 test.example.com/home次のコマンドを実行して HPA のステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 22m test-hpa Deployment/test-app 22096m/30 (avg) 1 10 3 80m次のコマンドを実行して、ホストのルートパスにストレステストを実行します。
ab -c 50 -n 5000 test.example.com/次のコマンドを実行して HPA のステータスを確認します。
kubectl get hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 27778m/30 (avg) 1 10 2 38m test-hpa Deployment/test-app 0/30 (avg) 1 10 1 96mこの結果は、リクエスト量がしきい値を超えたときにアプリケーションが正常にスケールアウトしたことを示しています。
関連ドキュメント
マルチゾーンバランシングは、高可用性シナリオにおけるデータ集約型サービスの一般的なデプロイメント方法です。ワークロードが増加すると、マルチゾーンのバランスの取れたスケジューリングポリシーを使用するアプリケーションは、クラスターのスケジューリング要求を満たすために、複数のゾーンにわたってインスタンスを自動的にスケールアウトする必要があります。詳細については、「複数のゾーンにわたる迅速かつ同時の弾性スケーリングの実装」をご参照ください。
カスタムオペレーティングシステムイメージをビルドして、複雑なシナリオでの弾性スケーリングを簡素化できます。詳細については、「カスタムイメージによる弾性的な最適化」をご参照ください。