arms-obi 是一個 Kubernetes DaemonSet 模式的 Go pprof 採集 Agent。它運行在叢集的每個節點上,自動探索並採集暴露了 Go pprof HTTP 介面的業務 Pod 的效能資料,然後上傳至阿里雲CloudMonitor2.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叢集
登入Container Service管理主控台,在左側導覽列選擇叢集列表,單擊目的地組群名稱。
在左側導覽列選擇組件管理,找到
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 |
配置更新
登入Container Service管理主控台,在左側導覽列選擇叢集列表,單擊目的地組群名稱。
在左側導覽列選擇組件管理,找到
arms-obi組件,點擊配置,修改profiling採集配置即可。
查看Profiling
登入CloudMonitor2.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 重新整理失敗的錯誤)。