帮助手册

如何在 Kubernetes 中监控 Go 应用程序

在 Kubernetes 中监控 Go 应用程序,可让您无需修改代码即可了解服务的运行状况。借助 Site24x7 APM Go 代理,您可以追踪 Go 协程、追踪记录和数据库查询。本文档将指导您以最小开销完成代理部署并开始监控。

前提条件

在部署监控解决方案之前,请确保满足以下前提条件:

  • Kubernetes:1.19 或更高版本
  • Linux 内核:5.8 或更高版本,eBPF CO-RE 支持所需
  • kubectl:已配置为访问您的 Kubernetes 集群
  • Site24x7 账户:具有有效 APM 许可证密钥的活跃账户
  • Go 应用程序:建议使用 Go 1.18 或更高版本
  • 集群权限:能够创建 DaemonSet、ClusterRole 和特权 Pod

应用程序 Pod

您的应用程序 Pod 必须满足几项特定要求才能确保正常运行。首先,需要在主机节点上创建具有唯一路径的 hostPath 卷。其次,initContainer 应将应用程序二进制文件从容器镜像复制到此 hostPath 中。复制的二进制文件必须具有可执行权限。 

最后,主容器应直接从 hostPath 卷运行应用程序二进制文件,而不是从容器镜像内部运行。此设置确保应用程序可在主机上按需访问和执行。

APM 代理 DaemonSet

Site24x7 APM 代理 DaemonSet 应满足以下要求:

  • 特权访问或完整能力集
  • runAsUser: 0,以 root 身份执行
  • hostPID: true,用于访问节点级进程信息
  • 所有必需的卷挂载均已存在
  • DaemonSet 已部署到每个节点

应用程序部署配置

步骤 1:配置 hostPath 卷

hostPath 卷是确保 eBPF uprobes 所需的稳定文件元数据(设备号和 inode 号)的必要条件。

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

步骤 2:添加 initContainer 以复制二进制文件

此步骤为必须操作。initContainer 在主容器启动之前将应用程序二进制文件复制到 hostPath。这确保二进制文件可在容器 overlay 层之外访问,从而允许 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 插桩。

步骤 1:特权访问

此步骤为必须操作。这允许代理发现所有进程并为其附加 eBPF uprobes。

securityContext:
  runAsUser: 0
privileged: true

步骤 2:主机 PID 命名空间

此步骤用于发现节点上运行的所有进程,并启用基于 PID 的 uprobe 附加功能。

hostPID: true

步骤 3:必需的卷挂载

DaemonSet 必须从主机挂载以下目录:

挂载路径 用途
/host/proc 提供对进程信息和元数据的访问
/sys/kernel/debug 访问 uprobe 接口和内核调试所需
/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 应用程序示例

此示例演示如何更新现有 Go 应用程序部署,以使用 eBPF 插桩与 Site24x7 APM Insight 配合工作。

步骤 1:更新现有应用程序部署

要启用 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 目录。
  • 将二进制文件存储在 hostPath 卷中(例如 /var/lib/apm-binaries),以确保 OverlayFS 外部的稳定 inode 和设备元数据。
  • 配置应用程序容器使用适当命令直接从 hostPath 位置运行二进制文件。
  • 确保 initContainer 在复制的二进制文件上设置可执行权限(chmod +x),使其能够成功运行。

步骤 2:创建配置资源

此步骤包含三个子任务,用于设置监控 Go 应用程序所需的 Kubernetes 资源。

2.1 创建监控命名空间

如需创建监控命名空间,请按照如下所示定义一个包含 apiVersion、kind 和 metadata(含命名空间名称和相关标签)的 YAML 文件。

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
  labels:
    name: monitoring
  purpose: apm-infrastructure

运行以下命令应用该命名空间:

kubectl apply -f monitoring-namespace.yaml

2.2 创建许可证密钥的 Secret

如需为您的 Site24x7 许可证密钥创建 Secret,请使用以下命令,将 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

创建 Secret 后,运行以下命令验证其是否已成功创建,该命令将在 monitoring 命名空间中显示该 Secret:

kubectl get secret apm-license-key -n monitoring

2.3 为应用程序配置创建 ConfigMap

GO_APPS 环境变量指定代理应监控的 Go 应用程序。如需进行设置,请使用以下格式和组件创建一个列出您应用程序(含精确进程名称和监听端口)的 ConfigMap。

格式

AppName=ProcessName:Port1,Port2,Port3;AnotherApp=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

步骤 3:部署 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—提供节点上所有运行进程的可见性,确保准确的 Pod 发现
  • privileged: true—eBPF 操作需要提升的内核能力,因此必须设置
  • runAsUser: 0—以 root 身份运行代理,以成功执行 eBPF 相关系统调用
  • /proc:/host/proc (hostPath)—允许进程发现、元数据访问和命名空间解析
  • /sys/kernel/debug (hostPath)—eBPF 调试、探针加载以及管理 uprobe/kprobe 附加所需
  • /sys/fs/bpf (hostPath)—提供对 BPF 文件系统的访问,映射和程序在此处被固定
  • /var/lib/apm-binaries (hostPath)—用于存储应用程序二进制文件的共享存储,确保跨 Pod 的稳定 inode 和设备元数据 

步骤 4:部署和验证

4.1 应用所有资源

首先,通过应用命名空间 YAML 文件创建监控命名空间:

kubectl apply -f monitoring-namespace.yaml

接下来,为您的 Site24x7 许可证密钥创建 Secret 并应用应用程序配置的 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

接下来,验证每个节点上是否有 Pod 在运行:

kubectl get pods -n monitoring -l app=exporter-agent -o wide

您还可以查看 DaemonSet Pod 的日志,检查是否有错误或问题:

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 代理进行插桩和监控。

相关文章

APM Insight Go 代理安装

APM 最佳实践

本文档对您有帮助吗?

您愿意帮助我们改进文档吗?请告诉我们哪些方面可以做得更好。


很抱歉本文档未能让您满意。我们希望了解可以从哪些方面改进您的体验。


感谢您抽出时间分享反馈。我们将利用您的反馈来改进在线帮助资源。

短链接已复制!