正確な自動スケーリングは、トラフィックの急増を管理する際に、クラスターの応答時間とリソース効率を向上させるのに役立ちます。このトピックでは、Kubernetes External Metrics API を使用して、HTTP リクエストレートや Ingress のクエリ/秒 (QPS) などの主要なビジネスメトリックを統合し、自動スケーリングポリシーを実装する方法について説明します。
このトピックでは、Nginx という名前のデプロイメント、サービス、および 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 (RDS) などの Alibaba Cloud プロダクトのモニタリングデータを取得できます。これにより、クラスターのモニタリングおよび自動スケーリング機能が強化されます。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Helm] ページで、[作成] をクリックします。[基本情報] パラメーターを設定し、ack-alibaba-cloud-metrics-adapter を選択してから、[次へ] をクリックします。
ack-alibaba-cloud-metrics-adapter コンポーネントは直接のアップグレードをサポートしていません。コンポーネントをアンインストールしてから、最新バージョンをインストールする必要があります。
ステップ2:アプリケーションとサービスの作成
nginx-test.yaml という名前のファイルを作成します。
次のコマンドを実行して、アプリケーションのデプロイメントとそれに対応するサービスを作成します。
kubectl apply -f nginx-test.yaml
ステップ3:Ingress の作成
クラスター管理ページの左側のナビゲーションウィンドウで、 を選択します。[Ingress] ページの左上隅にある [Ingress の作成] をクリックします。
[作成] パネルで、必要な情報を入力し、[OK] をクリックします。Ingress が作成されると、[Ingress] ページにリダイレクトされます。
[名前] 列で Ingress 名をクリックして、そのルーティングルール情報を表示します。Ingress の詳細については、「Ingress の管理」をご参照ください。
ステップ4:HPA の設定
HPA でスケーリングのために SLS プロジェクトから 2 つのメトリックを設定できます。たとえば、sls_ingress_qps と sls_ingress_latency_p9999 です。
sls_ingress_qps:AverageValue に設定します。これは、QPS が評価される前に Pod の数で除算されることを意味します。
sls_ingress_latency_p9999:Value に設定します。これは、値が Pod の数で除算されないことを意味します。
ingress-hpa.yaml という名前のファイルを作成し、次の内容をコピーします。
HPA の設定には、次のパラメーターが含まれます。
パラメーター名
必須
説明
sls.ingress.route
はい
パラメーターのフォーマットは
<namespace>-<svc>-<port>です。<namespace>は Ingress が配置されている名前空間です。<svc>は Ingress に対応するサービスの名前です。<port>は Ingress に対応するサービスのポートの名前です。例:default-nginx-80。sls.logstore
はい
SLS の Logstore の名前。クラスターでは、
sls.logstoreのデフォルト値はnginx-ingressです。sls.project
はい
SLS のプロジェクトの名前。クラスターでは、
sls.projectのデフォルト値はk8s-log-Cluster IDです。sls.internal.endpoint
いいえ
SLS にプライベートネットワーク経由でアクセスするか、インターネット経由でアクセスするかを指定します。デフォルト値は true です。
true:プライベートネットワーク経由で SLS にアクセスします。
false:インターネット経由で SLS にアクセスします。
次のコマンドを実行して HPA を作成します。
kubectl apply -f ingress-hpa.yaml
ステップ5:結果の検証
HPA を設定した後、次のコマンドを実行して負荷テストを実行します。
ab -t 300 -c 10 <domain_name_configured_for_ingress> # Apache Benchmark を使用して、Ingress によって公開されたサービスに対して負荷テストを実行します。同時実行数を 10、持続時間を 300 秒に設定します。スケーリングステータスを検証します。
コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。[クラスター] ページで、対象のクラスターを見つけ、[アクション] 列の を選択します。
次のコマンドを実行して、スケーリングステータスを確認します。
kubectl get hpa ingress-hpa期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Depolyment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49sREPLICAS の値が MAXPODS の値と同じであれば、スケーリングは成功です。
よくある質問
コマンドラインから QPS メトリック sls_ingress_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 プロジェクトの名前を指定します。設定をカスタマイズしていない場合、デフォルト名は 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"
}この結果は、メトリックに利用可能なデータがないことを示します。これは、`sls_alb_ingress_qps` メトリックをクエリしているが、ALB Ingress を設定していないことが原因である可能性があります。
コマンドが次のような結果を返す場合:
{
"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 の Kubernetes 外部メトリックが見つかったことを示します。value フィールドは QPS 値を表します。
kubectl get hpa コマンドが target を unknown として返す場合の対処法
この問題を解決するには、次の手順に従います。
kubectl describe hpa <hpa_name>コマンドを実行して、HPA の障害の原因を特定します。ConditionsフィールドがAbleToScaleがFalseであることを示している場合は、デプロイメントが正しいことを確認します。ConditionsフィールドがScalingActiveが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 に関連しているかどうかを確認します。メトリックが Ingress に関連している場合は、まず SLS コンポーネントをデプロイする必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。
HPA メトリックが正しく入力されていることを確認します。sls.ingress.route の値は
<namespace>-<svc>-<port>のフォーマットを使用する必要があります。namespace:Ingress の名前空間。svc:Ingress サービスの名前。port:Ingress サービスのポート名。
HPA でサポートされているメトリック名を確認する方法
詳細については、「Alibaba Cloud HPA Metrics」をご参照ください。次の表に、一般的なメトリックを示します。
メトリック名 | 説明 | 追加パラメーター |
sls_ingress_qps | 指定された IngressRoute のクエリ/秒 (QPS)。 | sls.ingress.route |
sls_alb_ingress_qps | ALB データの IngressRoute の QPS。 | 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 のログフォーマットをカスタマイズした後のシステムへの適応方法
SLS Ingress メトリックを使用した水平ポッド自動スケーリングの詳細については、「Alibaba Cloud コンポーネントのメトリックを使用した水平ポッド自動スケーリング」をご参照ください。クラスターで SLS の Nginx Ingress ログ収集を有効にし、正しく設定する必要があります。
クラスターを作成する際、SLS はデフォルトで有効になっています。デフォルト設定を維持する場合、SLS コンソールで Nginx Ingress アクセスログ分析レポートを表示し、Nginx Ingress のリアルタイムステータスをモニターできます。
クラスター作成時に SLS を無効にした場合、SLS Ingress メトリックを水平ポッド自動スケーリングに使用するには、再度有効にするか設定する必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。
Nginx Ingress のログフォーマットをカスタマイズするには、Custom Resource Definition (CRD) 設定の正規表現の
processor_regex部分を変更する必要があります。これは、クラスターで SLS を有効にするとデプロイされる AliyunLogConfig CRD が、ACK Ingress コントローラーのデフォルトのログフォーマットのみをサポートしているためです。詳細については、「DaemonSet CRD を使用したコンテナーログの収集」をご参照ください。
alibaba-cloud-metrics-adapter イメージのプル失敗
症状
ack-alibaba-cloud-metrics-adapter コンポーネントをバージョン 1.3.7 にアップグレードする際に、イメージのプル中にエラーが発生します。エラーメッセージは次のとおりです:
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
原因
ack-alibaba-cloud-metrics-adapter コンポーネントは現在、直接のアップグレードをサポートしていません。
解決策
コンポーネントをアップグレードするには、次の手順に従います。
現在のコンポーネント設定をバックアップします。
古いバージョンのコンポーネントをアンインストールします。
バックアップした設定を使用して、最新バージョンのコンポーネントをインストールします。
コンポーネントのアンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA のスケーリング動作は一時停止します。