ビジネスの急増に対応する場合、より正確なスケーリングを行うことで応答速度を向上させ、クラスタリソース使用効率をさらに向上させることができます。このトピックでは、HTTP リクエストレートや Ingress クエリ/秒 (QPS) などの Kubernetes でサポートされている外部メトリックを構成して、自動スケーリングポリシーを実装する方法について説明します。
この例では、NGINX という名前の Deployment、Service、および Ingress を作成して、Horizontal Pod Autoscaler (HPA) を構成します。これにより、Simple Log Service (SLS) の Ingress の QPS に基づいて水平自動スケーリングを実装できます。
手順 1:ack-alibaba-cloud-metrics-adapter コンポーネントをインストールする
ack-alibaba-cloud-metrics-adapter コンポーネントを使用すると、Kubernetes は External Metrics API を使用して、Elastic Compute Service (ECS)、Server Load Balancer (SLB)、ApsaraDB RDS などの Alibaba Cloud サービスのモニタリングデータを取得できます。これにより、クラスタのモニタリング機能と自動スケーリング機能が強化されます。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタの名前をクリックし、左側のナビゲーションウィンドウで を選択します。
[helm] ページで、[デプロイ] をクリックします。[基本情報] 手順で、パラメータを構成し、ack-alibaba-cloud-metrics-adapter を選択します。次に、[次へ] をクリックします。次の表にパラメータを示します。
[パラメータ] 手順で、[チャートバージョン] パラメータを構成し、[OK] をクリックします。
手順 2: アプリケーションとサービスを作成する
nginx-test.yaml という名前のファイルを作成します。
次のコマンドを実行して、Deployment と Service を作成します。
kubectl apply -f nginx-test.yaml
手順 3:Ingress を作成する
左側のナビゲーションウィンドウで、 を選択します。[ingress] ページの左上隅にある [ingress の作成] をクリックします。
[ingress の作成] ダイアログボックスで、パラメータを構成し、[OK] をクリックします。Ingress を作成すると、[ingress] ページが表示されます。
[名前] 列で、新しく作成した Ingress の名前を見つけてクリックし、Ingress に関する情報を表示します。Ingress の詳細については、「Ingress 管理」をご参照ください。
手順 4:HPA を構成する
sls_ingress_qps メトリックと sls_ingress_latency_p9999 メトリックなど、HPA で SLS プロジェクトをスケーリングするための 2 つのメトリックを構成できます。
sls_ingress_qps メトリックを AverageValue に設定します。これは、メトリック値が合計 QPS をポッド数で割った結果であることを指定します。
sls_ingress_latency_p9999 メトリックを Value に設定します。これは、レイテンシがポッド数で除算されないことを指定します。
ingress-hpa.yaml という名前のファイルを作成し、次の内容をファイルに追加します。
次の表に、HPA の構成に使用されるパラメータを示します。
パラメータ
必須
説明
sls.ingress.route
はい
パラメータ形式:
<名前空間>-<svc>-<ポート>。<名前空間>は、Ingress が属する名前空間を指定します。<svc>は、Ingress の作成時に選択した Service の名前を指定します。<ポート>は、Service のポートを指定します。例:default-nginx-80sls.logstore
はい
SLS の Logstore の名前。
sls.logstoreのデフォルト値はnginx-ingressです。sls.project
はい
SLS のプロジェクトの名前。
sls.projectのデフォルト値はk8s-log-クラスタ IDです。sls.internal.endpoint
いいえ
SLS に内部ネットワーク経由でアクセスするかどうかを指定します。デフォルト値:true。
true:内部ネットワーク経由で SLS にアクセスします。
false:インターネット経由で SLS にアクセスします。
次のコマンドを実行して、HPA を構成します。
kubectl apply -f ingress-hpa.yml
手順 5:構成の確認
HPA を構成した後、次のコマンドを実行してストレステストを実行します。
ab -t 300 -c 10 <Ingress のドメイン名> # Apache ベンチマークを使用して、Ingress によって公開されているサービスにリクエストを送信します。テストの完了には 300 秒かかり、1 秒あたり 10 件の同時リクエストが送信されます。HPA が想定どおりに動作するかどうかを確認します。
ACK コンソールの左側のナビゲーションウィンドウで、[クラスタ] をクリックします。[クラスタ] ページで、管理するクラスタを見つけて、[アクション] 列で を選択します。
次のコマンドを実行して、HPA のステータスを確認します。
kubectl get hpa ingress-hpa予期される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAPS AGE ingress-hpa Depolyment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49sREPLICAS パラメータの値が MAXPODS パラメータの値と同じであれば、HPA は想定どおりにアプリケーションをスケールアウトしました。
FAQ
CLI を使用して CLI を使用して取得するにはどうすればよいですかsls_ingress_qps QPS メトリックのデータを取得するにはどうすればよいですか??
次のコマンドを実行してデータをクエリします。この例では、sls_ingress_qps メトリックを使用します。
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress {{SLS_Project}} は、ACK クラスタで使用される SLS プロジェクトの名前です。ACK クラスタで使用される SLS プロジェクトのデフォルト名は k8s-log-{{ClusterId}} です。{{ClusterId}} はクラスタの ID です。
予期される出力:
Error from server: {
"httpCode": 400,
"errorCode": "ParameterInvalid",
"errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark \"",
"requestID": "xxxxxxx"
}コマンド出力は、Application Load Balancer (ALB) Ingress が作成されていないため、sls_alb_ingress_qps メトリックのデータが返されないことを示しています。sls_alb_ingress_qps メトリックはデータクエリに使用されます。
予期される出力:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "sls_ingress_qps",
"timestamp": "2025-02-26T16:45:00Z",
"value": "50", # QPS の値。
"metricLabels": {
"sls.project": "your-sls-project-name",
"sls.logstore": "nginx-ingress"
}
}
]
}コマンド出力は、QPS メトリックが存在し、value が QPS 値であることを示しています。
target 列が <unknown> と表示されるのはなぜですか? kubectl get hpa コマンドを実行した後ですか? コマンドを実行した後に 列が になっている場合はどうすればよいですか?
この問題を解決するには、次の手順を実行します。
kubectl describe hpa <hpa_name>コマンドを実行して、HPA が想定どおりに動作しない理由を特定します。AbleToScale の値が Conditions フィールドで False の場合は、Deployment が正常に作成されたかどうかを確認します。
ScalingActive の値が Conditions フィールドで False の場合は、次の手順に進みます。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"コマンドを実行します。Error from server (NotFound): the server could not find the requested resource というエラーメッセージが表示された場合は、alibaba-cloud-metrics-adapter コンポーネントのステータスを確認します。alibaba-cloud-metrics-adapter コンポーネントのステータスが正常な場合は、HPA メトリックが Ingress に関連しているかどうかを確認します。HPA メトリックが Ingress に関連している場合は、ack-alibaba-cloud-metrics-adapter をインストールする前に SLS コンポーネントをインストールしていることを確認してください。詳細については、「nginx-ingress のアクセスログを分析およびモニタリングする」をご参照ください。
HPA メトリックの値が有効であることを確認します。sls.ingress.route の値は
<名前空間>-<svc>-<ポート>形式である必要があります。名前空間 は、Ingress が属する名前空間を指定します。
svc は、Ingress の作成時に選択した Service の名前を指定します。
ポート は、Service のポートを指定します。
HPA でサポートされているメトリックを見つけるにはどうすればよいですか?HPA でサポートされているメトリックをどのように確認できますか?
HPA でサポートされているメトリックの詳細については、「Alibaba Cloud metrics adapter」をご参照ください。次の表に、一般的に使用されるメトリックを示します。
メトリック | 説明 | 追加パラメータ |
sls_ingress_qps | 特定のルーティングルールに基づいて Ingress が 1 秒あたりに処理できるリクエストの数。 | sls.ingress.route |
sls_alb_ingress_qps | 特定のルーティングルールに基づいて ALB Ingress が 1 秒あたりに処理できるリクエストの数。 | sls.ingress.route |
sls_ingress_latency_avg | すべてのリクエストの平均レイテンシ。 | sls.ingress.route |
sls_ingress_latency_p50 | すべてのリクエストのうち最速の 50% の最大レイテンシ。 | sls.ingress.route |
sls_ingress_latency_p95 | すべてのリクエストのうち最速の 95% の最大レイテンシ。 | sls.ingress.route |
sls_ingress_latency_p99 | すべてのリクエストのうち最速の 99% の最大レイテンシ。 | sls.ingress.route |
sls_ingress_latency_p9999 | すべてのリクエストのうち最速の 99.99% の最大レイテンシ。 | sls.ingress.route |
sls_ingress_inflow | Ingress のインバウンド帯域幅。 | sls.ingress.route |
NGINX Ingress ログの形式を変更した後、水平自動スケーリングを構成するにはどうすればよいですか?NGINX Ingress ログのフォーマットを変更した後、水平自動スケーリングを構成するにはどうすればよいですか?
このトピックでは、SLS によって収集された Ingress メトリックに基づいて水平ポッド自動スケーリングが実行されます。SLS が NGINX Ingress ログを収集するように構成する必要があります。
ACK クラスタを作成すると、デフォルトでクラスタに対して SLS が有効になります。デフォルトのログ収集設定を使用する場合は、クラスタの作成後に SLS コンソールで NGINX Ingress のログ分析レポートとリアルタイムステータスを表示できます。
ACK クラスタの作成時に SLS を無効にした場合、SLS によって収集された Ingress メトリックに基づいて水平ポッド自動スケーリングを実行することはできません。水平ポッド自動スケーリングを実行する前に、クラスタに対して SLS を有効にする必要があります。詳細については、「nginx-ingress-controller のアクセスログを分析およびモニタリングする」をご参照ください。
SLS を初めて有効にしたときに生成される AliyunLogConfig は、ACK が Ingress コントローラ用に定義したデフォルトのログ形式にのみ適用されます。ログ形式を変更した場合は、AliyunLogConfig の processor_regex 設定を変更する必要があります。詳細については、「Simple Log Service コンソールを使用して DaemonSet モードでコンテナテキストログを収集する」をご参照ください。