用追蹤C(jī)PU過高排查配置實(shí)操)
K8s集群遷移容器應(yīng)用追蹤C(jī)PU過高排查配置實(shí)操技術(shù)棧Kubernetes v1.32.13 Rocky Linux 8.6 OpenTelemetry Operator Java Agent Sidecar/Init Container操作環(huán)境 / 對接原理 / 詳細(xì)步驟 / 完整命令 / 配置文件 / 驗(yàn)證流程 / 排錯方案K8s集群遷移容器應(yīng)用追蹤C(jī)PU過高排查配置實(shí)操操作環(huán)境K8s 集群版本 v1.32.13應(yīng)用部署于 default 命名空間鏈路追蹤后端 Jaeger v1.55.x OpenTelemetry Collector部署于 observability容器運(yùn)行時 Containerd 1.7.xDocker 鏡像接入方式Init Container 掛載 Agent、Sidecar 采集、環(huán)境變量注入、Admission Webhook 自動注入多語言Java字節(jié)碼增強(qiáng)、Go/Node.js/Python/.NETSDK 埋點(diǎn)Agent 版本OpenTelemetry Java Agent v2.1.0、SkyWalking Agent v9.7.0、Pinpoint Agent v2.5.3對接原理容器應(yīng)用追蹤適配是將鏈路追蹤 Agent/SDK 集成到 K8s 容器化應(yīng)用中的一系列技術(shù)方案。核心接入方式包括Init Container初始化容器下載并掛載 Agent 到共享卷應(yīng)用容器通過 -javaagent 加載、Sidecar邊車容器運(yùn)行采集器通過共享卷或網(wǎng)絡(luò)與應(yīng)用通信、環(huán)境變量注入通過 JAVA_TOOL_OPTIONS/OTEL_* 環(huán)境變量自動激活 Agent、Admission WebhookMutatingWebhook 自動為 Pod 注入 Init Container/Agent/環(huán)境變量無需修改應(yīng)用配置。Java 應(yīng)用通過字節(jié)碼增強(qiáng)Java Agent實(shí)現(xiàn)無侵入埋點(diǎn)自動攔截 Spring/Tomcat/DB/Cache/MQ 等組件。Go/Node.js/Python/.NET 應(yīng)用通過 OpenTelemetry SDK 手動或半自動埋點(diǎn)。多容器 Pod 需確保 Agent 掛載到正確容器TraceID 在容器間通過共享卷或網(wǎng)絡(luò)傳遞。K8s 中通過 ConfigMap 管理 Agent 配置Secret 管理追蹤后端憑據(jù)Resource 限制控制 Agent 資源開銷。詳細(xì)步驟1. 容器追蹤基礎(chǔ)接入# 最簡方式OpenTelemetry Operator 自動注入 kubectl label namespace default instrumentation.opentelemetry.io/inject-javatrue # 部署應(yīng)用無需修改 kubectl apply -f order-service.yaml # 驗(yàn)證 kubectl logs deployment/order-service | grep -i opentelemetry2. 容器追蹤驗(yàn)證# 檢查 Pod 注入情況 kubectl get pod -l apporder-service -o yaml | grep -A10 initContainers # 檢查環(huán)境變量 kubectl exec deployment/order-service -- env | grep OTEL | sort # 發(fā)送請求 curl http://order-service:8080/api/test # Jaeger UI 查看 Trace驗(yàn)證流程# 1. 驗(yàn)證 Agent 注入 kubectl get pod -l apporder-service -o jsonpath{.items[*].spec.initContainers[*].name} # 顯示 Agent Init Container 名稱 ? # 2. 驗(yàn)證 Agent 加載 kubectl logs deployment/order-service | grep -iE opentelemetry|skywalking|pinpoint|agent # 顯示 Agent 啟動日志 ? # 3. 驗(yàn)證環(huán)境變量 kubectl exec deployment/order-service -- env | grep -E OTEL|SW_|PINPOINT|JAVA_TOOL | sort # 顯示追蹤相關(guān)環(huán)境變量 ? # 4. 驗(yàn)證 Trace 上報 curl http://order-service:8080/api/test # Jaeger/SkyWalking/Zipkin UI 搜索 order-service有 Trace 數(shù)據(jù) ? # 5. 驗(yàn)證跨服務(wù)調(diào)用鏈 # 調(diào)用入口服務(wù)檢查完整調(diào)用鏈包含所有服務(wù) ? # 6. 驗(yàn)證資源使用 kubectl top pod -l apporder-service # Agent 開銷在合理范圍內(nèi)CPU5%, 內(nèi)存200MB排錯方案Agent 不加載檢查 JAVA_TOOL_OPTIONS 環(huán)境變量Agent jar 是否正確掛載到共享卷Init Container 是否成功執(zhí)行應(yīng)用啟動命令是否覆蓋 JAVA_TOOL_OPTIONS應(yīng)用啟動失敗檢查 Agent 版本與 JDK 版本兼容性Agent 與其他 Java Agent 沖突如 Arthas/JRebel增加啟動超時時間查看啟動錯誤日志OOM 內(nèi)存溢出增加容器內(nèi)存 limits限制 Agent JVM 內(nèi)存OTEL_JAVAAGENT_JVM_ARGS降低采樣率減少 Span 標(biāo)簽禁用 Metrics/Logs 導(dǎo)出Trace 不上報檢查 OTEL_EXPORTER_OTLP_ENDPOINT/SW_AGENT_COLLECTOR_BACKEND_SERVICES 地址網(wǎng)絡(luò)是否可達(dá)kubectl exec curl 測試Collector/后端是否正常采樣率是否為0Init Container 失敗檢查 Agent 鏡像是否可拉取cp 命令路徑是否正確共享卷掛載路徑是否一致Init Container 資源是否充足Sidecar 端口沖突檢查 Sidecar 容器端口是否與主應(yīng)用沖突修改 Collector 配置端口檢查 Pod 內(nèi) localhost 通信自動注入不生效檢查命名空間/Pod 注解是否正確Operator 是否正常運(yùn)行MutatingWebhookConfiguration 是否存在Pod 是否在注入后創(chuàng)建需重啟性能開銷大降低采樣率使用異步批量上報禁用不需要的插件限制 Agent 資源使用 DaemonSet Collector 聚合減少連接按需啟用 Metrics/Logs