OpenTelemetryコレクターチャート

はじめに

OpenTelemetryコレクターは、Kubernetesクラスタとその中のすべてのサービスを監視するための重要なツールです。 Kubernetesへのコレクターのデプロイメントを容易にし、管理するために、OpenTelemetryコミュニティはOpenTelemetryコレクターHelmチャートを作成しました。 このHelmチャートは、コレクターをデプロイメント、DaemonSet、またはStatefulSetとしてインストールするために使用できます。

チャートのインストール

リリース名 my-opentelemetry-collector のチャートをインストールするには、以下のコマンドを実行します。

helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
   --set image.repository="otel/opentelemetry-collector-k8s" \
   --set mode=<daemonset|deployment|statefulset> \

設定

OpenTelemetryコレクターチャートでは mode が設定されている必要があります。 mode には、ユースケースに応じたKubernetesデプロイメントに依存して daemonsetdeploymentstatefulset のいずれかを指定します。

インストールされると、チャートはいくつかのデフォルトのコレクターコンポーネントを提供します。 デフォルトでは、コレクターの設定は以下のようになります。

exporters:
  # 注意: v0.86.0 より前のバージョンでは、`debug` のかわりに `logging` を使用すること
  debug: {}
extensions:
  health_check: {}
processors:
  batch: {}
  memory_limiter:
    check_interval: 5s
    limit_percentage: 80
    spike_limit_percentage: 25
receivers:
  jaeger:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:14250
      thrift_compact:
        endpoint: ${env:MY_POD_IP}:6831
      thrift_http:
        endpoint: ${env:MY_POD_IP}:14268
  otlp:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:4317
      http:
        endpoint: ${env:MY_POD_IP}:4318
  prometheus:
    config:
      scrape_configs:
        - job_name: opentelemetry-collector
          scrape_interval: 10s
          static_configs:
            - targets:
                - ${env:MY_POD_IP}:8888
  zipkin:
    endpoint: ${env:MY_POD_IP}:9411
service:
  extensions:
    - health_check
  pipelines:
    logs:
      exporters:
        - debug
      processors:
        - memory_limiter
        - batch
      receivers:
        - otlp
    metrics:
      exporters:
        - debug
      processors:
        - memory_limiter
        - batch
      receivers:
        - otlp
        - prometheus
    traces:
      exporters:
        - debug
      processors:
        - memory_limiter
        - batch
      receivers:
        - otlp
        - jaeger
        - zipkin
  telemetry:
    metrics:
      address: ${env:MY_POD_IP}:8888

また、このチャートはデフォルトのレシーバーに基づいてポートを有効にします。 デフォルトの設定は values.yamlnull に設定することで削除できます。 ポートも values.yaml で無効にできます。

values.yamlconfig セクションを使用して、設定の任意の部分を追加/変更できます。 パイプラインを変更する場合は、デフォルトのコンポーネントを含め、パイプラインに含まれるすべてのコンポーネントを明示的にリストアップする必要があります。

たとえば、メトリクスとロギングパイプラインと非OTLPレシーバーを無効にするには次のように設定します。

config:
  receivers:
    jaeger: null
    prometheus: null
    zipkin: null
  service:
    pipelines:
      traces:
        receivers:
          - otlp
      metrics: null
      logs: null
ports:
  jaeger-compact:
    enabled: false
  jaeger-thrift:
    enabled: false
  jaeger-grpc:
    enabled: false
  zipkin:
    enabled: false

チャートで利用可能なすべての設定オプション(コメント付き)は、そのvalues.yamlファイルで確認できます。

プリセット

OpenTelemetryコレクターがKubernetesを監視するために使用する重要なコンポーネントの多くは、コレクター自身のKubernetesデプロイメントで特別なセットアップを必要とします。 これらのコンポーネントをより簡単に使用するために、OpenTelemetryコレクターチャートには、有効にするとこれらの重要なコンポーネントの複雑なセットアップを処理するいくつかのプリセットが付属しています。

プリセットは出発点として使用されるべきです。 プリセットは、関連するコンポーネントの基本的な、しかし豊富な機能を設定します。 これらのコンポーネントの追加設定が必要な場合は、プリセットは使用せず、コンポーネントとそれに必要なもの(ボリューム、RBACなど)を手動で設定することをおすすめします。

ログコレクションプリセット

OpenTelemetryコレクターは、Kubernetesコンテナによって標準出力に送られるログを収集するために使用できます。

この機能はデフォルトでは無効になっています。 安全に有効にするためには以下の条件があります。

  • ファイルログレシーバーコレクターのContribディストリビューションなどのコレクターイメージに含まれている必要があります。
  • 厳密な要件ではありませんが、このプリセットは mode=daemonset と共に使用することを推奨します。 filelogreceiverはコレクターが動作しているノード上のログのみを収集することができ、同じノード上に設定された複数のコレクターは重複したデータを生成します。

