ヘルプ APM Goエージェントを使用した APMインサイト KubernetesでGoアプリを監視する方法

KubernetesでGoアプリケーションを監視する方法

Kubernetes上のGoアプリケーションを監視することで、コードを変更することなくサービスのパフォーマンスを確認可能です。Site24x7 APM Goエージェントを使用すると、Goのルーティーン、トレース、データベースクエリを追跡可能です。このドキュメントでは、エージェントを導入し、最小限のオーバーヘッドで監視を開始する方法について説明します。

前提条件

監視ソリューションを展開する前に、次の前提条件が満たされていることを確認します。

  • Kubernetes:バージョン1.19以降
  • Linuxカーネル:バージョン5.8以降(eBPF CO-REサポートに必要)
  • kubectl:Kubernetesクラスターにアクセス可能になるよう構成
  • Site24x7アカウント:有効なAPMライセンスキーを持つアクティブなアカウント
  • Goアプリケーション:Go1.18以上を推奨
  • クラスター権限:DaemonSet、ClusterRoles、特権ポッドを作成する機能

アプリケーションポッド

アプリケーションポッドが適切に動作するために、いくつかの特定の要件を満たす必要があります。まず、ホストノード上に一意のパスを持つhostPathボリュームを作成する必要があります。次に、initContainerがコンテナイメージからこのhostPathにアプリケーションバイナリをコピーします。コピーされたバイナリには実行権限が必要です。

最後に、プライマリコンテナは、コンテナイメージ自体ではなく、hostPathボリュームからアプリケーションバイナリを直接実行する必要があります。この設定により、アプリケーションが必要に応じてホスト上でアクセスおよび実行可能になります。

APMエージェントDaemonSet

Site24x7 APMエージェントDaemonSetは次の要件を満たしている必要があります。

  • 特権アクセスまたはフル機能セット
  • runAsUser:0ルートとして実行
  • hostPID:ノードレベルのプロセス情報にアクセスする場合はtrue
  • 必須ボリュームマウントがすべて存在する
  • DaemonSetがすべてのノードにデプロイされている

アプリケーションデプロイメント構成

Step1:hostPathボリュームを構成する

eBPFアップローブに必要な安定したファイルメタデータ(装置番号とinode番号)を確保するには、hostPathボリュームが必須です。

volumes:
- name: app-files
  hostPath:
    path: /var/lib/apm-binaries/my-app
  type: DirectoryOrCreate

Step2:initContainerをコピーバイナリに追加する

このステップは必須です。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エージェントDaemonSet構成

APMエージェントでは、eBPFインストルメンテーションのために昇格された権限と特定のボリュームマウントが必要です。

Step1:特権アクセス

この手順は必須です。これにより、エージェントはすべてのプロセスを検出し、eBPFアップローブをそれらにアタッチ可能になります。

securityContext:
  runAsUser: 0
privileged: true

Step2:ホストPID名前空間

この手順は、ノード上で実行されているすべてのプロセスを検出し、PIDベースのアップローブ接続を有効にするために必要です。

hostPID: true

Step3:必須ボリュームマウント

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

KubernetesでGoアプリケーションをデプロイおよび監視する例

この例では、eBPFインストルメンテーションを使用して、既存のGoアプリケーションのデプロイメントをSite24x7 APMインサイトで動作するように更新する方法を示します。

Step1:既存のアプリケーションデプロイメントを更新する

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

主な設定ポイント

  • メインコンテナが起動する前に、initContainerを使用してアプリケーションバイナリをhostPathディレクトリにコピーします。
  • OverlayFSの外部で安定したinodeと装置メタデータを維持するために、バイナリをhostPathボリューム(たとえば、/var/lib/apm-binarie)に保存します。
  • 適切なコマンドを使用して、hostPathの場所からバイナリを直接実行するようにアプリケーションコンテナを構成します。
  • コピーされたバイナリが正常に実行されるように、initContainerが実行権限(chmod+x)を設定することを確認します。

Step2:構成リソースを作成する

このステップには、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アプリケーションを構成するための主要コンポーネントは次のとおりです。

  • AppName:Site24x7ダッシュボードに表示される名前です。
  • ProcessNameこれは、Goバイナリの正確な名前と一致する必要があります(例えば、my-go-appまたはserver)。
  • Port(s):アプリケーションがリッスンするポートです。複数のポートがある場合は、コンマ区切りのリストを使用します。
    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

例)

  • 単一のポートで実行される単一のアプリケーションの場合:
    MyApp=myapp:8080
  • 複数のポートで実行される単一のアプリケーションの場合:
    MyApp=myapp:8080,8443,9090
  • 異なるポートで実行されている複数のアプリケーションの場合:
    API=api:8080; Worker=worker:8081; Admin=admin:9000

Step3:Site24x7 APMエージェントDaemonSetの導入

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構成

  • hostPID:true—ノード上で実行されているすべてのプロセスの可視性を提供し、正確なポッド検出を可能にします。
  • privileged:true—eBPF操作にはカーネルの権限の昇格が必要なため必須です。
  • runAsUser:0—eBPF関連のシステムコールを正常に実行するためにエージェントをルートとして実行します。
  • /proc:/host/proc(hostPath)—プロセス検出、メタデータアクセス、名前空間解決を可能にします。
  • /sys/kernel/debug(hostPath)—eBPFデバッグ、プローブのロード、uprobe/kprobeアタッチメントの管理に必要です。
  • /sys/fs/bpf(hostPath)—マップとプログラムが固定されているBPFファイルシステムへのアクセスを提供します。
  • /var/lib/apm-binaries(hostPath)—ポッド間で安定したinodeと装置メタデータを確保するためのアプリケーションバイナリの共有ストレージです。 

Step4:デプロイと検証

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エージェントによって正常にインストルメントされ、監視されていることを確認します。

関連記事