カスタムメトリクスサーバー
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

カスタムメトリクスサーバー

はじめに

Horizontal Pod Autoscaling 機能は、Kubernetes v1.2 で導入され、CPU などの基本的なメトリクスの自動スケーリングを可能にしますが、アプリケーションと一緒に実行するには metrics-server というリソースが必要です。Kubernetes v1.6 では、カスタムメトリクスを自動スケーリングすることが可能です。 カスタムメトリクスはユーザー定義であり、クラスター内から収集されます。Kubernetes v1.10 の時点で、外部メトリクスのサポートが導入され、Datadog によって収集されたクラスター外部からのメトリクスを自動スケーリングします。

カスタムおよび外部メトリクスプロバイダーは、メトリクスサーバーとは対照的に、ユーザーが実装および登録する必要があるリソースです。

v1.0.0 の時点で、Datadog Cluster Agent のカスタムメトリクスサーバーは、外部メトリクス用の External Metrics Provider インターフェイスを実装しています。このドキュメントページでは、設定方法と、Datadog メトリクスに基づいて Kubernetes ワークロードを自動スケーリングする方法について説明します。

要件

  1. Kubernetes >v1.10 を実行して、API サーバーに対して External Metrics Provider リソースを登録できるようにします。
  2. 集計レイヤーを有効にします。Kubernetes 集計レイヤーの構成ドキュメントを参照してください。

Cluster Agent 外部メトリクスサーバーをセットアップする

カスタムメトリクスサーバー

カスタムメトリクスサーバーを有効にするには、Datadog Cluster Agent のセットアップ手順に従いますが、ステップ 3 - Cluster Agent とそのサービスの作成で Datadog Cluster Agent のデプロイマニフェストを編集する場合は、次の追加手順に従ってください。

  1. Datadog Cluster Agent のデプロイで、DD_EXTERNAL_METRICS_PROVIDER_ENABLEDtrue に設定します。
  2. Datadog API とアカウントのアプリケーションキーを使って、Datadog Cluster Agent のデプロイで、<DD_APP_KEY><DD_API_KEY> を構成します。
  3. 任意: EU アカウントを使用している場合は、DATADOG_HOSThttps://app.datadoghq.eu に設定します。

External Metrics Provider を登録する

Datadog Cluster Agent が起動して実行されたら

  1. datadog-custom-metrics-server サービスを作成し、次の custom-metric-server.yaml マニフェストでポート 443 を公開します。

      kind: Service
      apiVersion: v1
      metadata:
        name: datadog-custom-metrics-server
      spec:
        selector:
          app: datadog-cluster-agent
        ports:
        - protocol: TCP
          port: 443
          targetPort: 443

この変更を適用するには、kubectl apply -f custom-metric-server.yaml を実行します

  1. rbac-hpa.yaml RBAC ルールファイルをダウンロードします。
  2. サービスを介して Cluster Agent を External Metrics Provider として登録し、上記の RBAC ルールを適用してポート 443 を公開します。

    kubectl apply -f rbac-hpa.yaml

HPA を実行する

Datadog Cluster Agent を実行してサービスを登録したら、HPA マニフェストを作成し、メトリクスに type: External を指定して、Datadog Cluster Agent に Datadog からメトリクスをプルするよう通知します。

spec:
  metrics:
    - type: External
      external:
      metricName: "<METRIC_NAME>"
      metricSelector:
        matchLabels:
          <TAG_KEY>: <TAG_VALUE>

: Datadog メトリクス nginx.net.request_per_s に基づいて NGINX デプロイを自動スケーリングする HPA マニフェスト

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metricName: nginx.net.request_per_s
      metricSelector:
        matchLabels:
            kube_container_name: nginx
      targetAverageValue: 9

このマニフェストで次のことに注意してください。

  • HPAは、nginx と呼ばれるデプロイを自動スケーリングするように構成されています。
  • 作成されるレプリカの最大数は 3 で、最小数は 1 です。
  • 使用されるメトリクスは nginx.net.request_per_s であり、スコープは kube_container_name: nginx です。このメトリクス形式は、Datadog の形式に対応しています。

Kubernetes は 30 秒ごとに Datadog Cluster Agent にクエリを実行してこのメトリクスの値を取得し、必要に応じて比例的に自動スケーリングします。高度なユースケースでは、同じ HPA に複数のメトリクスを含めることができます。Kubernetes 水平ポッド自動スケーリングのドキュメントで確認できるように、提案された値の最大値は選択された値です。

: 複数の Cluster Agent を実行すると、API の使用量が増えます。Datadog Cluster Agent は、Kubernetes の約 45 の HPA オブジェクトに対して 1 時間に 120 の呼び出しを行います。45 以上の HPA を実行することで、同じ組織内からメトリクスをフェッチする際の呼び出し数が増えます。

DatadogMetric CRD を使用した、カスタムクエリによるオートスケーリング (Cluster Agent v1.7.0 以上)