この機能を有効にするには、presets.logsCollection.enabled プロパティを true に設定します。 有効にすると、チャートは logs パイプラインに filelogreceiver を追加します。 このレシーバーは、Kubernetes コンテナランタイムがすべてのコンテナのコンソール出力を書き込むファイル(/var/log/pods/*/*.log)を読み込むように設定されます。

以下に values.yaml の例を示します。

mode: daemonset
presets:
  logsCollection:
    enabled: true

チャートのデフォルトのログパイプラインは debugexporter を使用します。 logsCollection プリセットの filelogreceiver と組み合わせると、エクスポートしたログを誤ってコレクターに戻してしまい、「ログの爆発」を引き起こす可能性があります。

ループを防止するために、レシーバーのデフォルト設定ではコレクター自身のログを除外しています。 コレクターのログを含めたい場合は、 debug エクスポーターをコレクターの標準出力にログを送信しないエクスポーターに置き換えてください。

以下は values.yaml の例で、logs パイプラインのデフォルトの debug エクスポーターを、コンテナのログを https://example.com:55681 エンドポイントに送信する otlphttp エクスポーターに置き換えたものです。 また、presets.logsCollection.includeCollectorLogs を使用して、コレクターのログの収集を有効にするようにプリセットに指示します。

mode: daemonset

presets:
  logsCollection:
    enabled: true
    includeCollectorLogs: true

config:
  exporters:
    otlphttp:
      endpoint: https://example.com:55681
  service:
    pipelines:
      logs:
        exporters:
          - otlphttp

Kubernetes属性プリセット

OpenTelemetryコレクター は k8s.pod.namek8s.namespace.namek8s.node.name などの Kubernetes メタデータをログ、メトリクス、トレースに追加するように設定できます。 プリセットを使用するか、手動で k8sattributesprocessor を有効にすることを強く推奨します。

RBACを考慮し、この機能はデフォルトでは無効になっています。 この機能には以下の要件があります。

この機能を有効にするには、presets.kubernetesAttributes.enabled プロパティを true に設定します。 有効にすると、チャートはClusterRoleに必要なRBACロールを追加し、有効にした各パイプラインに k8sattributesprocessor を追加します。

以下に values.yaml の例を示します。

mode: daemonset
presets:
  kubernetesAttributes:
    enabled: true

Kubeletメトリクスプリセット

OpenTelemetryコレクター は、kubelet 上の API サーバーからノード、ポッド、コンテナのメトリクスを収集するように設定できます。

この機能はデフォルトでは無効になっています。 この機能には以下の条件があります。

  • KubeletstatsレシーバーコレクターのContribディストリビューションなどのコレクターイメージに含まれている必要があります。
  • 厳密な要件ではありませんが、このプリセットは mode=daemonset と共に使用することを推奨します。 kubeletstatsreceiver はコレクターが動作しているノードでのみメトリクスを収集することができ、同じノードに複数の設定されたコレクターがあると重複したデータが生成されます。

この機能を有効にするには、presets.kubeletMetrics.enabled プロパティを true に設定します。 有効にすると、チャートはClusterRoleに必要なRBACロールを追加し、メトリクスパイプラインに kubeletstatsreceiver を追加します。

以下にvalues.yamlの例を示します。

mode: daemonset
presets:
  kubeletMetrics:
    enabled: true

クラスターメトリクスプリセット

OpenTelemetryコレクターは、Kubernetes APIサーバーからクラスタレベルのメトリクスを収集するように設定できます。 これらのメトリクスには、Kube State Metricsで収集されるメトリクスの多くが含まれます。

この機能はデフォルトでは無効になっています。 この機能には以下の条件があります。

この機能を有効にするには、 presets.clusterMetrics.enabled プロパティを true に設定します。 有効にすると、チャートは必要なRBACロールをClusterRoleに追加し、 k8sclusterreceiver をメトリクスパイプラインに追加します。

以下に values.yaml の例を示します。

mode: deployment
replicaCount: 1
presets:
  clusterMetrics:
    enabled: true

Kubernetesイベントプリセット

OpenTelemetryコレクターはKubernetesイベントを収集するように設定できます。

この機能はデフォルトでは無効になっています。 この機能には以下の条件があります。

この機能を有効にするには、presets.kubernetesEvents.enabled プロパティを true に設定します。 有効にすると、チャートは ClusterRole に必要な RBAC ロールを追加し、ログパイプラインに k8sobjectsreceiver を追加してコレクターイベントのみに設定します。

以下に values.yaml の例を示します。

mode: deployment
replicaCount: 1
presets:
  kubernetesEvents:
    enabled: true

ホストメトリクスプリセット

OpenTelemetryコレクターは、Kubernetesノードからホストメトリクスを収集するように設定できます。

この機能はデフォルトでは無効になっています。 この機能には以下の条件があります。

  • コレクターのContribディストリビューションなどのコレクターイメージにホストメトリクスレシーバーが含まれている必要があります。
  • 厳密な要件ではありませんが、このプリセットは mode=daemonset と共に使用することを推奨します。 hostmetricsreceiver は、コレクターが動作しているノード上のメトリクスのみを収集することができ、同じノード上に複数の設定されたコレクターがあると、重複したデータが生成されます。

この機能を有効にするには、presets.hostMetrics.enabled プロパティを true に設定します。 有効にすると、チャートは必要なボリュームとボリュームマウントを追加し、 hostmetricsreceiver をメトリクスパイプラインに追加します。 デフォルトでは、メトリクスは10秒ごとにスクレイプされ、以下のスクレイパーが有効になります。

  • cpu
  • load
  • memory
  • disk
  • filesystem[^1]
  • network

以下にvalues.yamlの例を示します。

mode: daemonset
presets:
  hostMetrics:
    enabled: true

[^1] kubeletMetrics プリセットと重複する部分があるため、デフォルトでは一部のファイルシステムタイプとマウントポイントは除外されています。