ヘルプ APM Goエージェントを使用したAPMインサイト KubernetesでのGoアプリ監視
Site24x7 APMインサイトKubernetesは、extended Berkeley Packet Filter(eBPF)テクノロジーを用いて、Kubernetesクラスターで稼働するGoアプリケーションの自動監視を可能にします。このアプローチにより、アプリケーションコードの変更や言語固有のエージェントの挿入をすることなく、パフォーマンスを監視可能です。
このガイドでは、KubernetesにおけるGoアプリケーションのアーキテクチャ、コンポーネント、監視ワークフローについて説明します。
以下のアーキテクチャ図は、Kubernetesセットアップで監視がどのように機能するかの概要を示しています。

Goアプリケーションはアプリケーションポッド内で実行されます。専用のAPMインサイトエージェントポッドが、各ノード上のすべての監視タスクを処理します。このポッドはDaemonSetとしてデプロイされています。図に示されているコンポーネントを詳しく見ていきましょう。
APMインサイトGoエージェントは、システム全体のコントローラーおよびオーケストレーターとして機能します。ホストプロセス識別子(PID)と/host/procマウントを使用して、ノード上のすべてのポッドで実行中のGoプロセスを検出します。コマンドライン引数、環境変数、コンテナID、ポッドの関連付け、cgroupマッピングなどのメタデータを抽出します。
エージェントはユーザー定義のルールを適用し、インストルメントするアプリケーションを決定します。共有ホストパスからバイナリパスを解決し、eBPF uprobeアタッチメントに必要なInode番号または装置番号の安定性を確保します。さらに、ポッドの出現、再起動、終了に応じて、インストルメンタープロセスのライフサイクルを管理します。
インストルメンターはeBPFプログラムをカーネルにロードし、選択されたGo関数にuprobesをアタッチします。アプリケーションを変更したり、ライブラリをインジェクションしたりすることなく、関数呼び出し、戻り値、レイテンシ、エラー、実行パスをキャプチャします。また、位置独立実行ファイル(PIE)のシンボル解決、ランタイムオフセットマッピング、関数アドレス計算も実行します。最後に、軽量テレメトリイベントをリングバッファ経由でユーザー空間コレクターにストリーミングします。
S247DataExporterは、 eBPFイベントを標準的なOpenTelemetryスパンとメトリクスに変換します。ポッド名、名前空間、ノード、コンテナID、IPアドレス、ラベルなどのKubernetesメタデータでデータを拡充します。その後、エクスポーターはOpenTelemetryプロトコル(OTLP)を使用してテレメトリをSite24x7バックエンドに送信します。その際、バッチ処理、リトライロジック、バックプレッシャー管理を採用することで、信頼性の高い配信を実現します。
共有ホストパスボリューム(例:/var/lib/apm-binaries)は、アプリケーションバイナリをノードの実ファイルシステムに保存します。この設定により、ほとんどのコンテナランタイムでOverlayFSによって発生する不整合を回避し、安定したinode番号と装置番号が確保されます。エージェントポッドは、/proc、/sys/kernel/debug、/sys/fs/bpfなどのホストリソースにもアクセスして、プロセスを検出し、eBPFプログラムを管理します。アプリケーションポッドは共有ホストパスから直接バイナリを実行するため、エージェントがインストルメントしたバイナリがカーネルに正確に認識されます。
監視ワークフロー全体をまとめると、DaemonSetは各ノードで1つのエージェントポッドが実行され、クラスターへのノードの追加または削除に応じて自動的に調整されます。Goエージェントは実行中のプロセスを検出し、対象となるGoアプリケーションごとにインストルメンターを起動します。インストルメンターはeBPFプローブをアタッチして、パフォーマンスへの影響を最小限に抑えながらパフォーマンスデータを取得します。最後に、S247データエクスポーターはトレース、メトリクス、エラーなどのテレメトリをSite24x7バックエンドに転送し、可視化と分析を行います。
このアーキテクチャは完全にイベント駆動型で適応型であり、新しいポッドを自動的に検出し、ローリングアップデートまたは再起動中にプローブを再接続します。CI/CDパイプライン、アプリケーションイメージ、helmチャート、または起動スクリプトを変更する必要はありません。
Site24x7 APMインサイトKubernetesは、次のマネージドKubernetesプラットフォームでサポートされています。
| Kuberneteプラットフォーム | ノードOSとカーネルの要件 | 追加の考慮事項 |
|---|---|---|
| EKS(Amazon Elastic Kubernetesサービス) | Amazon Linux 2(カーネル5.10+) | - |
| GKE(Google Kubernetesエンジン) | Ubuntuまたはコンテナ最適化OS(カーネル5.10+) | eBPFプローブ接続にはホストPID(ホストプロセス名前空間へのアクセス)と特権モードが必要です。 |
| AKS(Azure Kubernetesサービス) | Ubuntu(カーネル5.10+) | Azure CNIまたはKubenetネットワークをサポートします。 |
デプロイする前に、プロバイダーのセキュリティポリシーで、適切なeBPFインストルメンテーションとプロセス検出に必要な特権ポッドとhostPathマウントが許可されていることを確認します。
KubernetesでGoアプリケーションをスムーズかつ確実に監視するには、次のベストプラクティスに従います。
1.なぜhostPathが必要なのでしょうか。エージェントはコンテナから直接バイナリにアクセスできないのでしょうか。
コンテナ化されたアプリケーションは、多くの場合OverlayFS上で実行されます。OverlayFSでは、バイナリが複数のファイルシステム層にまたがって保存されます。その結果、inode番号と装置番号に一貫性がなくなり、eBPF uprobeが関数に確実にアタッチできなくなります。
hostPathボリュームを使用すると、次のことが実現されます。
2.エージェントは装置上で実行されているすべてのGoプロセスを監視しますか。
いいえ。エージェントはマシン上のすべてのプロセスを検出しますが、GO_APPS(Goアプリケーション)環境変数に明示的にリストされているプロセスのみをインストルメントします。インストルメントは設定によって完全に制御されます。
3.エージェントはGoアプリケーションのバイナリを変更または改変しますか。
いいえ。エージェントは、カーネルレベルでランタイムプロセスにアタッチされたeBPFアップローブを使用して、実行時にアプリケーションをメモリ内にインストルメントします。ディスク上のアプリケーションバイナリは変更されません。
4.アプリケーションを再起動するとどうなりますか。
エージェントには、30秒ごとに実行されるオーケストレーターが含まれています。再起動(PIDの変更)が検出されると、自動的に以下の処理が実行されます。
5.異なるKubernetes名前空間で実行されているアプリケーションを監視できますか。
はい。DaemonSetはhostPIDで実行されます。trueに設定すると、名前空間に関係なく、ノード上のすべてのプロセスが可視化されます。GO_APPS設定に必要なプロセス名がすべて含まれていることを確認します。
6.eBPFベースのインストルメンテーションを使用する場合のオーバーヘッドはどれくらいですか。
eBPFインストルメンテーションは軽量かつ効率的に設計されており、システムパフォーマンスへの影響を最小限に抑えて監視します。
典型的なオーバーヘッド:
実際のオーバーヘッドは、アプリケーションの負荷とインストルメントされた関数の数によって異なります。
7.このソリューションはEKS、GKE、AKSでサポートされていますか。
はい、Site24x7 APMインサイトKubernetesは、プラットフォーム固有の要件がいくつかあるものの、マネージドKubernetesプラットフォーム3つすべてでサポートされています。
関連記事