侵入することなく Kubernetes に OpenTelemetry プローブをインストールする方法を学びましたか?

侵入することなく Kubernetes に OpenTelemetry プローブをインストールする方法を学びましたか?

背景

OpenTelemetry プローブ

OpenTelemetry (略して Otel、最新バージョンは 1.27) は、テレメトリ データ (メトリック、ログ、トレース情報など) を収集、処理、エクスポートするための一連のツール、API、SDK を提供する、可観測性のオープン ソース プロジェクトです。アプリケーション テレメトリ データ (トレース、メトリック、ログなど) の収集はプローブを通じて行われます。プローブは通常、ライブラリの形式でアプリケーションに統合され、監視とデバッグを支援するために重要な情報を自動的にキャプチャします。 OpenTelemetry プローブは、市場のほとんどのプログラミング言語をサポートしています。プローブ(通常は計装と呼ばれます)の設置は、手動と自動の方法に分けられます。

  • 手動インストルメンテーション: 開発者がテレメトリ データ収集コードをアプリケーション コードに直接明示的に追加することを指します。 SDK の初期化、トラッキング ポイントの挿入、コンテキスト情報の追加などの一連の操作を手動で完了する必要があります。
  • 自動インストルメンテーション: OpenTelemetry を活用して、コードをほとんどまたはまったく変更せずにアプリケーションのテレメトリ データを自動的にキャプチャするライブラリを提供します。例えば、Javaは`javaagent` [1]を通じてプローブの自動インストールを実装しています。

どちらにも長所と短所があります。手動計測は、テレメトリ データ収集に対する高度なカスタマイズと正確な制御が必要なシナリオに適しています。自動インストルメンテーションは、特に標準フレームワークとライブラリを使用するアプリケーションで、迅速な起動と簡素化された統合に適しています。

OpenTelemetry Operator の紹介

OpenTelemetry Operator[2]は、Kubernetes環境でのOpenTelemetryコンポーネントの導入と管理を簡素化するために設計されたKubernetes Operatorです。

OpenTelemetry Operatorは、CRD(OpenTelemetryCollector[3]、Instrumentation[4]、OpAMPBridge[5])を通じてKubernetesクラスターにOpenTelemetry Collectorを自動的にデプロイし、管理します。ワークロードに OpenTelemetry プローブを自動的にインストールします。

今日は、OpenTelemetry Operator を使用してプローブを自動的にインストールし、リンク トラッキングを実装する方法を体験します。

デモ

建築

これはデモ用のアーキテクチャです。 Otelは複数の言語で計測SDKを提供しています[6]。この記事では、Java と Go のアプリケーションを使用します。これら 2 つの言語では、完全自動および半自動の注入インストールが使用されます。

  • Java は完全に自動的に挿入され、インストールされます。 Otel Operator は、init コンテナを使用して SDK を導入し、JAVA_TOOL_OPTIONS を通じてスタブ用の javaagent を指定します。ここでは、pinakispecial/spring-boot-rest イメージを使用して、シンプルな Spring Boot REST サービスを実行します。
  • 半自動注入取り付けですが、なぜ半自動なのでしょうか? Go の完全な自動化は、eBPF を通じて実現されます。つまり、独立したコンテナを Pod に挿入し、BPF プログラムをロードします。ただし、eBPF の実装にはカーネル 5.4 - 5.14 に対する非常に厳しい要件があります。ここでは、GoインストルメンテーションSDK[7]を手動でインポートし、構成を自動的に挿入する[8]という半自動アプローチを紹介します。

写真

イェーガー

デモンストレーションのため、jaegertracing/all-in-one イメージを使用して Jaeger をデプロイします。このイメージには、Jaeger コレクター、メモリ ストレージ、クエリ サービス、UI などのコンポーネントが含まれており、開発とテストに非常に適しています。

OTLP(OpenTelemetry Protocol)[9]のサポートは環境変数COLLECTOR_OTLP_ENABLEDによって有効になり、OTELは8にあります。

 kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: jaeger spec: replicas: 1 selector: matchLabels: app: jaeger template: metadata: labels: app: jaeger spec: containers: - name: jaeger image: jaegertracing/all-in-one:latest env: - name: COLLECTOR_OTLP_ENABLED value: "true" ports: - containerPort: 16686 - containerPort: 14268 --- apiVersion: v1 kind: Service metadata: name: jaeger spec: selector: app: jaeger type: ClusterIP ports: - name: ui port: 16686 targetPort: 16686 - name: collector port: 14268 targetPort: 14268 - name: http protocol: TCP port: 4318 targetPort: 4318 - name: grpc protocol: TCP port: 4317 targetPort: 4317 EOF

cert-managerをインストールする

