如何在 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 monitoringkubectl 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 代理进行插桩和监控。
相关文章
