デフォルトでは、Horizontal Pod Autoscaler (HPA) は CPU 使用率とメモリ使用量に基づく自動スケーリングのみをサポートしています。これは O&M 要件を満たすことができません。 Managed Service for Prometheus は、オープンソースの Prometheus エコシステムとインターフェースされたフルマネージド監視サービスです。Managed Service for Prometheus は、幅広いコンポーネントを監視し、複数の定義済みダッシュボードを提供します。このトピックでは、Managed Service for Prometheus メトリクスを HPA でサポートされているメトリクスに変換する方法について説明します。これにより、HPA はこれらのメトリクスに基づいてアプリケーションをスケーリングできます。
前提条件
Managed Service for Prometheus コンポーネントがインストールされていること。詳細については、Managed Service for Prometheus を使用して ACS クラスタを監視する を参照してください。
手順
ack-alibaba-cloud-metrics-adapter のデプロイ
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、 を選択します。
Helm ページで、左上隅にある デプロイ をクリックします。
デプロイ パネルの チャート セクションで ack-alibaba-cloud-metrics-adapter を検索し、次へ をクリックします。
パラメータページで、チャートバージョンを選択し、必要なパラメータを設定して、OK をクリックします。
Helm ページで、ack-alibaba-cloud-metrics-adapter がクラスタにデプロイされていることがわかります。

Helm ページで、リリース名列の ack-alibaba-cloud-metrics-adapter を見つけ、アクション列の 更新 をクリックします。
テンプレートのパラメータを次の内容に置き換え、OK をクリックします。
...... prometheus: enabled: true # Managed Service for Prometheus のエンドポイントを指定します。 url: https://cn-beijing.arms.aliyuncs.com:9443/api/v1/prometheus/xxxx/xxxx/xxxx/cn-beijing # Managed Service for Prometheus でトークンベースの認証が有効になっている場合は、prometheusHeader パラメータの Authorization フィールドを設定します。 prometheusHeader: Authorization: xxxxxxx adapter: rules: custom: # 変換ルールを追加します。Managed Service for Prometheus メトリクスのラベルが変換ルールで指定されたラベルと同じであることを確認してください。ラベルが異なる場合は、Managed Service for Prometheus メトリクスのラベルを変更します。 - seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: # resource フィールドは、Kubernetes の API リソースを指定します。 kubectl api-resources -o wide コマンドを実行して、Kubernetes API リソースを表示できます。 # key フィールドは、Prometheus Service メトリクスの LabelName を指定します。Prometheus Service メトリクスが指定された LabelName を使用していることを確認してください。 namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>) default: false enabled: true # enabled フィールドを true に設定して、Prometheus アダプターを有効にします。 ......パラメータ
説明
AlibabaCloudMetricsAdapter.prometheus.urlManaged Service for Prometheus のエンドポイント。
エンドポイントの取得方法については、このトピックの Prometheus API のエンドポイントを取得する セクションを参照してください。
AlibabaCloudMetricsAdapter.prometheus.prometheusHeader.Authorizationトークン。
トークンの取得方法については、このトピックの Prometheus API のエンドポイントを取得する セクションを参照してください。
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom次の YAML テンプレートに基づいてこのパラメータを変更します。
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default定義済みメトリクスを作成するかどうかを指定します。デフォルトでは、定義済みメトリクスが作成されます。デフォルト値の
falseを使用することをお勧めします。説明ack-alibaba-cloud-adapter の設定ファイルの詳細については、このトピックの ack-alibaba-cloud-adapter の設定ファイル セクションを参照してください。
サンプルアプリケーションのデプロイ
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、 を選択します。
デプロイメント ページの右上隅にある YAML から作成 をクリックします。
作成 ページで、次の YAML テンプレートをコードエディタにコピーし、作成 をクリックして、sample-app という名前のアプリケーションとサービスを作成します。
説明アプリケーションポッドは、リクエスト数を示す http_requests_total メトリクスを公開するために使用されます。
ServiceMonitor の作成
ARMS コンソール にログインします。
左側のナビゲーションペインで、統合センターをクリックします。表示されるページで、検索ボックスにカスタムメトリクス収集と入力し、カスタムメトリクス収集をクリックします。
統合の開始タブで、Kubernetes 環境を選択し、Alibaba Cloud Container Compute Service (ACS) クラスタを選択します。
設定情報セクションのパラメータを設定し、OK をクリックします。次の表にパラメータを示します。
パラメータ
例
名前
sample-app
サービス検出方法
ServiceMonitor
名前空間
default
ポート名
http
メトリクス収集パス
/metrics
収集間隔(秒)
30
ラベルマッチング
app
sample-app
統合ステータスチェックが完了するまで待ちます。コンポーネントは統合され、監視されていますというメッセージが表示されたら、統合は完了です。
統合管理をクリックして、監視ステータスを確認します。次の図に結果を示します。

