すでにKubernetesでアプリケーションを実行していて、OpenTelemetryを利用してアプリとクラスタの健全性とパフォーマンスに関する情報を取得することを検討している場合は、OpenTelemetry Operatorと呼ばれるKubernetes Operatorの実装を考えるとよいでしょう。
OpenTelemetry Operatorにはさまざまな機能があるため、ほとんど手間のかからないOpenTelemetry管理に最適です。しかし、どんな強力なツールでもそうですが、問題が起きたらどうなるのでしょうか?
このブログ記事では、OpenTelemetry Operator(以下、「オペレーター」)について、またインストール、コレクターのデプロイ、自動インストゥルメンテーションでよく発生する問題について説明します。また、これらの問題を解決する方法を学ぶことで、オペレーターを実行するための準備を整えることができます。
オペレーターの概要
オペレーターの主な機能を詳しく見てみましょう。
OTelコレクターの管理
オペレーターはコレクターのデプロイを自動化し、コレクターが正しく設定され、クラスタ内でスムーズに実行されるようにします。オペレーターは、大規模なデータ収集エージェント群をリモートで管理するためのネットワークプロトコルであるOpen Agent Management Protocol(OpAMP)を使用して、コレクター群全体の設定も管理します。このプロトコルはベンダーに依存しないため、一貫したオブザーバビリティ設定が確保され、異なるベンダーのエージェント間での管理が簡素化されます。
Pod内の自動インストゥルメンテーションの管理
オペレーターは、アプリケーションに自動インストゥルメンテーション機能を自動的に挿入して設定するため、ソースコードを変更せずにテレメトリーデータを収集できます。アプリケーションがまだOpenTelemetryで計装されていない場合、これは一石二鳥でアプリケーションテレメトリーの生成と収集を開始できる素晴らしいオプションです。
オペレーターのインストール
当然のように思えるかもしれませんが、オペレーターをインストールする前に、Kubernetes 1.23以降を実行している、オペレーターをインストールできるKubernetesクラスタが必要です。特定のバージョン要件については、互換性マトリックスを確認してください。minikube、k0s、KinDなどのローカルKubernetesツールを使用してマシン上でクラスタを起動することも、クラウドプロバイダーサービスで実行されているクラスタを使用することもできます。
次に、そのクラスタにcert-managerというコンポーネントがすでにインストールされている必要があります。このコンポーネントは、証明書が有効かつ最新であることを確認することで、Kubernetesの証明書を管理します。cert-managerとオペレーターの両方を、kubectlまたはHelmチャート経由でインストールできます。
ヒント:いずれの場合も、オペレーターのインストールを開始する前に、cert-managerのインストールが完了するまで待つ必要があることに注意してください。そうしないと、オペレーターのインストールが失敗します。
kubectlを使用したインストール
次のコマンドを実行し、cert-managerをインストールします。
次に、オペレーターをインストールします。
Helmを使用したインストール
cert-managerをインストールするために、まずHelmリポジトリを追加します。
次に、Helmチャートを使用しcert-managerをインストールします。
cert-managerのインストールには数分かかることが想定されます。このリンクの手順に従ってcert-managerのインストール状況を確認するか、次のコマンドを実行してデプロイ状況を確認してください。
オペレーターをインストールします。インストールを行うにはHelm 3.9以降が必要であることに注意してください。まず、リポジトリを追加します。
次に、オペレーターをインストールします。
OTelコレクターのデプロイ
クラスタにcert-managerとオペレーターを設定したら、コレクターをデプロイできます。コレクターは、さまざまなソースからテレメトリーを取り込み、受信したテレメトリーを設定に基づいてさまざまな方法で変換し、処理されたデータをOpenTelemetryデータ形式(OpenTelemetry Protocolの略であるOTLP)を受け入れるバックエンドにエクスポートできる多目的コンポーネントです。
コレクターは、「パターン」と呼ばれるさまざまな方法でデプロイできます。どのパターンをデプロイするかは、テレメトリーのニーズと組織のリソースによって異なります。このトピックはこのブログ記事の範囲外ですが、このリンクから詳細をご覧いただけます。
コレクターカスタムリソース
カスタムリソース(CR)は、デフォルトのKubernetesインストールでは必ずしも利用できるとは限らない、特定のKubernetesインストールのカスタマイズを表します。CRは、Kubernetesをよりモジュール化するのに役立ちます。
オペレーターには、OpenTelemetryCollector
と呼ばれるコレクターのデプロイメントを管理するためのCRがあります。以下は、OpenTelemetryCollector
リソースのサンプルです。
OpenTelemetryCollector
リソースには、インスタンス化の計画方法に応じて多くの設定オプションがありますが、基本的な設定では以下が必要です。
mode
は、deployment
、sidecar
、daemonset
、statefulset
のいずれかである必要があります。mode
を省略すると、デフォルトでdeployment
が使用されます。config
は、コレクターのYAML設定なので、見たことがあるかもしれません。
コレクターのデプロイに関する一般的な問題とトラブルシューティングのヒント
期待したデータが表示されない場合、または何かが正しく機能していないと思われる場合は、次のトラブルシューティングのヒントをお試しください。
コレクターリソースが適切にデプロイされていることを確認する
OpenTelemetryCollector
YAMLがデプロイされると、Kubernetesに次のオブジェクトが作成されます。
- OpenTelemetryCollector
- コレクターポッド:
- サイドカー以外の
mode
を指定した場合は、<collector_CR_name>-collector-<unique_identifier>
という名前のDeployment
、StatefulSet
、DaemonSet
リソースを探します。 mode
をsidecar
として指定すると、コレクターサイドカーコンテナがotc-container
という名前のアプリポッドに作成されます。
- サイドカー以外の
- ターゲットアロケーターポッド:
- ターゲットアロケーターを有効にした場合は、
<collector_CR_name>-targetallocator-<unique_identifier>
という名前のリソースを探します。
- ターゲットアロケーターを有効にした場合は、
- コレクター設定の
ConfigMap
:- サイドカー以外のモードを指定した場合は、
<collector_CR_name> -collector-<unique_identifier>
という名前のDeployment
、StatefulSet
、DaemonSet
リソースを探します。 - モードを
sidecar
として指定した場合、コレクター設定が環境変数として含まれることに注意してください。
- サイドカー以外のモードを指定した場合は、
OpenTelemetryCollector
リソースをデプロイするときは、前述のオブジェクトが作成されていることを確認してください。
リソースの確認方法
まず、OpenTelemetryCollector
リソースがデプロイ済みであることを確認します。
OpenTelemetryCollector
リソースを使用してコレクターをデプロイすると、コレクターの設定YAMLを含むConfigMap
が作成されます。ConfigMap
がコレクターと同じネームスペースに作成され、設定自体が正しいことを確認します。
ConfigMap
を一覧表示します。
また、コレクターのmode
に基づいて適切なコマンドを実行して、コレクターポッドを確認することをお勧めします。
Deployment
、StatefulSet
、Daemonset
モード:
sidecar
モード:
これにより、コレクターサイドカーコンテナを含む、ポッドで作成されたすべてのコンテナが一覧表示されます。コレクター設定は、コレクターサイドカーコンテナに環境変数として含まれています。
コレクターCRバージョンを確認する
使用しているOpenTelemetryCollector
のCRバージョンを確認してください。利用可能なバージョンはv1alpha1
とv1beta1
の2つです。

