Simple Log Service (SLS) Ingress メトリックを External Metrics API を介して Kubernetes の水平ポッド自動スケーリング (HPA) に接続することで、CPU だけでなく実際のトラフィック信号に基づいて Pod をスケーリングします。このガイドでは、Nginx アプリケーションのデプロイ、Ingress を介した公開、秒間クエリ数 (QPS) と 99.99パーセンタイル レイテンシに基づく HPA のスケーリング設定という完全な例を説明します。
前提条件
開始する前に、次のことを確認してください。
kubectl が構成された ACK クラスター
SLS ログ収集が有効化された Ingress コントローラー (クラスター作成時にデフォルトで有効化されます)
Helm チャートをインストールし、HPA リソースを作成する権限
仕組み
ack-alibaba-cloud-metrics-adapter コンポーネントは、Alibaba Cloud モニタリングサービスと Kubernetes External Metrics API を橋渡しします。インストール後、HPA は sls_ingress_qps や sls_ingress_latency_p9999 などの SLS Ingress メトリックをクエリし、それに応じて Deployment のレプリカ数を調整できます。
ステップ 1: ack-alibaba-cloud-metrics-adapter のインストール
ack-alibaba-cloud-metrics-adapter コンポーネントは、External Metrics API を介して Kubernetes が ECS、SLB、RDS などの Alibaba Cloud サービスからモニタリングデータを取得できるようにします。
このコンポーネントはインプレースアップグレードをサポートしていません。アップグレードするには、まず現在のバージョンをアンインストールし、次に最新バージョンをインストールします。アンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA はスケーリングを一時停止します。
「Container Service 管理コンソール」にログインします。ナビゲーションウィンドウで、[クラスター] をクリックします。
クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
[Helm]ページで、[作成]をクリックします。[基本情報]の構成を完了し、[ack-alibaba-cloud-metrics-adapter]を選択して、[次へ]をクリックします。
「パラメーター設定」ページで、「チャート バージョン」を選択し、[OK] をクリックします。
ステップ 3: Ingress の作成
クラスター管理ページの左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。[Ingress] ページで、[Ingress の作成] をクリックします。
必須フィールドを入力し、[OK] をクリックします。コンソールにより、[Ingress] ページにリダイレクトされます。
「名前」列で、Ingress 名をクリックして、そのルーティングルールを表示します。詳細については、「Ingress の管理」をご参照ください。
ステップ 4: HPA の構成
HPA は、異なるスケーリングセマンティクスを持つ 2 つの SLS Ingress メトリックをサポートしています。
| メトリック | ターゲットタイプ | スケーリング動作 |
|---|---|---|
sls_ingress_qps | AverageValue | QPS は比較前に現在の Pod 数で除算されます |
sls_ingress_latency_p9999 | Value | 生のレイテンシ値が直接比較されます |
次の内容で
ingress-hpa.yamlを作成します。パラメーター 必須 説明 sls.ingress.routeはい 形式: <namespace>-<svc>-<port>。例:default-nginx-80sls.logstoreはい Simple Log Service の Logstore。デフォルト: nginx-ingresssls.projectはい Simple Log Service の Project。デフォルト: k8s-log-<cluster-id>sls.internal.endpointいいえ 内部ネットワーク経由で SLS にアクセスするかどうか。デフォルト: true。パブリックネットワークを使用するにはfalseに設定します。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "<your-sls-project>" # デフォルト: k8s-log-<cluster-id> sls.logstore: "nginx-ingress" # Nginx Ingress ログのデフォルト SLS Logstore sls.ingress.route: "default-nginx-80" # 形式: <namespace>-<svc>-<port> target: type: AverageValue averageValue: 10 # Pod あたりの平均 QPS が 10 を超えるとスケールアップします - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: sls.project: "<your-sls-project>" sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" # sls.internal.endpoint: "true" # true = 内部ネットワーク (デフォルト); false = パブリックネットワーク target: type: Value value: 10 # 99.99パーセンタイル レイテンシが 10 ms を超えるとスケールアップします次の表は、HPA 構成で使用されるパラメーターについて説明しています。
構成を適用します。
kubectl apply -f ingress-hpa.yaml
スケーリングの検証
Ingress ドメインに対して 5 分間の負荷テストを実行し、スケールアップをトリガーします。
# 300 秒間、10 個の同時リクエストを送信します
ab -t 300 -c 10 <Ingress に設定されたドメイン名>HPA ステータスをリアルタイムで監視します。
kubectl get hpa ingress-hpa --watchスケールアップが成功した場合の予想される出力 (REPLICAS が MAXPODS に達した場合):
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49sトラフィックがしきい値を下回ると、REPLICAS は最小値に戻ります。
トラブルシューティング
kubectl describe hpa ingress-hpa を実行し、Conditions フィールドを確認してトラブルシューティングを開始します。Type 列と Status 列を使用して問題を特定し、以下の手順に従ってください。
「target」列に「unknown」と表示される
kubectl describe hpa <hpa-name>を実行し、Conditionsフィールドを確認します。AbleToScaleがFalseの場合: Deployment が正常であることを確認します。ScalingActiveがFalseの場合: 次のステップに進みます。
External Metrics API が利用可能かどうかを確認するには、次のコマンドを実行します。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"応答が
Error from server (NotFound)の場合は、alibaba-cloud-metrics-adapterの起動ステータスを確認してください。アダプターが正常に実行されており、HPA メトリックが Ingress 関連である場合は、まず SLS コンポーネントをデプロイします。詳細については、「Nginx Ingress のアクセスログを収集して分析する」をご参照ください。sls.ingress.routeの形式を確認します。値は<namespace>-<svc>-<port>である必要があります。ここで、namespace: Ingress が存在する名前空間svc: Ingress に関連付けられた Service 名port: その Service のポート名
ack-alibaba-cloud-metrics-adapter イメージ (バージョン 1.3.7) のプルに失敗しました
バージョン 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".これは、コンポーネントが直接アップデートをサポートしていないために発生します。これを解決するには、次の手順を実行します。
現在のコンポーネント構成をバックアップします。
古いバージョンをアンインストールします。
バックアップ構成を使用して最新バージョンをインストールします。
よくある質問
コマンドラインから 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}} をご利用の SLS Project 名に置き換えます。クラスター作成時にカスタム名を設定しなかった場合、デフォルトは k8s-log-{{ClusterId}} です。
正常な応答は、value フィールドに現在の QPS を含む ExternalMetricValueList を返します。ParameterInvalid エラーが発生した場合、メトリックにデータがありません。これは通常、ALB Ingress が構成されていないにもかかわらず、sls_ingress_qps の代わりに sls_alb_ingress_qps がクエリされたことを意味します。
HPA はどのメトリックをサポートしていますか?
全リストについては、「Alibaba Cloud HPA メトリック」をご参照ください。一般的な SLS Ingress メトリックは次のとおりです。
| メトリック | 説明 | 必須パラメーター |
|---|---|---|
sls_ingress_qps | 指定された Ingress ルートの QPS | sls.ingress.route |
sls_alb_ingress_qps | ALB Ingress ルートの 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 ログ形式をカスタマイズした後、HPA を適応させるにはどうすればよいですか?
SLS ログ収集は、SLS が最初に有効化されたときにデプロイされる AliyunLogConfig カスタムリソース定義 (CRD) に依存します。 この CRD は、デフォルトの ACK Ingress Controller ログフォーマットに合わせて調整されています。 Ingress Controller のアクセスログフォーマットを変更した場合は、カスタムフォーマットに合わせて CRD 構成の processor_regex セクションを更新してください。 詳細については、「DaemonSet と CRD を使用してコンテナログを収集する」をご参照ください。
クラスターの作成時に SLS が無効になっており、HPA に Ingress メトリックが必要な場合は、まず SLS を再有効化または設定します。 詳細については、「Nginx Ingress のアクセスログを収集および分析する」をご参照ください。