• ログイン今すぐ開始

本書は、お客様のご参考のために原文の英語版を機械翻訳したものです。

英語版と齟齬がある場合、英語版の定めが優先するものとします。より詳しい情報については、本リンクをご参照ください。

問題を作成する

OpenTelemetryをインストルメント化したアプリケーションをKubernetesにリンクする

Kubernetesでアプリを実行している開発者の場合は、New Relicを使用して、KubernetesインフラストラクチャがOpenTelemetryが計測されたアプリケーションにどのように影響するかを理解できます。

以下の手順を完了すると、New Relic UIを使用して、OpenTelemetryのアプリケーションレベルの指標をKubernetesインフラストラクチャの指標と関連付けることができます。これにより、テレメトリデータの全体像を確認し、チーム間で作業して、Kubernetes環境の問題の平均解決時間(MTTR)を短縮できます。

概要:データをどのように関連付けるか

このガイドの手順により、アプリケーションはインフラストラクチャ固有のメタデータをテレメトリデータに挿入できます。その結果、NewRelicUIに実用的な情報が入力されます。これを実行するために実行する手順は次のとおりです。

  • 各アプリケーションコンテナで、テレメトリデータをコレクタに送信するための環境変数を定義します
  • OpenTelemetryコレクターをエージェントモードDaemonSetとしてデプロイし、 resourcedetectionresourcebatch 、およびk8sattributesプロセッサーを使用して、関連するメタデータ(クラスター、デプロイメント、および名前空間の名前)を挿入します。

前提条件

以下の手順を成功させるには、OpenTelemetryとKubernetesに精通しており、次のことを行っている必要があります。

New Relicでのコレクターの使用に関する一般的な質問がある場合は、NewRelicでのOpenTelemetryコレクターの概要を参照してください。

テレメトリデータをOpenTelemetryコレクターに送信するようにアプリケーションを構成します

これを設定するには、KubernetesYAMLファイルのenvスタンザにカスタムスニペットを追加する必要があります。以下に、サンプルのフロントエンドマイクロサービス( Frontend.yaml )のスニペットを示す例を示します。スニペットには、次の2つのセクションが含まれています。

  • セクション1:テレメトリデータがコレクターに送信されていることを確認します。これにより、環境変数OTEL_EXPORTER_OTLP_ENDPOINTにホストIPが設定されます。これは、ダウンワードAPIを呼び出してホストIPをプルすることによって行われます。
  • セクション2:インフラストラクチャ固有のメタデータを添付します。これを行うには、下位APIを使用してmetadata.uidをキャプチャし、それをOTEL_RESOURCE_ATTRIBUTES環境変数に追加します。この環境変数は、OpenTelemetryコレクターのresourcedetectionおよびk8sattributesプロセッサーによって使用され、テレメトリデータにインフラストラクチャ固有のコンテキストを追加します。

OpenTelemetryを備えたマイクロサービスごとに、以下の強調表示された行をマニフェストのenvスタンザに追加します。

# Frontend.yaml
apiVersion: apps/v1
kind: 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 ]

ステップ1:OTLPエクスポーターを構成する

まず、OTLPエクスポーターをOpenTelemetryコレクター構成のYAMLファイルに追加し、ヘッダーとしてNew Relic APIキー(取り込みライセンスキー)を追加して構成します。

exporters:
otlp:
endpoint: $OTEL_EXPORTER_OTLP_ENDPOINT
headers: api-key: $NEW_RELIC_API_KEY

ステップ2:バッチプロセッサを構成する

バッチプロセッサは、スパン、メトリック、またはログを受け入れ、それらをバッチに配置して、データの圧縮を容易にし、コレクタからの送信要求の数を減らします。

processors:
batch:

手順3:リソース検出プロセッサを構成する

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 ]

手順4:Kubernetes属性プロセッサを設定する(一般)

エージェントとして実行されているOpenTelemetryコレクターの一部としてk8sattributesプロセッサーを実行すると、テレメトリデータをOpenTelemetryコレクターエージェントに送信しているポッドのIPアドレスを検出し、それらを使用してポッドメタデータを抽出します。以下は、プロセッサセクションのみを使用した基本的なKubernetesマニフェストの例です。 OpenTelemetryコレクターを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

手順5:Kubernetes属性プロセッサ(RBAC)を設定する

ロールベースのアクセス制御(RBAC)の構成を追加する必要があります。 k8sattributesプロセッサには、構成されたフィルターに含まれるポッドと名前空間リソースに対するgetwatch 、およびlistのアクセス許可が必要です。クラスター内のすべてのポッドと名前空間に必要なアクセス許可をServiceAccountに与えるために、 ClusterRoleの役割ベースのアクセス制御(RBAC)を構成する方法のこのを参照してください。

手順6:Kubernetes属性プロセッサを設定する(検出フィルタ)

コレクターをエージェントとして実行する場合は、プロセッサーが実行しているのと同じホストからのみポッドを検出するように、検出フィルターを適用する必要があります。フィルタを使用しない場合、特に非常に大規模なクラスタでは、リソースの使用量が不必要に高くなる可能性があります。フィルタが適用されると、各プロセッサは、独自のノードで実行されているポッドについてのみKubernetesAPIにクエリを実行します。

フィルタを設定するには、下向きAPIを使用して、OpenTelemetryコレクターエージェント構成YAMLファイルのポッド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データに正常にリンクすると、分散トレースUI内のスパンにk8s.cluster.namek8s.deployment.nameなどのKubernetes属性が表示されるはずです。

クリックして画像を拡大します。

次は何ですか?

OpenTelemetryをインストルメント化したアプリをKubernetesに接続したので、OpenTelemetryとNewRelicの使用を改善するためのヒントについてのベストプラクティスガイドを確認してください。

Copyright © 2022 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.