このトピックでは、Alibaba Cloudの環境でアプリケーションの水平自動スケーリングを実装するために、Kubernetesでサポートされている外部メトリック (HTTPリクエストレートやQPS (Ingress queries per second) など) を設定する方法について説明します。
前提条件
Container Service for Kubernetes (ACK) クラスターが作成されました。 詳細については、「ACKマネージドクラスターの作成」、「ACK専用クラスターの作成」、および「ACKサーバーレスクラスターの作成」をご参照ください。
alibaba-cloud-metrics-adapterのデプロイ
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスターページで、管理するクラスターの名前をクリックし、左側のナビゲーションウィンドウの を選択します。
[Helm] ページで、[デプロイ] をクリックします。 [基本情報] ステップで、次の表に基づいてパラメーターを設定します。
パラメーター
例
アプリケーション名
ack-alibaba-cloud-metrics-adapter
名前空間
kube-system
ソース
デフォルト値: Marketplace。
チャート
Use Scenariosパラメータに [すべて] を選択します。
サポートされるアーキテクチャパラメーターにamd64を選択します。
検索ボックス:ack-alibaba-cloud-metrics-adapter.
[ack-alibaba-cloud-metrics-adapter] を選択し、[次へ] をクリックします。
[パラメーター] ステップで、[グラフバージョン] パラメーターを設定し、[OK] をクリックします。
HPAの例
次の例は、両方ともNginxという名前のデプロイメントとサービスを作成してHPAを設定する方法を示しています。
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、
を選択します。[デプロイメント] ページで、右上隅の [YAMLから作成] をクリックします。
サンプルテンプレートを [カスタム] に設定します。 次のYAMLテンプレートを使用して、デプロイとClusterIPサービスを作成します。 次に、作成 をクリックします。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP
左側のナビゲーションウィンドウで、
を選択します。 [Ingress] ページで、右上隅の [Ingressの作成] をクリックします。[Ingressの作成] ダイアログボックスでパラメーターを設定し、[OK] をクリックします。 Ingressの作成後、Ingressページが表示されます。
[名前] 列で、新しく作成したIngressの名前を見つけてクリックし、Ingressに関する情報を表示します。
HPAを設定します。
左上隅のアイコンをクリックして、[クラスター] ページに戻ります。
ACKコンソールの左側のナビゲーションウィンドウで、 を選択します。
[テンプレート] ページで、右上隅の [作成] をクリックします。
[作成] ダイアログボックスでテンプレートを設定し、[保存] をクリックします。
名前: テンプレートの名前を入力します。 この例では、HPAが使用される。
説明: テンプレートの説明を入力します。 このパラメーターはオプションです。
テンプレート: KubernetesのYAML構文に準拠したオーケストレーションテンプレートを設定します。 詳細については、次のテンプレートをご参照ください。
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: "***" # Specify the Simple Log Service project that you want to use. sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" target: type: AverageValue averageValue: 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: # default ingress log project is k8s-log-clusterId sls.project: "***" # default ingress logstre is nginx-ingress sls.logstore: "nginx-ingress" # namespace-svc-port sls.ingress.route: "default-nginx-80" # sls vpc endpoint, default true # sls.internal.endpoint:true target: type: Value # sls_ingress_latency_p9999 > 10ms value: 10
次の表に、HPAの設定に使用されるパラメーターを示します。
パラメーター
説明
sls.ingress.route
<namespace>-<svc>-<port>
形式で値を設定します。 例: default-nginx-80 This parameter is required.説明<namespace>
は、Ingressが属する名前空間を指定します。<svc>
は、Ingressの作成時に選択したサービスの名前を指定します。<port>
は、サービスのポートを指定します。sls.logstore
Simple Log ServiceのLogstoreの名前。 This parameter is required.
sls.logstore
のデフォルト値はnginx-ingress
です。sls.project
Simple Log Serviceプロジェクトの名前。 This parameter is required.
sls.project
のデフォルト値はk8s-log-cluster ID
です。sls.internal.endpoint
内部ネットワーク経由でSimple Log Serviceにアクセスするかどうかを指定します。 デフォルト値: true。 値をtrueに設定すると、内部ネットワーク経由でSimple Log Serviceにアクセスできます。 値をfalseに設定すると、インターネット経由でSimple Log Serviceにアクセスできます。
説明この例では、HPAはsls_ingress_qpsおよびsls_ingress_latency_p9999メトリックに基づいてスケーリングアクティビティをトリガーします。 ターゲットセクションでは、各メトリックのタイプ値が異なります。
sls_ingress_qpsメトリックのタイプ値はAverageValueに設定されています。 これは、メトリック値が合計QPSをポッドの数で割った結果であることを示しています。
sls_ingress_latency_p9999メトリックのタイプ値はvalueに設定されています。 これは、レイテンシがポッドの数で除算されないことを示します。
2つのタイプ値は、HPA設定で一般的に使用されます。
[テンプレート] ページで、[HPA] を選択し、[アプリケーションの作成] をクリックします。
HPAページで、[作成] をクリックします。
HPAを設定したら、次のスクリプトを実行してストレステストを実行します。
#!/bin/bash ##Use Apache Benchmark to send requests to the Service exposed by the Ingress. The test lasts 300 seconds and 10 concurrent requests are sent per second. ab -t 300 -c 10 <The domain name of the Ingress>
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 7m49s
REPLICASの値がMAXPODSの値と同じ場合、HPAが期待どおりにアプリケーションをスケールアウトしたことを示します。
CLIを使用してデータを照会する
次のコマンドを実行してデータを照会します。 この例では、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クラスターで使用されるSimple Log Serviceプロジェクトの名前です。 ACKクラスターで使用されるSimple Log Serviceプロジェクトのデフォルト名は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"
}
前の出力が返された場合、メトリックは無効です。 ALB Ingressが作成されていないため、sls_alb_ingress_qpsメトリックのデータは返されません。
よくある質問
kubectl get hpa
コマンドを実行した後、TARGETS列に <unknow> が表示された場合はどうすればよいですか?問題をトラブルシューティングするには、次の操作を実行します。
kubectl describe hpa <hpa_name>
コマンドを実行して、HPAが正常に機能しない理由を確認します。[条件] フィールドのAbleToScaleの値がFalseの場合、デプロイが通常どおり作成されているかどうかを確認します。
ConditionsフィールドのScalingActiveの値がFalseの場合は、次の手順に進みます。
kubectl get -- raw "/apis/external.metrics.k8s.io/v1beta1/"
コマンドを実行します。 Error from server (NotFound): サーバーが要求されたリソースを見つけることができませんでしたが返された場合、alibaba-cloud-metrics-adapterのステータスを確認します。alibaba-cloud-metrics-adapterのステータスが正常な場合は、HPAメトリクスがIngressに関連しているかどうかを確認します。 メトリクスがIngressに関連している場合は、ack-alibaba-cloud-metrics-adapterをデプロイする前に、Simple Log Serviceコンポーネントを必ずデプロイしてください。 詳細については、「nginx-ingressのアクセスログの分析と監視」をご参照ください。
HPAメトリックの値が有効であることを確認してください。 sls.ingress.routeの値は、
<namespace>-<svc>-<port>
形式である必要があります。namespaceは、Ingressが属する名前空間を指定します。
svcは、Ingressの作成時に選択したサービスの名前を指定します。
portは、サービスのポートを指定します。
HPAでサポートされているメトリックはどこにありますか?
HPAでサポートされているメトリクスの詳細については、「Alibaba Cloudメトリクスアダプター」をご参照ください。 次の表に、一般的に使用されるメトリックを示します。
メトリック名
説明
追加パラメーター
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ログをカスタム形式で収集するにはどうすればよいですか?
このトピックでは、Simple Log Serviceによって収集されたIngressメトリックに基づいて、水平ポッドの自動スケーリングが実行されます。 NGINX Ingressログを収集するには、Simple Log Serviceを設定する必要があります。
ACKクラスターを作成すると、デフォルトでクラスターに対してSimple Log Serviceが有効になります。 デフォルトのログ収集設定を使用すると、クラスターの作成後にSimple log ServiceコンソールでNGINX Ingressのログ分析レポートとリアルタイムのステータスを表示できます。
ACKクラスターの作成時にSimple Log Serviceを無効にした場合、Simple Log Serviceによって収集されたIngressメトリックに基づいて水平ポッドの自動スケーリングを実行できません。 この機能を使用する前に、クラスターのSimple Log Serviceを有効にする必要があります。 詳細については、「nginx-ingress-controllerのアクセスログの分析と監視」をご参照ください。
Simple Log Serviceを初めて有効にしたときに生成されるAliyunLogConfigは、ACKがIngressコントローラーに対して定義するデフォルトのログ形式にのみ適用されます。 ログ形式を変更した場合は、AliyunLogConfigで
processor_regex
設定を変更する必要があります。詳細については、「Simple Log Serviceコンソールを使用してDaemonSetモードでコンテナテキストログを収集する」をご参照ください。