これら2つのAPIバージョンには、主に2つの違いがあります。
config
セクションが異なります。v1beta1
の場合、設定値はCR設定の一部であるキーの値のペアですが、v1alpha1
の場合、設定値は1つの長いテキスト文字列です。テキスト文字列は依然としてYAML形式に従う必要があることに注意してください。v1beta1
を使用している場合は、コレクター設定の値を空のままにすることはできません。スカラー値の場合は空の中括弧({}
)を指定し、配列の場合は空の角括弧([ ]
)を指定する必要があります。v1alpha1
を使用している場合、これは必要ありません。
コレクターのベースイメージを確認する
デフォルトでは、OpenTelemetryCollector
CRはコレクターのコアディストリビューションを使用します。コアディストリビューションは、OpenTelemetry開発者が開発およびテストするためのコレクターの必要最低限のディストリビューションです。拡張機能、コネクタ、レシーバー、プロセッサ、エクスポーターの基本コンポーネントセットが含まれています。
コアで提供されるコンポーネントよりも多くのコンポーネントにアクセスしたい場合は、代わりにコレクターのKubernetesディストリビューションを使用できます。このディストリビューションは、KubernetesとKubernetesで実行されているサービスをモニターするために、Kubernetesクラスタで使用することを目的として作成されています。これには、コアおよびcontribディストリビューションのコンポーネントのサブセットが含まれています。あるいは、独自のコレクターディストリビューションを構築することもできます。
次の例のように、spec.image
でimage属性を指定することで、コレクターのベースイメージを設定できます。
ライセンスキーを確認する
テレメトリーをNew Relicアカウントに送信するために必要な適切なNew Relicアカウントライセンスキーが設定されていることを確認します。プレーンテキストとして表示されないようにするには、環境変数としてエクスポートするか、Kubernetesシークレットを作成して保存します。オプションで、シークレットプロバイダーまたは独自のクラウドプロバイダーのシークレットプロバイダーを使用できます。
New Relicエンドポイントの設定を確認する
エクスポーター設定で、リージョンに適切なOTLPエンドポイントが設定されていることを確認します。
インストゥルメンテーション
インストゥルメンテーションとは、ソフトウェアにコードを追加して、テレメトリー信号(ログ、メトリクス、トレース)を生成するプロセスです。OpenTelemetryを使用してコードを計装するにはいくつかのオプションがあり、主な2つはコードベースとゼロコードソリューションです。
コードベースのソリューションでは、OpenTelemetry APIを使用してコードを手動で計装する必要があります。実装には時間と労力がかかりますが、このオプションを使用すると、コードのどの部分をどのように計装するかを高度に制御できるため、深いインサイトが得られ、テレメトリーをさらに強化できます。
コードを変更せずにインストゥルメント化するには(またはソースコードを変更できない場合)、 ゼロコードソリューション(または自動インストゥルメンテーションエージェント)を使用できます。この方法では、shimまたはバイトコードエージェントを使用して、実行時またはコンパイル時にコードをインターセプトし、依存するサードパーティのライブラリとフレームワークにトレースとメトリクスのインストゥルメンテーションを追加します。公開時点では、自動インストゥルメンテーションはJava、Python、.NET、JavaScript、PHP、Goで利用可能です。ゼロコードインストルメンテーションの詳細については、このリンクをご覧ください。
両方のオプションを同時に使用することもできます。エンドユーザーの中には、ゼロコードエージェントから始めて、カスタム属性の追加や新しいスパンの作成などの追加のインストゥルメンテーションを手動で挿入することを選択する人もいます。また、OpenTelemetryは、コードベースおよびゼロコードソリューション以外のオプションも提供します。詳細についてはこのリンクをご覧ください。
オペレーターによるゼロコードインストゥルメンテーション
オペレーターにはInstrumentation
と呼ばれるCRがあり、KubernetesポッドにOpenTelemetryインストゥルメンテーションを自動的に挿入して設定できるため、アプリケーションにゼロコードインストゥルメンテーションの利点をもたらします。現在、Apache HTTPD、.NET、Go、Java、nginx、Node.js、Pythonで利用可能です。
以下は、PythonサービスのInstrumentation
リソース定義のサンプルです。
単一の自動インストゥルメンテーションYAMLを使用して、異なる言語で記述された複数のサービスを提供できます(自動インストゥルメンテーションがサポートされている場合)。グローバル環境変数をspec.env
の下にリストし、言語固有の環境変数をspec.<language_name>.env
の下にリストします。これにより、同じInstrumentation
リソース内で、言語固有の環境変数設定を組み合わせて使用できます。
オペレーターの自動インストゥルメンテーション機能を使用するには、Instrumentation
リソースをデプロイするだけでは不十分です。自動インストゥルメンテーション設定は、インストゥルメントされるコードに関連付ける必要があります。これは、次の例のように、アプリケーションのDeployment
YAMLのテンプレート定義セクションに自動インストゥルメンテーションのアノテーションを追加することによって行われます。
instrumentation.opentelemetry.io/inject-python
というアノテーションがtrue
に設定されている場合、このポッドで実行されているコンテナにPython自動インストゥルメンテーション(この場合)を挿入するように、オペレーターに指示します。他の言語の場合は、python
を適切な言語名に置き換えるだけです(Javaアプリの例:instrumentation.opentelemetry.io/inject-java
)。この値をfalse
に設定すると、インストゥルメンテーションを無効にできます。
複数のInstrumentation
リソースがある場合は、使用するリソースを指定する必要があります。指定しないと、オペレーターはどれを選択すればよいかわかりません。これは次のように実行できます。
- リソース名で選択する。
Instrumentation
リソースがDeployment
と同じネームスペースに存在する場合は、これを使用します。たとえば、instrumentation.opentelemetry.io/inject-java: my-instrumentation my-instrumentation
というInstrumentation
リソースを検索します。 - Namespaceとリソース名で選択する。
Instrumentation
リソースが別のネームスペースに存在する場合は、これを使用します。たとえば、instrumentation.opentelemetry.io/inject-java: my-namespace/my-instrumentation
は、ネームスペースmy-namespace
でmy-instrumentation
というInstrumentation
リソースを検索します。
注釈付きアプリケーションの前にInstrumentation
リソースをデプロイする必要があります。そうしないと、コードは自動的にインストゥルメント化されません。オペレーターは、起動時にアプリケーションのポッドにinitコンテナを追加することで自動インストゥルメンテーションを挿入します。つまり、サービスがデプロイされるまでにInstrumentation
リソースを利用できない場合、自動インストゥルメンテーションは失敗します。
一般的なインストゥルメンテーションの問題とトラブルシューティングのヒント
コレクターがデータを処理していないと思われる場合、または自動インストゥルメンテーションが機能していないと思われる場合は、次の手順を試して、問題のトラブルシューティングと解決を行ってください。
インストゥルメンテーションリソースが適切にデプロイされていることを確認する
次のコマンドを実行して、KubernetesクラスタにInstrumentation
リソースが作成されたことを確認します。
オペレーターのログを確認する
次のコマンドを実行して、オペレーターログにエラーメッセージがないか確認します。
リソースのデプロイメント順序を確認する
Instrumentation
CRがDeployment
の前に デプロイされていることを再確認してください。
自動インストゥルメンテーションンテーションのCRアノテーションを確認する
- アノテーションに誤字がないことを確認する
- 次の例のように、設定がデプロイメントのメタデータ定義(
metadata.annotation
)ではなく、ポッドのメタデータ定義(spec.template.metadata.annotation
)にあることを確認する

