Kubernetesでアプリケーションを実行している開発者であれば、 New Relicを使用して、 KubernetesインフラストラクチャがOpenTelemetryインストゥルメントされたアプリケーションにどのように影響するかを理解できます。
以下の手順を完了すると、 New Relic UIを使用して、 OpenTelemetryのアプリケーション レベルのメトリックをKubernetesインフラストラクチャ メトリックと相関させることができます。 これにより、テレメトリデータの全体像を把握し、チーム間で連携して、 環境の問題の平均解決時間 (MTTR )Kubernetes を短縮できます。
データの相関関係
このドキュメントでは、アプリケーションがインフラストラクチャ固有のデータをテレメトリデータに挿入できるようにする手順について説明します。 その結果、New Relic UI に実用的な情報が表示されます。 開始するには、次の手順に従います。
- 各アプリケーションのコンテナで、テレメトリーデータをコレクターに送信するための環境変数を定義します。
- 関連するメタデータ (クラスタ、コンポーネント、ネームスペース名) を挿入するために、
resourcedetection
、resource
、batch
、およびk8sattributes
プロセッサを使用してOpenTelemetry Collector をDaemonSet
インエージェント モードとしてデプロイします。
あなたが始める前に
以下の手順を正常に完了するには、OpenTelemetry と Kubernetes についてすでに理解しており、次の操作を実行しておく必要があります。
次の環境変数を作成しました:
OTEL_EXPORTER_OTLP_ENDPOINT
詳細については、 New Relic OTLP エンドポイントを参照してください。NEW_RELIC_API_KEY
: 詳細については、 New Relic APIキーを参照してください。
クラスタにNew Relic Kubernetesインテグレーションをインストールしました。
アプリケーションが でインストゥルメントされ、OpenTelemetry New RelicOpenTelemetryProtocol (OTLP) 経由で にデータを正常に送信しました。
New Relicでのコレクターの使用に関する一般的な質問がある場合は、NewRelicでのOpenTelemetryコレクターの概要を参照してください。
テレメトリ データを OpenTelemetry Collector に送信するようにアプリケーションを構成する
これを設定するには、Kubernetes YAML ファイルのenv
セクションにカスタム スニペットを追加する必要があります。 以下の例は、サンプルのフロントエンド マイクロサービス ( Frontend.yaml
) のスニペットを示しています。 スニペットには、次の操作を実行する 2 つのセクションが含まれています。
- Section 1: テレメトリーデータがコレクターに送信されていることを確認します。 これにより、環境変数
OTEL_EXPORTER_OTLP_ENDPOINT
がホスト IP で設定されます。 これは、下位 API を呼び出してホスト IP を取得することによって行われます。 - Section 2: インフラストラクチャ固有のメタデータを添付します。 これを行うには、下向き API を使用して
metadata.uid
をキャプチャし、それをOTEL_RESOURCE_ATTRIBUTES
環境変数に追加します。 この環境変数は、 OpenTelemetryのresourcedetection
およびk8sattributes
プロセッサによって、テレメトリーデータにインフラストラクチャ固有の追加のコンテキストを追加するために使用されます。
OpenTelemetryでマイクロサービス インストゥルメントされた各場合、以下の強調表示された行をマニフェストの env
セクションに追加します。
# Frontend.yamlapiVersion: apps/v1kind: Deployment
# ...spec: containers: - name: yourfrontendservice image: yourfrontendservice-beta env: # Section 1: Ensure that telemetry data is sent to the collector - name: HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP # This is picked up by the opentelemetry sdks - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://$(HOST_IP):55680" # Section 2: Attach infrastructure-specific metadata # Get pod ip so that k8sattributes can tag resources - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_UID valueFrom: fieldRef: fieldPath: metadata.uid # This is picked up by the resource detector - name: OTEL_RESOURCE_ATTRIBUTES value: "service.instance.id=$(POD_NAME),k8s.pod.uid=$(POD_UID)"
OpenTelemetryコレクターをエージェントとして構成およびデプロイします
Kubernetes クラスター内のすべてのノードに コレクターをエージェントとして デプロイすることをお勧めします。エージェントはテレメトリ データを受信し、メタデータを使用してテレメトリ データを強化できます。たとえば、コレクタは、プロセッサを通じてカスタム属性やインフラストラクチャ情報を追加したり、バッチ処理、再試行、圧縮、およびクライアント インストルメンテーション レベルではあまり効率的に処理されない追加の高度な機能を処理したりできます。
コレクターの構成については、以下のサンプル コレクター構成ファイルと、これらのオプションの設定に関するセクションを参照してください。
receivers: otlp: protocols: grpc:
processors: batch: resource: attributes: - key: host.id from_attribute: host.name action: upsert resourcedetection: detectors: [gke, gce] k8sattributes: auth_type: "serviceAccount" passthrough: false filter: node_from_env_var: KUBE_NODE_NAME extract: metadata: - k8s.pod.name - k8s.pod.uid - k8s.deployment.name - k8s.cluster.name - k8s.namespace.name - k8s.node.name - k8s.pod.start_time pod_association: - from: resource_attribute name: k8s.pod.uid
exporters: otlp: endpoint: $OTEL_EXPORTER_OTLP_ENDPOINT headers: api-key: $NEW_RELIC_API_KEY logging: logLevel: DEBUG
service: pipelines: metrics: receivers: [otlp] processors: [resourcedetection, k8sattributes, resource, cumulativetodelta, batch] exporters: [otlp] traces: receivers: [otlp] processors: [resourcedetection, k8sattributes, resource, batch] exporters: [otlp] logs: receivers: [otlp] processors: [resourcedetection, k8sattributes, resource, batch] exporters: [otlp]
OpenTelemetryをエージェントとして構成してデプロイするには、次の手順に従います。
OTLPエクスポーターを構成する
まず、 OpenTelemetryコレクター設定YAMLファイルに、 New Relic をヘッダーとして含めたOTLPエクスポーターを追加します。
exporters:otlp: endpoint: $OTEL_EXPORTER_OTLP_ENDPOINT headers: api-key: $NEW_RELIC_API_KEY
バッチプロセッサを構成する
バッチ プロセッサは、スパン、メトリック、またはログを受け入れ、それらをバッチに配置します。 これにより、データの圧縮が容易になり、コレクターからの送信要求が削減されます。
processors:batch:
リソース検出プロセッサを構成する
resourcedetection
プロセッサは、ホスト固有の情報を取得して、コレクタを介して処理されているテレメトリデータにコンテキストを追加します。この例では、Google Kubernetes Engine(GKE)とGoogle Compute Engine(GCE)を使用して、次のようなGoogleCloud固有のメタデータを取得します。
cloud.provider
(「GCP」)cloud.platform
(「gcp_compute_engine
」)cloud.account.id
cloud.region
cloud.availability_zone
host.id
host.image.id
host.type
processors:resourcedetection:detectors: [gke, gce]
Kubernetes 属性プロセッサを構成する (一般)
エージェントとして実行される OpenTelemetry Collector の一部として k8sattributes
プロセッサを実行すると、テレメトリ データを OpenTelemetry Collector エージェントに送信するポッドの IP アドレスが検出され、ポッドのメタデータの抽出に使用されます。以下は、プロセッサ セクションのみを含む基本的な Kubernetes マニフェストの例です。OpenTelemetry Collector を DaemonSet
としてデプロイするには、この 包括的なマニフェストの例をお読みください。
processors:k8sattributes: auth_type: "serviceAccount" passthrough: false filter: node_from_env_var: KUBE_NODE_NAME extract: metadata: - k8s.pod.name - k8s.pod.uid - k8s.deployment.name - k8s.cluster.name - k8s.namespace.name - k8s.node.name - k8s.pod.start_time pod_association: - from: resource_attribute name: k8s.pod.uid
Kubernetes 属性プロセッサ (RBAC) を構成する
ロールベースアクセス制御 (RBAC) の設定を追加する必要があります。 k8sattributes
プロセッサには、構成されたフィルターに含まれるポッドおよびネームスペース リソースに対するget
、 watch
、およびlist
権限が必要です。 この例では、 ClusterRole
のロールベース アクセス制御 (RBAC) を構成して、 ServiceAccount
にクラスタ内のすべてのポッドとネームスペースに対する必要な権限を付与する方法を示します。
Kubernetes 属性プロセッサ (検出フィルター) を構成する
コレクターをエージェントとして実行する場合は、プロセッサが実行中のホストと同じホストからのポッドのみを検出するように、検出フィルターを適用する必要があります。 フィルターを使用しない場合、特に大規模なクラスターでは、リソースの使用量が不必要に高くなる可能性があります。 フィルターが適用されると、各プロセッサは自身のノードで実行されているポッドのみをKubernetes API照会します。
フィルターを設定するには、下向きAPIを使用して、 OpenTelemetryコレクター エージェント設定 YAML ファイルの pod env
セクションにノード名を環境変数として挿入します。 例を見るには、 GitHub をご覧ください。 これにより、OpenTelemetry コレクター エージェントのコンテナーに新しい環境変数が挿入されます。 値は、ポッドの実行がスケジュールされたノードの名前になります。
spec:containers: - env: - name: KUBE_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName
次に、 k8sattributes
のノードでフィルタリングできます。
k8sattributes:filter: node_from_env_var: KUBE_NODE_NAME
構成が機能していることを確認します
OpenTelemetryデータとKubernetesデータが正常にリンクされると、設定が機能していることを確認できるようになります。
- one.newrelic.com > All capabilities > APM & Servicesに移動し、 Services - OpenTelemetry内のアプリケーションを選択します。
- Monitor [モニター]セクションで、 Service map [サービス マップ]をクリックします。
- OpenTelemetry サービスとクラスター間の接続を確認します。 右側には、
k8s.cluster.name
、k8s.namespace.name
、k8s.deployment.name
などの Kubernetes 属性がタグとして表示されます。