arms-obi 是一个 Kubernetes DaemonSet 模式的 Go pprof 采集 Agent。它运行在集群的每个节点上,自动发现并采集暴露了 Go pprof HTTP 接口的业务 Pod 的性能数据,然后上传至阿里云云监控2.0,配合 ARMS Profiling 实现持续性能剖析(Continuous Profiling)。
核心能力
自动发现当前节点上暴露 pprof 接口的 Pod。
支持 CPU、Heap、Goroutine、Mutex、Block 五种 profile 采集。
健康检查接口,支持 K8s liveness/readiness 探针。
单节点支持 50+ Pod 同时采集。
前置条件
Kubernetes 集群 >= 1.32。
业务 Pod 暴露了 Go
net/http/pprofHTTP 接口。业务 Pod 容器中设置了标识 pprof 端口的环境变量(默认为
ILOGTAIL_PROFILE_PORT,可以根据需要调整values配置)。
业务接入
业务 Go 服务需要暴露 pprof HTTP 接口,并在容器中设置端口环境变量,已接入可跳过本节。
代码接入
在 Go 服务的 main 包中导入 net/http/pprof 并启动一个独立的 HTTP 服务:
import _ "net/http/pprof"
func main() {
// 在独立端口启动 pprof 服务,避免与业务端口冲突
go func() {
http.ListenAndServe(":6060", nil)
}()
// ... 业务代码
}容器环境变量
在业务 Pod 的容器 spec 中设置 pprof 端口环境变量,环境变量名称可配置,默认为 ILOGTAIL_PROFILE_PORT,可根据需要调整 values 配置:
containers:
- name: myapp
env:
- name: ILOGTAIL_PROFILE_PORT # 与 arms-obi 配置的 port_env_name 一致
value: "6060"arms-obi 会读取该环境变量的值来确定采集目标端口。
部署
ACK集群
登录容器服务管理控制台,在左侧导航栏选择集群列表,单击目标集群名称。
在左侧导航栏选择组件管理,找到
arms-obi组件,installMode选择profiling,点击安装即可。默认采集配置了ENV为
ILOGTAIL_PROFILE_PORT的Pod,同时使用label中key为app的value值创建应用。如需调整配置,可在安装时修改profiling中config采集配置。配置项参考采集配置(collector)。
外部集群
执行以下
wget命令下载arms-obi安装包。wget 'https://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/app/charts-incubator/arms-obi-0.9.3.tgz'执行以下命令解压arms-obi安装包。
tar xvf arms-obi-0.9.3.tgz编辑安装包下的values.yaml文件,根据实际情况修改以下参数,然后保存。
重要请确认对应的阿里云账号(主账号)已包含AliyunARMSFullAccess和AliyunSTSAssumeRoleAccess权限。
workspace: default-cms-__ACK_UID__-__ACK_REGION_ID__ registry: registry-__ACK_REGION_ID__.ack.aliyuncs.com/acs/ cluster_id: __ACK_CLUSTER_ID__ accessKey: __ACCESSKEY__ accessKeySecret: __ACCESSKEY_SECRET__ uid: "__ACK_UID__" region_id: __ACK_REGION_ID__ installMode: profilingworkspace:将__ACK_UID__、__ACK_REGION_ID_ 替换为阿里云主账号的UID和需要上报的RegionId。registry:arms-obi镜像地址,arms-obi 包含三个镜像,如果是无法访问公网,需要同步这个镜像到对应内网仓库:registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:obi-app-update-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:init-0.9.3 registry-cn-hangzhou.ack.aliyuncs.com/acs/obi:pprof-agent-0.9.3cluster_id:自定义Kubernetes集群ID,集群的唯一标识。建议格式为-。accessKey和accessKeySecret:阿里云账号(主账号)的AccessKey ID和AccessKey Secret。获取方法,请参见创建AccessKey。uid:阿里云账号(主账号)ID。将鼠标悬浮于阿里云控制台右上角的头像上可以获取。region_id:阿里云地域ID,应用监控支持的地域,请参见开服地域。installMode:该值须为profiling。执行以下命令安装arms-obi。请在arms-obi安装包外执行此命令。
helm3 upgrade --install arms-obi arms-obi --namespace obi-system --create-namespace
配置说明
采集配置(collector)
字段 | 类型 | 默认值 | 说明 |
profiles | [ ]string | 全部 5 种 | Profile 类型白名单,可选值:cpu、mem、goroutines、mutex、block |
interval | int | 30 | 采集周期(秒) |
timeout | int | 30 | 单次 HTTP 请求超时(秒) |
max_body_size | int | 10240 | 单次响应 Body 上限(KB),超过则丢弃 |
cpu_duration | int | 10 | CPU profile 采样时长(秒),必须小于 interval |
port_env_name | string | ILOGTAIL_PROFILE_PORT | 从容器 env 中读取 pprof 端口的环境变量名 |
pprof_path | string | /debug/pprof | pprof HTTP 路径前缀 |
Profile 采集 URL 构造规则:http://<podIP>:<port><pprof_path>/<profile>
Profile 类型 | URL 路径 | 备注 |
cpu | /profile?seconds=<cpu_duration> | 采集耗时 = cpu_duration 秒 |
mem | /heap | 瞬时采集 |
goroutines | /goroutine | 瞬时采集 |
mutex | /mutex | 瞬时采集 |
block | /block | 瞬时采集 |
过滤配置(selector)
控制哪些 Pod 会被采集。所有条件为 AND 关系,白名单内部为 OR 关系。
字段 | 类型 | 默认值 | 说明 |
namespace | string | "" | 正则匹配 Pod Namespace,空表示不过滤 |
pod_name | string | "" | 正则匹配 Pod Name,空表示不过滤 |
label_whitelist | [ ]LabelKV | [ ] | Pod Label 白名单,匹配任一即通过 |
label_blacklist | [ ]LabelKV | [ ] | Pod Label 黑名单,匹配任一即排除 |
env_whitelist | [ ]LabelKV | [ ] | 容器环境变量白名单,必须包含其中任一 |
env_blacklist | [ ]LabelKV | [ ] | 容器环境变量黑名单,包含任一即排除 |
LabelKV 格式:{key: "app", value: "myservice"},value 为空时仅检查 key 是否存在。
过滤流水线执行顺序:
节点过滤 — 仅采集当前节点上的 Pod(自动完成)。
Pod Phase — 仅保留 Running 状态且有 PodIP 的 Pod。
正则过滤 — namespace / pod_name。
Label 白名单 → Label 黑名单。
Env 白名单 → Env 黑名单。
端口解析 — 从容器 env 中读取 port_env_name 对应的端口值。
ARMS 配置
字段 | 类型 | 默认值 | 说明 |
arms.license_key | string | app | 从 Pod 的哪个 label 取值作为 ARMS appName |
配置更新
登录容器服务管理控制台,在左侧导航栏选择集群列表,单击目标集群名称。
在左侧导航栏选择组件管理,找到
arms-obi组件,点击配置,修改profiling采集配置即可。
查看Profiling
登录云监控2.0控制台,选择目标工作空间,在左侧导航栏单击应用监控。
找到部署时的app定义应用名称,查看应用诊断即可看到不同类型的profiling,同时支持在pprof分析下载对应的采集profiling文件。
常见问题
Agent 日志中持续出现 "arms sts not ready yet"
ARMS STS 凭证尚未获取成功。检查:
集群网络是否可访问 ARMS 元数据 API(
{region_id}-intranet-arms.aliyuncs.com)。可通过
kubectl logs查看详细错误信息。
没有发现任何 Pod
检查过滤规则配置:
确认业务 Pod 的容器中设置了 port_env_name 指定的环境变量(默认 ILOGTAIL_PROFILE_PORT)。
确认 selector 的 namespace/pod_name 正则、label/env 白名单黑名单配置正确。
查看 Agent 日志中 pod_count 字段确认发现的 Pod 数量。
采集失败
常见原因:
业务 Pod 未暴露 pprof 接口(确认已 import _ "net/http/pprof" 并启动 HTTP 服务)。
pprof 端口与 port_env_name 环境变量中配置的端口不一致。
pprof_path 与业务服务的路径前缀不匹配。
网络策略阻止了 Agent Pod 到业务 Pod 的 HTTP 连接。
上传失败
常见原因:
VPC 内网 endpoint 不可达。
ARMS STS 凭证过期(Agent 会自动刷新,检查日志中是否有 STS 刷新失败的错误)。