はじめに
Kubernetesでは、PodのCPUとメモリ使用量を利用したHorizontalPodAutoscale(HPA)機能1が提供されています。しかし、1秒間あたりのHTTPリクエスト数やキューイングされている要素数であったりと、CPUやメモリ以外の指標を利用してPodをスケールさせたいケースもあるのではないでしょうか。このようなケースに対応するため、Kubernetesでは独自メトリクスをスケール指標として利用する方法も提供されています2。
独自メトリクスの種類
独自メトリクスを利用する場合、API Aggregation LayerのAPIService3としての登録が必要です。また、登録可能な独自メトリクスには以下の2つがあります。
-
カスタムメトリクス: Podやその他Kubernetes APIリソースに紐づくリソースのメトリクス登録に利用するAPIで、APIグループ名は
custom.metrics.k8s.io
として登録する -
外部メトリクス: Kubernetesリソースに紐付かない外部リソースのメトリクス登録に利用するAPIで、APIグループ名は
external.metrics.k8s.io
として登録する
2020/11/24現在、APIServiceで登録するカスタム・外部メトリクスサーバ本体はKubernetesがオフィシャルで提供されていません4。よって、利用するメトリクスを収集しているサービスに合わせて、DataDog5やAzure6といったクラウドサービスプロバイダが提供するカスタムメトリクスサーバや、OSSのカスタムメトリクスサーバ78を利用することになります。
独自メトリクスの指定方法
カスタムメトリクスは、標準のCPU/メモリのリソースメトリクスの指定と同様にHPAの .spec.metrics
に指定します。サポートしているTypeはPodsとObjectの2つで、Podの場合はPods、それ以外の同じNamespaceにいるAPIリソースにはObjectを利用します。
ちなみに、Kubernetes v1.19現在はHPAのデフォルトバージョンがv1となっているため、カスタムメトリクスをサポートしているv2beta2リソースの取得には、明示的なバージョン指定が必要です。
$ kubectl get hpa.v2beta2.autoscaling test -o yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
...
metrics:
- type: Pods
pods:
metric:
name: io_per_second # 利用するPodカスタムメトリクス名
target:
type: AverageValue # AverageValueのみ指定可能で、メトリクスのPod平均を意味する
averageValue: "10" # しきい値
- type: Object
object:
describedObject:
apiVersion: apps/v1
kind: Deployment
name: test
metric:
name: http_request_per_seconds # 利用するその他APIリソースのカスタムメトリクス名
target:
type: Value # Value or AverageValueを指定可能。後者の場合、メトリクス値をPod数で割った値が使われる
value: "10" # しきい値
外部メトリクスも .spec.metrics
に指定します。 describedObject
以外は Objectタイプと同様です。
...
metrics:
- type: External
external:
metric:
name: queue_messages_ready # 利用する外部メトリクス名
target:
type: AverageValue # Value or AverageValueを指定可能。後者の場合、メトリクス値をPod数で割った値が使われる
averageValue: "30" # しきい値
...
フォーマットはいずれのメトリクスもほとんど共通していますが、モノによってターゲットに指定できる値が異なることに注意してください。また、Objectの場合は同じNamespaceに所属するリソースに限定される点にも注意が必要です。
おわりに
今回は独自メトリクスの種類とその指定方法について説明しました。次回はPrometheus Adapterを用いて実際にカスタムメトリクスを利用する方法を説明します。
-
v1.6+の
autoscaling/v2beta2
よりサポート ↩ -
2020/11/24現在、OSSのPrometheusAdapterはkubernetes-sigsへの移管作業中です ↩
-
datadog-agent/CUSTOM_METRICS_SERVER.md at c4f38af1897bac294d8fed6285098b14aafa6178 · DataDog/datadog-agent ↩
-
Azure/azure-k8s-metrics-adapter: An implementation of the Kubernetes Custom Metrics API and External Metrics API for Azure Services ↩
-
DirectXMan12/k8s-prometheus-adapter: An implementation of the custom.metrics.k8s.io API using Prometheus ↩
-
zalando-incubator/kube-metrics-adapter: General purpose metrics adapter for Kubernetes HPA metrics ↩