Otel Operator は証明書管理に cert-manager に依存しています。オペレーターをインストールする前に、cert-manager をインストールする必要があります。

 kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

OpenTelemetry Operatorのインストール

Otel Operatorをインストールするには、次のコマンドを実行します。

 kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

OpenTelemetry Collector を構成する

CR OpenTelemetryCollector を作成して、Otel のコレクターを構成します。ここで設定するのは次の通りです:

  • otel レシーバー: grpc (ポート 4317) と http (ポート 4318) をサポート
  • memory_limiter と batch プロセッサがありますが、データをすばやく表示できるようにするために、これら 2 つは有効になっておらず、デモンストレーションにのみ使用されます。
  • debug および otlp/jaeger エクスポーターは、それぞれ標準出力に情報を印刷し、otlp プロトコルを使用して Jaeger に出力するために使用されます。
  • パイプライン サービスは、トレース データの処理フロー (受信、処理、出力) を構成するために使用されます。
 kubectl apply -f - <<EOF apiVersion: opentelemetry.io/v1alpha1 kind: OpenTelemetryCollector metadata: name: otel spec: config: | receivers: otlp: protocols: grpc: http: processors: memory_limiter: check_interval: 1s limit_percentage: 75 spike_limit_percentage: 15 batch: send_batch_size: 10000 timeout: 10s exporters: debug: otlp/jaeger: endpoint: "jaeger.default:4317" tls: insecure: true service: pipelines: traces: receivers: [otlp] processors: [] exporters: [debug,otlp/jaeger] EOF

CR OpenTelemetryCollector を作成した後、Otel Operator はデプロイメントと複数のサービスを作成します。

 kubectl get deployment,service -l app.kubernetes.io/compnotallow=opentelemetry-collector NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/otel-collector 1/1 1 1 12h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/otel-collector ClusterIP 10.43.152.81 <none> 4317/TCP,4318/TCP,8889/TCP,9411/TCP 12h service/otel-collector-headless ClusterIP None <none> 4317/TCP,4318/TCP,8889/TCP,9411/TCP 12h service/otel-collector-monitoring ClusterIP 10.43.115.103 <none> 8888/TCP 12h

コレクターのデプロイメントには、デプロイメント、デーモンセット、ステートフルセット、サイドカーの4つのデプロイメントモデル[10]があります。デフォルトはデプロイメントです。

計測の設定

Instrumentation は、Otel プローブのインストールと構成を自動化する Otel Operator の別の CRD です。

  • プロパゲータは、トレース情報がコンテキスト内でどのように渡されるかを構成するために使用されます。
  • サンプラー
  • env および [language].env 環境変数がコンテナに追加されました

詳細な設定手順については、Instrumentation APIドキュメント[11]を参照してください。

 kubectl apply -f - <<EOF apiVersion: opentelemetry.io/v1alpha1 kind: Instrumentation metadata: name: instrumentation-sample spec: propagators: - tracecontext - baggage - b3 sampler: type: parentbased_traceidratio argument: "1" env: - name: OTEL_EXPORTER_OTLP_ENDPOINT value: otel-collector.default:4318 java: env: - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://otel-collector.default:4317 EOF

Java サンプル アプリケーション

正しいプローブを挿入できるように、Otel Operator にアプリケーション タイプを通知するには、Pod に instruments.opentelemetry.io/inject-java: "true" という注釈を付けます。

 kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: java-sample spec: replicas: 1 selector: matchLabels: app: java-sample template: metadata: labels: app: java-sample annotations: instrumentation.opentelemetry.io/inject-java: "true" spec: containers: - name: java-sample image: pinakispecial/spring-boot-rest ports: - containerPort: 8080 EOF

Otel Operator が otel 初期化コンテナを Pod に挿入していることがわかります。

写真

そして、一連の環境変数が構成のために Java コンテナに挿入されます。

写真

Go サンプル アプリケーション

前述のGo言語の自動インジェクションのデモは半自動方式を採用しており、本記事のタイトルと矛盾しており埋め込みます。私はOtelプローブを手動でインストールするシンプルなGoアプリケーション[12]を作成しました。ご興味がございましたら、ソースコードをご覧頂けます。

 kubectl apply -f https://raw.githubusercontent.com/addozhang/http-sample/main/manifests/service-v1.yaml

Pod を表示すると、環境変数を通じて注入された Otel 構成も確認できます。

テスト

pod_name="$(kubectl get pod -n default -l app=service-a -o jsnotallow='{.items[0].metadata.name}')" kubectl port-forward $pod_name 8080:8080 & curl localhost:8080 service-a(version: v1, ip: 10.42.0.68, hostname: service-a-5bf98748f5-l9pjw) -> service-b(version: v1, ip: 10.42.0.70, hostname: service-b-676c56fb98-rjbwv) -> service-c(version: v1, ip: 10.42.0.69, hostname: service-c-79985dc75d-bh68k)

