すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:Prometheus メトリクスに基づく水平自動スケーリングの実装

最終更新日:Dec 27, 2024

デフォルトでは、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 のデプロイ

  1. ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。

  2. クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、アプリケーション > Helm を選択します。

  3. Helm ページで、左上隅にある デプロイ をクリックします。

  4. デプロイ パネルの チャート セクションで ack-alibaba-cloud-metrics-adapter を検索し、次へ をクリックします。

  5. パラメータページで、チャートバージョンを選択し、必要なパラメータを設定して、OK をクリックします。

    Helm ページで、ack-alibaba-cloud-metrics-adapter がクラスタにデプロイされていることがわかります。

    image

  6. Helm ページで、リリース名列の ack-alibaba-cloud-metrics-adapter を見つけ、アクション列の 更新 をクリックします。

  7. テンプレートのパラメータを次の内容に置き換え、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.url

    Managed 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 の設定ファイル セクションを参照してください。

サンプルアプリケーションのデプロイ

  1. ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。

  2. クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、ワークロード > デプロイメント を選択します。

  3. デプロイメント ページの右上隅にある YAML から作成 をクリックします。

  4. 作成 ページで、次の YAML テンプレートをコードエディタにコピーし、作成 をクリックして、sample-app という名前のアプリケーションとサービスを作成します。

    説明

    アプリケーションポッドは、リクエスト数を示す http_requests_total メトリクスを公開するために使用されます。

    詳細を表示するにはクリックしてください

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/knative-sample-fib-server:v1
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
            env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name  
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      ports:
        - port: 8080
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: sample-app
      type: ClusterIP

ServiceMonitor の作成

  1. ARMS コンソール にログインします。

  2. 左側のナビゲーションペインで、統合センターをクリックします。表示されるページで、検索ボックスにカスタムメトリクス収集と入力し、カスタムメトリクス収集をクリックします。

  3. 統合の開始タブで、Kubernetes 環境を選択し、Alibaba Cloud Container Compute Service (ACS) クラスタを選択します。

  4. 設定情報セクションのパラメータを設定し、OK をクリックします。次の表にパラメータを示します。

    パラメータ

    名前

    sample-app

    サービス検出方法

    ServiceMonitor

    名前空間

    default

    ポート名

    http

    メトリクス収集パス

    /metrics

    収集間隔(秒)

    30

    ラベルマッチング

    • app

    • sample-app

  5. 統合ステータスチェックが完了するまで待ちます。コンポーネントは統合され、監視されていますというメッセージが表示されたら、統合は完了です。

  6. 統合管理をクリックして、監視ステータスを確認します。次の図に結果を示します。

    image

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>>)

パラメータ

説明

seriesQuery

Prometheus Query Language (PromQL) クエリデータ。

metricsQuery

seriesQuery の PromQL クエリデータを集計します。

resources

PromQL クエリデータのラベル。リソースオブジェクトと照合されます。リソースオブジェクトは、ポッドや名前空間などのクラスタ内の API リソースです。kubectl api-resources -o wide コマンドを実行して、Kubernetes API リソースをクエリできます。key フィールドは、Prometheus メトリクスの LabelName を指定します。Prometheus メトリクスが指定された LabelName を使用していることを確認してください。

name

正規表現を使用して、Prometheus メトリクスの名前を識別しやすい名前に変換します。この例では、メトリクス名は http_request_total から http_request_per_second に変換されます。

  • 検出: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

  1. ARMS コンソール にログインします。

  2. 左側のナビゲーションペインで、Managed Service for Prometheus > インスタンス を選択します。

  3. Managed Service for Prometheus ページの左上隅で、ACS クラスタがデプロイされているリージョンを選択し、対応する Prometheus インスタンスの名前をクリックして、インスタンス詳細ページに移動します。

  4. 左側のナビゲーションペインで、設定をクリックします。表示されるページで、設定タブをクリックします。

  5. 設定タブで、HTTP API エンドポイントとトークンを記録します。このエンドポイントは、監視データを Grafana にインポートするために使用されます。

    内部ネットワーク経由で Managed Service for Prometheus API を呼び出すことをお勧めします。内部ネットワークが利用できない場合は、インターネット経由で API を呼び出すことができます。

    Prometheus.png

オープンソース Prometheus

  1. Managed Service for Prometheus をデプロイします。

    1. ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。

    2. クラスタ ページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、アプリケーション > Helm を選択します。

    3. Helm ページの左上隅にある デプロイ をクリックします。

    4. デプロイ パネルの チャート セクションで ack-prometheus-operator を検索し、次へ をクリックします。

    5. パラメータ ページで、パラメータを設定し、OK をクリックします。

      1. デプロイ結果を確認します。

        1. 次のコマンドを実行して、クラスタ内の Prometheus をローカルポート 9090 にマップします。

          kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
        2. ブラウザのアドレスバーに localhost:9090 と入力して、Prometheus ページにアクセスします。

        3. 上部のナビゲーションバーで、ステータス > ターゲット を選択して、すべてのデータ収集タスクを表示します。采集任务UP 状態のタスクは想定どおりに実行されています。Targets

  2. servicenamespaceラベル 列で確認します。

    ServiceName が ack-prometheus-operator-prometheus で、ServiceNamespace が monitoring の場合、次のサンプルコードはオープンソース Prometheus のエンドポイントを示しています。

    http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090