Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

Kubernetes上でOtel Collectorを動かし、OTLP ExporterでMackerelに投稿する

arthur-1 Mackerel Advent Calendar 2023ラソン10日目の記事です。

MackerelはOpenTelemetry対応を進めています

Mackerelはテレメトリデータを収集・エクスポートすることに関する標準規格であるOpenTelemetryへの対応を進めています。

mackerel.io

その第一弾として、ラベル対応メトリック機能をオープンβリリースしています。

2023年12月現在では、OpenTelemetry MetricsのうちgaugeをOTLP/gRPCでMackerelに投稿し、PromQLを用いてグラフ化することができます。ベンダー独自のExporterを使わずともメトリックをエクスポートできるのが魅力の一つです。

ラベル対応メトリックのオープンベータテストは以下のフォームからお申し込みできますので、ぜひ使ってみてください。

docs.google.com

KubernetesのメトリックをOTLPでMackerelに投稿する

ラベル対応メトリック機能をdogfoodingするにあたり、自宅でRaspberry Piを寄せ集めて作ったKubernetes クラスタのメトリックをMackerelで見えるようにしていきます。

PoEで給電しているのがこだわりポイントです

OpenTelemetry CollectorをKubernetes上で動かすことで、ホストやクラスターに関するメトリックを外部サービスに投稿することができます。Helm Chartを使うと比較的手間なく導入できるので、その方法をご紹介します。

opentelemetry.io

下準備

OpenTelemetryのHelm Chartのrepositoryを追加しましょう。また、今後のためにnamespaceを切っておきます。

$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
$ kubectl create namespace otel-collector

ホストメトリックを投稿する

まずは以下のような設定ファイルをvalues-daemonset.yamlとして用意しましょう。このファイルの雛形はhttps://github.com/open-telemetry/opentelemetry-helm-charts/blob/main/charts/opentelemetry-collector/values.yamlです。

mode: daemonset

presets:
  hostMetrics:
    enabled: true
  kubernetesAttributes:
    enabled: true

config:
  exporters:
    otlp:
      endpoint: otlp.mackerelio.com:4317
      compression: gzip
      headers:
        Mackerel-Api-Key: ***your-mackerel-api-key***

  processors:
    batch:
      timeout: 1m
    # 本来はここでresourcedetectorの設定もするのが望ましいはず、、

  service:
    pipelines:
      metrics:
        exporters: [otlp]

config部分はOpenTelemetry Collectorの設定ですね。presetsの部分ですが、ここでパラメータを指定していくと対応するReceiverを作ってくれるだけでなく、実際に動かすために他に必要なリソース(ServiceAccountなど)もHelm Chartで面倒を見て作ってくれるようです。

yamlファイルができたら、以下のようにしてReleaseを作っていきます。

$ helm install otel-collector-daemonset open-telemetry/opentelemetry-collector -n otel-collector --values values-daemonset.yaml

以下のようにPodが立っていたら成功です。

$ kubectl get pods -n otel-collector
NAME                                                              READY   STATUS    RESTARTS      AGE
otel-collector-daemonset-opentelemetry-collector-agent-6mjwd      1/1     Running   0             36m
otel-collector-daemonset-opentelemetry-collector-agent-xr69w      1/1     Running   0             36m

クラスターメトリックを投稿する

今度はクラスターメトリックを投稿していきましょう。先程と同様に、values-deployment.yamlを作ります。

mode: deployment

presets:
  clusterMetrics:
    enabled: true
  kubernetesAttributes:
    enabled: true

config:
  exporters:
    otlp:
      endpoint: otlp.mackerelio.com:4317
      compression: gzip
      headers:
        Mackerel-Api-Key: ***

  processors:
    batch:
      timeout: 1m

  service:
    pipelines:
      metrics:
        exporters: [otlp]

今度はmodeがdeploymentに変わっています。Helm Chartのドキュメントに書いてあるのですが、作成したいReceiverごとに推奨されるmodeが違います。

そしてhelm installでリソースを作成していきます。

$ helm install otel-collector-deployment open-telemetry/opentelemetry-collector -n otel-collector --values values-deployment.yaml

以下のようにPodが増えていたら成功です。daemonsetでは全てのノードにPodが配置されるのに対し、deploymentではある1つのノードにPodが配置されます。

$ kubectl get pods -n otel-collector
NAME                                                              READY   STATUS    RESTARTS      AGE
otel-collector-daemonset-opentelemetry-collector-agent-6mjwd      1/1     Running   0             36m
otel-collector-daemonset-opentelemetry-collector-agent-xr69w      1/1     Running   0             36m
otel-collector-deployment-opentelemetry-collector-748ddcbdfjs8v   1/1     Running   1 (45m ago)   75m

本当はもう1つkubeletMetricsというメトリックの種類もあるのですが、自分の環境でうまく動かなかったので宿題にさせてください。

投稿されたメトリックをMackerel上で見ていく

Mackerelのカスタムダッシュボード編集画面でグラフウィジェットを作成し、グラフのタイプを「クエリグラフ」にします。オープンベータテストに申し込んでいないとクエリグラフの選択肢が出てきません。

クエリ部分にk8s.node.condition_readyと入力すると、ノードごとReady状態か否かのメトリックがグラフとして表示されます。

たくさんAttributeがついているのでグラフの凡例が煩雑ですが、以下のように凡例に使いたいAttributeを選ぶことが可能です。

PromQLのsubsetが使えるので、例えばcount_values集約演算子を用いて、phaseごとのpodの数を数えてグラフにすることもできます。