ack-alibaba-cloud-adapter の設定ファイル
前の例では、sample-app ポッドによって公開される http_requests_total メトリクスが、HPA 用の http_requests_per_second メトリクスに変換されます。次のコードブロックは、例で使用されている ack-alibaba-cloud-adapter の設定を示しています。
- seriesQuery: http_requests_total{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: ^(.*)_total
as: ${1}_per_second
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)パラメータ | 説明 |
| Prometheus Query Language (PromQL) クエリデータ。 |
|
|
| PromQL クエリデータのラベル。リソースオブジェクトと照合されます。リソースオブジェクトは、ポッドや名前空間などのクラスタ内の API リソースです。 |
| 正規表現を使用して、Prometheus メトリクスの名前を識別しやすい名前に変換します。この例では、メトリクス名は |
検出:ack-alibaba-cloud-adapter で使用できる Prometheus メトリクスを検出します。
変換する Prometheus メトリクスを指定します。seriesFilters を使用してメトリクスをフィルタリングできます。次のコードブロックに示すように、seriesQuery を使用してラベルでメトリクスを検索できます。
seriesQuery: http_requests_total{namespace!="",pod!=""} seriesFilters: - isNot: "^container_.*_seconds_total"説明seriesFilters はオプションです。seriesFilters を使用してメトリクスをフィルタリングできます。
is:<regex> を含むメトリクスと一致します。
isNot:<regex> を含まないメトリクスと一致します。
関連付け:メトリクスを Kubernetes リソース(ポッドや名前空間など)に関連付けます。
Prometheus メトリクスのラベルを Kubernetes リソースにマップします。
http_requests_totalメトリクスのラベルには、namespace!=""とpod!=""が含まれます。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"}命名:変換後に HPA で使用できるメトリクスの名前を定義します。
Prometheus メトリクスから変換された HPA メトリクスに名前を付けます。Prometheus メトリクスの名前は変更されません。Prometheus メトリクスを直接使用する場合は、命名設定を行う必要はありません。
説明kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"コマンドを実行して、HPA でサポートされているメトリクスをクエリできます。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: "^(.*)_total" as: "${1}_per_second"クエリ:Managed Service for Prometheus API に送信されるリクエストのテンプレートを定義します。
Managed Service for Prometheus API に送信されるリクエストのテンプレート。ack-alibaba-cloud-adapter は HPA のパラメータをリクエストテンプレートに渡し、テンプレートに基づいて Managed Service for Prometheus API にリクエストを送信し、返されたパラメータ値を自動スケーリングのために HPA に送信します。
- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
Prometheus API のエンドポイントを取得する
Managed Service for Prometheus
ARMS コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
Managed Service for Prometheus ページの左上隅で、ACS クラスタがデプロイされているリージョンを選択し、対応する Prometheus インスタンスの名前をクリックして、インスタンス詳細ページに移動します。
左側のナビゲーションペインで、設定をクリックします。表示されるページで、設定タブをクリックします。
設定タブで、HTTP API エンドポイントとトークンを記録します。このエンドポイントは、監視データを Grafana にインポートするために使用されます。
内部ネットワーク経由で Managed Service for Prometheus API を呼び出すことをお勧めします。内部ネットワークが利用できない場合は、インターネット経由で API を呼び出すことができます。

オープンソース Prometheus
Managed Service for Prometheus をデプロイします。
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、 を選択します。
Helm ページの左上隅にある デプロイ をクリックします。
デプロイ パネルの チャート セクションで ack-prometheus-operator を検索し、次へ をクリックします。
パラメータ ページで、パラメータを設定し、OK をクリックします。
デプロイ結果を確認します。
次のコマンドを実行して、クラスタ内の Prometheus をローカルポート 9090 にマップします。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoringブラウザのアドレスバーに localhost:9090 と入力して、Prometheus ページにアクセスします。
上部のナビゲーションバーで、 を選択して、すべてのデータ収集タスクを表示します。
UP 状態のタスクは想定どおりに実行されています。
service と namespace を ラベル 列で確認します。
ServiceName が ack-prometheus-operator-prometheus で、ServiceNamespace が monitoring の場合、次のサンプルコードはオープンソース Prometheus のエンドポイントを示しています。
http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090