DatadogMetric CRD および Datadog Cluster Agent v1.7.0 以上を使用して、Datadog クエリをオートスケール

カスタムクエリ要件

オートスケールが正常に動作するには、クエリが以下のルールに従う必要があります。

  • クエリの構文は正確でなければなりません。正確でない場合、オートスケールに使用されるすべてのメトリクスが更新されません (オートスケールが停止します)。
  • クエリ結果は 1 つの系列のみを出力しなければなりません (それ以上の場合、結果は無効とみなされます)。
  • クエリからは、少なくとも 2 つのタイムスタンプを持つポイントの結果が得られる必要があります (1 つのポイントを返すクエリの使用も可能ですが、この場合オートスケールは不完全なポイントを使用する可能性があります)。

: クエリは任意ですが、開始および終了時間は Now() - 5 minutes および Now() に設定されます

Datadog Cluster Agent で DatadogMetric を使用するためのセットアップ

DatadogMetric CRD の使用を有効にするには、以下の追加手順を実行します。

  1. DatadogMetric CRD をクラスターにインストールします。

    kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-operator/master/deploy/crds/datadoghq.com_datadogmetrics_crd.yaml"
  2. Datadog Cluster Agent RBAC マニフェストを更新します (DatadogMetric CRD の使用を許可するために更新されています)。

    kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/cluster-agent/cluster-agent-rbac.yaml"
  3. Datadog Cluster Agent のデプロイで、DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRDtrue に設定します。

DatadogMetric を使用するための HPA セットアップ

セットアップ手順が完了したら、DatadogMetric リソースの作成を開始します。DatadogMetric はネームスペース規則のリソースです。HPA はあらゆる DatadogMetric を参照できますが、HPA と同じネームスペースで作成することをおすすめします。

: 複数の HPA を同じ DatadogMetric で使用できます。

以下のマニフェストで DatadogMetric を作成できます。

apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
  name: <your_datadogmetric_name>
spec:
  query: <your_custom_query>

: Datadog メトリクス nginx.net.request_per_s に基づいて NGINX デプロイをオートスケールする DatadogMetric オブジェクト

apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
  name: nginx-requests
spec:
  query: max:nginx.net.request_per_s{kube_container_name:nginx}.rollup(60)

DatadogMetric を作成したら、次の DatadogMetric を使用するために HPA を構成する必要があります。

spec:
  metrics:
    - type: External
      external:
      metricName: "datadogmetric@<namespace>:<datadogmetric_name>"

: nginx-requests という名前の DatadogMetric を使用した HPA。両オブジェクトが nginx-demo のネームスペースにあることを前提とする。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metricName: datadogmetric@nginx-demo:nginx-requests
      targetAverageValue: 9

HPA を DatadogMetric にリンクしたら、Datadog Cluster Agent がカスタムクエリを使用して HPA に値を提供し始めます。

外部メトリクスを使用した、既存 HPA の自動移行

DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRDtrue に設定したものの、依然として DatadogMetric を参照しない HPA がある場合、通常の構文 (datadogmetric@... を使用した DatadogMetric を参照しない) がサポートされます。

Datadog Cluster Agent は、自動的にそのネームスペース (dcaautogen- で始まる名前) で DatadogMetric リソースを作成してこれに対応するため、DatadogMetric への移行がスムーズになります。

DatadogMetric を参照するよう HPA を後で移行することを選択すると、自動生成されたリソースは数時間後に Datadog Cluster Agent によりクリーンアップされます。

DatadogMetric に関する問題のトラブルシューティング

Datadog Cluster Agent は、すべての DatadogMetric リソースの status サブリソースを更新し、クエリ結果を Datadog に反映します。どこかに問題があった場合、これが状況を理解するための主な情報源となります。

: DatadogMetricstatus 部分:

status:
  conditions:
  - lastTransitionTime: "2020-06-22T14:38:21Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Active
  - lastTransitionTime: "2020-06-25T09:00:00Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Valid
  - lastTransitionTime: "2020-06-22T14:38:21Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Updated
  - lastTransitionTime: "2020-06-25T09:00:00Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "False"
    type: Error
  currentValue: "1977.2"

4 種類の表示により、DatadogMetric の現在の状態がわかります。

  • Active: Datadog では、少なくとも 1つの HPA が参照している場合に DatadogMetric をアクティブとみなします。非アクティブな DatadogMetrics は、API の使用を最小化するため更新されません。
  • Valid: 関連するクエリの回答が有効である場合、DatadogMetric が有効であると表示されます。「有効でない」状態とは、カスタムクエリが意味的に正しくないことを意味します。詳しくは、Error フィールドを参照してください。
  • Updated: この表示は、Datadog Cluster Agent が DatadogMetric に触れると必ず更新されます。
  • Error: この DatadogMetric の処理がエラーをトリガーすると、この状態が true となりエラーの詳細を表示します。

currentValue は Datadog から収集された値で、HPA へ返される値となります。

その他の参考資料