LoginSignup
22
12

More than 3 years have passed since last update.

独自メトリクスによるPodの水平スケール

Last updated at Posted at 2020-11-30

はじめに

Kubernetesでは、PodのCPUとメモリ使用量を利用したHorizontalPodAutoscale(HPA)機能1が提供されています。しかし、1秒間あたりのHTTPリクエスト数やキューイングされている要素数であったりと、CPUやメモリ以外の指標を利用してPodをスケールさせたいケースもあるのではないでしょうか。このようなケースに対応するため、Kubernetesでは独自メトリクスをスケール指標として利用する方法も提供されています2

独自メトリクスの種類

image.png

独自メトリクスを利用する場合、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を用いて実際にカスタムメトリクスを利用する方法を説明します。

22
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
12