ヘルプ APM Goエージェントを使用した APMインサイト KubernetesでGoアプリを監視する方法
Kubernetes上のGoアプリケーションを監視することで、コードを変更することなくサービスのパフォーマンスを確認可能です。Site24x7 APM Goエージェントを使用すると、Goのルーティーン、トレース、データベースクエリを追跡可能です。このドキュメントでは、エージェントを導入し、最小限のオーバーヘッドで監視を開始する方法について説明します。
監視ソリューションを展開する前に、次の前提条件が満たされていることを確認します。
アプリケーションポッドが適切に動作するために、いくつかの特定の要件を満たす必要があります。まず、ホストノード上に一意のパスを持つhostPathボリュームを作成する必要があります。次に、initContainerがコンテナイメージからこのhostPathにアプリケーションバイナリをコピーします。コピーされたバイナリには実行権限が必要です。
最後に、プライマリコンテナは、コンテナイメージ自体ではなく、hostPathボリュームからアプリケーションバイナリを直接実行する必要があります。この設定により、アプリケーションが必要に応じてホスト上でアクセスおよび実行可能になります。
Site24x7 APMエージェントDaemonSetは次の要件を満たしている必要があります。
eBPFアップローブに必要な安定したファイルメタデータ(装置番号とinode番号)を確保するには、hostPathボリュームが必須です。
volumes:
- name: app-files
hostPath:
path: /var/lib/apm-binaries/my-app
type: DirectoryOrCreate
このステップは必須です。initContainerは、メインコンテナが起動する前に、アプリケーションバイナリをhostPathにコピーします。これにより、コンテナオーバーレイレイヤーの外部からバイナリにアクセス可能になるため、eBPFはプロセスを確実にインストルメント可能です。
initContainers:
- name: copy-binary
image: your-app-image:latest
command: ["/bin/sh", "-c"]
args:
- |
mkdir -p /host/bin
cp /app/bin/my-app /host/bin/my-app
chmod +x /host/bin/my-app
volumeMounts:
- name: app-files
mountPath: /host
APMエージェントでは、eBPFインストルメンテーションのために昇格された権限と特定のボリュームマウントが必要です。
この手順は必須です。これにより、エージェントはすべてのプロセスを検出し、eBPFアップローブをそれらにアタッチ可能になります。
securityContext:
runAsUser: 0
privileged: true
この手順は、ノード上で実行されているすべてのプロセスを検出し、PIDベースのアップローブ接続を有効にするために必要です。
hostPID: true
DaemonSetはホストから次のディレクトリをマウントする必要があります。
| マウントパス | 目的 |
| /host/proc | プロセス情報とメタデータへのアクセスを提供します。 |
| /sys/kernel/debug | アップローブインターフェースとカーネルデバッグにアクセスするために必要です。 |
| /sys/fs/bpf | eBPFマップとプログラムを保存するために使用されます。 |
|
/sys |
cgroupとコンテナ境界の検出を可能にします。 |
| /var/lib/apm-binaries | 共有アプリケーションバイナリへのアクセスを提供します。 |
volumeMounts:
- name: host-proc # Process visibility
mountPath: /host/proc
- name: sys-kernel-debug # Uprobe interface
mountPath: /sys/kernel/debug
- name: sys-fs-bpf # eBPF map/program pinning
mountPath: /sys/fs/bpf
- name: sys # Cgroup & namespace discovery
mountPath: /sys
- name: shared-app-binaries # Shared hostPath binaries
mountPath: /var/lib/apm-binaries
この例では、eBPFインストルメンテーションを使用して、既存のGoアプリケーションのデプロイメントをSite24x7 APMインサイトで動作するように更新する方法を示します。
Goアプリケーションの監視を有効にするには、まず既存のアプリケーションデプロイメントを更新します。メインコンテナが起動する前に、initContainerを使用してGoバイナリをノード上のhostPathボリュームにコピーします。このhostPathボリュームは、ノード上の共有ディレクトリ(/var/lib/apm-binariesなど)として機能します。
最後に、このhostPathの場所からGoバイナリを直接実行するようにメインコンテナを構成し、アプリケーションがホストからバイナリを実行するようにします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-go-app
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: my-go-app
template:
metadata:
labels:
app: my-go-app
spec:
# InitContainer: Copy binary to hostPath
initContainers:
- name: copy-binary-to-host
image: your-registry/my-go-app:latest
imagePullPolicy: Always
command: ["/bin/sh", "-c"]
args:
- |
echo "Copying binary to hostPath for eBPF instrumentation..."
# Create directory structure on host
mkdir -p /host-binaries/bin
mkdir -p /host-binaries/conf
mkdir -p /host-binaries/logs
# Copy binary with execute permissions
cp /app/bin/my-go-app /host-binaries/bin/my-go-app
chmod +x /host-binaries/bin/my-go-app
# Copy config files if they exist
if [ -d "/app/conf" ]; then
cp -r /app/conf/* /host-binaries/conf/ 2>/dev/null || true
fi
echo "Binary copy complete"
ls -lh /host-binaries/bin/my-go-app
volumeMounts:
- name: app-files
mountPath: /host-binaries
containers:
- name: my-go-app
image: your-registry/my-go-app:latest
imagePullPolicy: Always
# IMPORTANT: Override command to run from hostPath
command: ["/app/bin/my-go-app"]
ports:
- containerPort: 8080
name: http
# Mount the same hostPath volume
volumeMounts:
- name: app-files
mountPath: /app
env:
- name: APP_PORT
value: "8080"
# ... other env vars
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
volumes:
# hostPath volume - CRITICAL for eBPF compatibility
- name: app-files
hostPath:
path: /var/lib/apm-binaries # Shared directory on node
type: DirectoryOrCreate
主な設定ポイント
このステップには、Goアプリケーションを監視するために必要なKubernetesリソースを設定するための3つのサブタスクが含まれています。
2.1 監視用の名前空間を作成する
監視用の名前空間を作成するには、以下に示すように、名前空間名と関連ラベルを含む apiVersion、種類、メタデータを含むYAMLファイルを定義します。
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
labels:
name: monitoring
purpose: apm-infrastructure
次のコマンドを実行して名前空間を適用します。
kubectl apply -f monitoring-namespace.yaml
2.2 ライセンスキーのシークレットを作成する
Site24x7ライセンスキーのシークレットを作成するには、次のコマンドを使用し、your_actual_license_key_hereを実際のライセンスキーに置き換えます。
# Replace with your actual Site24x7 license key
kubectl create secret generic apm-license-key \
--from-literal=license-key='your_actual_license_key_here' \
-n monitoring
シークレットを作成したら、次のコマンドを実行して、監視名前空間にシークレットが表示され、シークレットが正常に作成されたことを確認します。
kubectl get secret apm-license-key -n monitoring
2.3 アプリケーション構成用のConfigMapを作成する
GO_APPS環境変数は、エージェントが監視するGoアプリケーションを指定します。これを設定するには、以下の形式とコンポーネントを使用して、アプリケーションとその正確なプロセス名、およびリッスンするポートをリストするConfigMapを作成します。
形式
AppName=ProcessName:Port1、Port2、Port3;別のApp=ProcessName:Port;
コンポーネント
Goアプリケーションを構成するための主要コンポーネントは次のとおりです。
apiVersion: v1
kind: ConfigMap
metadata:
name: apm-apps-config
namespace: monitoring
data:
# Single application with one port
go_apps: "MyGoApp=my-go-app:8080"
# Multiple applications
# go_apps: "WebAPI=webapi:8080,8443;AdminAPI=adminapi:9000;Worker=worker:8081"
# Application with multiple ports
# go_apps: "MyComplexApp=myapp:8080,8443,9090,50051"
次のコマンドを実行してConfigMapを適用します。
kubectl apply -f apm-apps-config.yaml
例)
3.1 DaemonSetの作成
Site24x7 APMエージェントをクラスター内のすべてのノードに展開するには、エージェントがすべてのノードで実行されるようにDaemonSetを作成します。DaemonSetの設定には、Goアプリケーションの監視に必要な権限、hostPathマウント、環境変数が含まれます。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: exporter-agent
namespace: monitoring
labels:
app: exporter-agent
component: monitoring
spec:
selector:
matchLabels:
app: exporter-agent
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: exporter-agent
component: monitoring
spec:
serviceAccountName: exporter-agent-sa
# CRITICAL: Host namespaces for eBPF monitoring
hostPID: true # REQUIRED: See all processes on node
containers:
- name: exporter-agent
image: site24x7/apminsight-go-agent:latest
imagePullPolicy: IfNotPresent
# Environment variables from Secret and ConfigMap
env:
- name: S247_LICENSE_KEY
valueFrom:
secretKeyRef:
name: apm-license-key
key: license-key
- name: GO_APPS
valueFrom:
configMapKeyRef:
name: apm-apps-config
key: go_apps
# CRITICAL: Security context with elevated privileges
securityContext:
runAsUser: 0 # Must run as root
privileged: true # REQUIRED for eBPF
# Resource limits
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1000m
memory: 1Gi
# CRITICAL: Volume mounts for eBPF access
volumeMounts:
# Host process information
- name: host-proc
mountPath: /host/proc
readOnly: true
# Kernel debug filesystem for eBPF
- name: sys-kernel-debug
mountPath: /sys/kernel/debug
readOnly: false
# BPF filesystem
- name: sys-fs-bpf
mountPath: /sys/fs/bpf
readOnly: false
# System filesystem (for cgroup detection)
- name: sys
mountPath: /sys
readOnly: false
# CRITICAL: Shared binaries from hostPath
- name: shared-app-binaries
mountPath: /var/lib/apm-binaries
readOnly: true
# CRITICAL: Volumes for eBPF and binary access
volumes:
- name: host-proc
hostPath:
path: /proc
type: Directory
- name: sys-kernel-debug
hostPath:
path: /sys/kernel/debug
type: Directory
- name: sys-fs-bpf
hostPath:
path: /sys/fs/bpf
type: DirectoryOrCreate
- name: sys
hostPath:
path: /sys
type: Directory
# CRITICAL: Same hostPath as application pods
- name: shared-app-binaries
hostPath:
path: /var/lib/apm-binaries
type: DirectoryOrCreate
主なDaemonSet構成
4.1 すべてのリソースを適用する
まず、名前空間YAMLファイルを適用して監視名前空間を作成します。
kubectl apply -f monitoring-namespace.yaml
次に、Site24x7ライセンスキーのシークレットを作成し、アプリケーション構成用のConfigMapを適用します。
kubectl create secret generic apm-license-key \
--from-literal=license-key='YOUR_SITE24X7_LICENSE_KEY' \
-n monitoring
kubectl apply -f apm-apps-config.yaml
次に、Site24x7 APMエージェントDaemonSetをデプロイします。
kubectl apply -f exporter-agent-daemonset.yaml
最後に、更新されたデプロイメントYAMLを使用してGoアプリケーションをデプロイします。
kubectl apply -f my-app-deployment.yaml
4.2 DaemonSetのデプロイメントを確認する
DaemonSetのステータスをチェックし、すべてのノードで実行されていることを確認するには、次のコマンドを実行します。
kubectl get daemonset -n monitoring
次に、各ノードでポッドが実行されていることを確認します。
kubectl get pods -n monitoring -l app=exporter-agent -o wide
DaemonSetポッドのログを表示して、エラーや問題がないかを確認することも可能です。
kubectl logs -n monitoring -l app=exporter-agent --tail=100 -f
4.3 eBPFインストルメンテーションの検証
eBPFプローブが正しくロードされていることを確認するには、インストルメンターのログを確認します。
kubectl exec -n monitoring exporter-agent-xxxxx -- \
ls -lt /opt/site24x7/apm-insight-go-agent/instrumentor/logs/
インストルメンターの出力を表示して、どのプローブがロードされているか、テレメトリがエクスポートされているかどうかを確認可能です。
kubectl exec -n monitoring exporter-agent-xxxxx -- \
tail -f /opt/site24x7/apm-insight-go-agent/instrumentor/logs/MyGoApp-k8s-*/agent.txt
期待される出力:
Probe loaded successfully: net/http/client
Probe loaded successfully: database/sql/client
Exporting 10 spans to the server
この出力は、GoアプリケーションがSite24x7 APM Goエージェントによって正常にインストルメントされ、監視されていることを確認します。
関連記事