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 ワークロードを自動スケーリングする方法について説明します。
カスタムメトリクスサーバーを有効にするには、Datadog Cluster Agent のセットアップ手順に従いますが、ステップ 3 - Cluster Agent とそのサービスの作成で Datadog Cluster Agent のデプロイマニフェストを編集する場合は、次の追加手順に従ってください。
DD_EXTERNAL_METRICS_PROVIDER_ENABLED
を true
に設定します。<DD_APP_KEY>
と <DD_API_KEY>
を構成します。DATADOG_HOST
を https://
に設定します (デフォルトは https://app.datadoghq.com
)。Datadog Cluster Agent が起動して実行されたら
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
を実行します
rbac-hpa.yaml
RBAC ルールファイルをダウンロードします。
サービスを介して Cluster Agent を External Metrics Provider として登録し、上記の RBAC ルールを適用してポート 443
を公開します。
kubectl apply -f rbac-hpa.yaml
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
このマニフェストで次のことに注意してください。
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 および Datadog Cluster Agent v1.7.0 以上を使用して、Datadog クエリをオートスケール
オートスケールが正常に動作するには、クエリが以下のルールに従う必要があります。
注: クエリは任意ですが、開始および終了時間は Now() - 5 minutes
および Now()
に設定されます
DatadogMetric
CRD の使用を有効にするには、以下の追加手順を実行します。
DatadogMetric
CRD をクラスターにインストールします。
kubectl apply -f "https://raw.githubusercontent.com/DataDog/helm-charts/master/crds/datadoghq.com_datadogmetrics.yaml"
Datadog Cluster Agent RBAC マニフェストを更新します (DatadogMetric
CRD の使用を許可するために更新されています)。
kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/cluster-agent-datadogmetrics/cluster-agent-rbac.yaml"
Datadog Cluster Agent のデプロイで、DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD
を true
に設定します。
セットアップ手順が完了したら、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 に値を提供し始めます。
DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRD
を true
に設定したものの、依然として DatadogMetric
を参照しない HPA がある場合、通常の構文 (datadogmetric@...
を使用した DatadogMetric
を参照しない) がサポートされます。
Datadog Cluster Agent は、自動的にそのネームスペース (dcaautogen-
で始まる名前) で DatadogMetric
リソースを作成してこれに対応するため、DatadogMetric
への移行がスムーズになります。
DatadogMetric
を参照するよう HPA を後で移行することを選択すると、自動生成されたリソースは数時間後に Datadog Cluster Agent によりクリーンアップされます。
Datadog Cluster Agent は、すべての DatadogMetric
リソースの status
サブリソースを更新し、クエリ結果を Datadog に反映します。どこかに問題があった場合、これが状況を理解するための主な情報源となります。
例: DatadogMetric
の status
部分:
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 へ返される値となります。