エンドポイントの設定を確認する
以下の例のように、spec.exporter.endpoint
で設定されているエンドポイントが、Kubernetesクラスタ内のテレメトリーの宛先を指しているかを確認します。

Kubernetesクラスタ内のサイドカー以外のコレクターにテレメトリをエクスポートする場合、この値はコレクターサービスの名前を参照する必要があります。上記の例では、otel-collector
はコレクターKubernetesサービスの名前です。
さらに、コレクターが別のネームスペースで実行されている場合は、コレクターのサービス名にそれを追加する必要があります。たとえば、<namespace>.svc.cluster.local
(前の例では、ネームスペースはOpenTelemetry
です)。
テレメトリーをサイドカーコレクターにエクスポートする場合、exporter.endpointの値はhttp://localhost:4317(gRPC)またはhttp://localhost:4318(HTTP)になります。
最後に、正しいコレクターポートを使用していることを確認します。通常は、4317(gRPC)または4318(HTTP)のいずれかを選択できますが、Python自動インストゥルメンテーションではgRPCがサポートされていないため、4318のみを使用できます。使用している言語に同様の注意事項があるかどうかを確認してください。
まとめ
OpenTelemetry Operatorは、1つ以上のコレクターのデプロイメントと設定を管理し、Kubernetesポッドにゼロコードインストゥルメンテーションソリューションを挿入して設定します。これにより、OpenTelemetryインストゥルメンテーションを開始できるようになり、アプリケーションに手動インストゥルメンテーションを追加することでテレメトリーをさらに強化できます。
このブログ記事では、一般的なインストール障害から自動インストゥルメンテーションやコレクターのデプロイメントの問題解決まで、オペレーターの詳細について説明しました。詳細なインストール手順とトラブルシューティングのヒントにより、コレクターのデプロイメント、設定、管理、およびサポートされているライブラリの自動インストゥルメンテーションにオペレーターを効果的に活用できるようになります。
次のステップ
オペレーターをインストールしてその機能を活用する方法を理解したので、実際に試してみてください。Astro ShopのOpenTelemetryコミュニティデモアプリケーションのNew Relicフォークをデプロイし、オペレーターをインストールしてみましょう。あるいは、このリポジトリをクローンします。
以下のリソースも確認することをお勧めします。
- コレクターの詳細については、OpenTelemetryコレクターの詳細解説:重要な基本事項をご覧ください
- Helmを使用してAstro ShopのNew Relicフォークをデプロイする方法を学びます:New Relicで OpenTelemetryコミュニティデモアプリを実行
- OpenTelemetry Operatorの詳細については、AdrianaのOpenTelemetry Operator記事のコレクションをご覧ください
- オペレーターのトラブルシューティングの詳細は、公式のOTelドキュメントでご確認いただけます
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。