Jaeger UI を開きます。

 jaeger_pod="$(kubectl get pod -l app=jaeger -o jsnotallow='{.items[0].metadata.name}')" kubectl port-forward $jaeger_pod 16686:16686 &

ビンゴ!

アクセス リンク情報を確認するには、Jaeger UI にアクセスしてください。

写真

参考文献

[1] Javaはjavaagentを通じてプローブの自動インストールを実装しています: https://opentelemetry.io/docs/instrumentation/java/automatic/

[2] OpenTelemetryオペレーター: https://opentelemetry.io/docs/kubernetes/operator/

[3] OpenTelemetryCollector: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opentelemetrycollector

[4] インストルメンテーション: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation

[5] OpAMPBridge: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#opampbridge

[6] 複数言語でのインストルメンテーションSDK: https://opentelemetry.io/docs/instrumentation/

[7] GoインストルメンテーションSDKを手動でインポートする: https://github.com/addozhang/http-sample/blob/main/otel.go

[8] 自動注入設定: https://github.com/open-telemetry/opentelemetry-operator/blob/main/README.md#opentelemetry-auto-instrumentation-injection

[9] OTLP(オープンテレメトリープロトコル): https://opentelemetry.io/docs/specs/otlp/

[10] コレクターデプロイメントの4つのデプロイメントモード: https://github.com/open-telemetry/opentelemetry-operator#deployment-modes

[11] インストルメンテーションAPIドキュメント: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation

[12] シンプルなGoアプリケーション: https://github.com/addozhang/http-sample

<<:  クラウド移行に関する注意事項 |企業のスムーズなクラウド移行を実現するためのコンピューティングパワーインフラストラクチャを理解するための図

>>:  オペレーション兄弟!なぜ Kafka は再び「タイムアウト」したのでしょうか?

推薦する

extravm: 初月 30% オフ/更新 30% オフ、米国 VPS は月額 1.65 ドルから、AMD Ryzen 高性能 VPS、無制限のトラフィック、100G の高防御保護

現在、extravmではアメリカ中部のダラスデータセンターのVPSを対象に初月30%オフ/更新30%...

12306人のユーザーデータが大量に漏洩

12月25日、国内の脆弱性報告プラットフォームであるWuyunの公式サイトは、ユーザーアカウント、プ...

教育用分類情報ウェブサイトを促進するための代替思考

この記事は、黄家朗による教育インターネット マーケティング シリーズの 2 回目です。分類情報 We...

SEOにおける記事タイトルとページ説明の役割

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今日、Xi...

SAP Concur: 2019 年の出張・経費管理で注目すべき 6 つのポイント

グローバル化とデジタル化が経済発展のキーワードとなっている現在、中国企業は国内外の急速に変化する市場...

buyvm: ロック解除されたストリーミング VPS を販売中。Netflix\Tiktok、Disneyplus\HBO\HULU\FOX など、米国とカナダの多数のストリーミング メディアに対応

buyvm は、複数のストリーミング メディアのロックを解除し、通常は厳しい IP 要件を持つ多くの...

ダンダンの14年間の電子商取引の盛衰の歴史:利益と損失の両方を伴う凸凹の道

1999年に設立されたDangdang.comは、14年間の電子商取引のキャリアの中で浮き沈みを経験...

SEO 関連性分析の観点から、Google は Twitter に影響を与えているのでしょうか、あるいはその逆でしょうか?

SEO 実践者が追いかけ、ウェッジホッピングし、調査し、疑問に思い、そして迷っていることの 1 つは...

現状のSEO学習:鍵を握ることが重要

SEO 業界に不慣れな人にとって、SEO を学ぶ方法を知ることは重要な問題です。 SEO を学ぶには...

ついにハイパーコンバージェンスとエッジコンピューティングとは何かが明らかになった。

近年、中国ではハイパーコンバージェンスが急速に成長しています。 IDCが発表した最新のレポートによる...

ウェブサイトの最適化: 考え方を変えて、質の高いトラフィックを獲得する方法を学びましょう

営業に携わることが多い従業員は、顧客の認知度を高めて注文を迅速に獲得するためには、製品の機能や用途、...

上海警察は、最大300万ドル相当の省をまたいだオンライン詐欺事件を摘発した。

上海警察は8日、青浦市公安局が綿密な捜査を経て省市をまたぐインターネット詐欺事件を摘発し、機械設備販...

マーケティング上のヒット作「華熙子」が「李佳奇ら」から離れたらどうなるのか?

国産化粧品が今流行っています。最も有名な「パーフェクトダイアリー」のほかに、もう一つ好調なブランドが...