
K8s集群腳本K8s Deployment注入追蹤運維實操技術(shù)棧Kubernetes v1.32.13 Rocky Linux 8.6 OpenTelemetry Operator Java Agent Sidecar/Init Container操作環(huán)境 / 對接原理 / 詳細步驟 / 完整命令 / 配置文件 / 驗證流程 / 排錯方案K8s集群腳本K8s Deployment注入追蹤運維實操操作環(huán)境K8s 集群版本 v1.32.13應(yīng)用部署于 default 命名空間鏈路追蹤后端 Jaeger v1.55.x OpenTelemetry Collector部署于 observability容器運行時 Containerd 1.7.xDocker 鏡像接入方式Init Container 掛載 Agent、Sidecar 采集、環(huán)境變量注入、Admission Webhook 自動注入多語言Java字節(jié)碼增強、Go/Node.js/Python/.NETSDK 埋點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邊車容器運行采集器通過共享卷或網(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é)碼增強Java Agent實現(xiàn)無侵入埋點自動攔截 Spring/Tomcat/DB/Cache/MQ 等組件。Go/Node.js/Python/.NET 應(yīng)用通過 OpenTelemetry SDK 手動或半自動埋點。多容器 Pod 需確保 Agent 掛載到正確容器TraceID 在容器間通過共享卷或網(wǎng)絡(luò)傳遞。K8s 中通過 ConfigMap 管理 Agent 配置Secret 管理追蹤后端憑據(jù)Resource 限制控制 Agent 資源開銷。詳細步驟1. 環(huán)境變量自動注入 Agent# 通過 ConfigMap 統(tǒng)一管理環(huán)境變量 cat otel-env-configmap.yaml EOF apiVersion: v1 kind: ConfigMap metadata: name: otel-common-env data: OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger-collector.observability:4317 OTEL_TRACES_SAMPLER: traceidratio OTEL_TRACES_SAMPLER_ARG: 0.1 OTEL_PROPAGATORS: tracecontext,baggage,b3 OTEL_METRICS_EXPORTER: otlp OTEL_LOGS_EXPORTER: otlp JAVA_TOOL_OPTIONS: -javaagent:/otel/opentelemetry-javaagent.jar EOF kubectl apply -f otel-env-configmap.yaml # Deployment 引用 ConfigMap 環(huán)境變量 cat env-from-deploy.yaml EOF apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: template: spec: initContainers: - name: otel-agent-init image: otel/javaagent:2.1.0 command: [cp, /opentelemetry-javaagent.jar, /otel/] volumeMounts: - name: otel-agent mountPath: /otel containers: - name: order-service image: order-service:v1 envFrom: - configMapRef: name: otel-common-env env: - name: OTEL_SERVICE_NAME value: order-service # 每個服務(wù)單獨設(shè)置 volumeMounts: - name: otel-agent mountPath: /otel volumes: - name: otel-agent emptyDir: {} EOF kubectl apply -f env-from-deploy.yaml # 驗證環(huán)境變量 kubectl exec deployment/order-service -- env | grep -E OTEL|JAVA_TOOL # 批量為所有 Deployment 注入使用 kubectl patch # for deploy in $(kubectl get deploy -o name); do # kubectl patch $deploy --typejson -p[ # {op:add,path:/spec/template/spec/initContainers,value:[...]}, # {op:add,path:/spec/template/spec/containers/0/envFrom,value:[{configMapRef:{name:otel-common-env}}]} # ] # done驗證流程# 1. 驗證 Agent 注入 kubectl get pod -l apporder-service -o jsonpath{.items[*].spec.initContainers[*].name} # 顯示 Agent Init Container 名稱 ? # 2. 驗證 Agent 加載 kubectl logs deployment/order-service | grep -iE opentelemetry|skywalking|pinpoint|agent # 顯示 Agent 啟動日志 ? # 3. 驗證環(huán)境變量 kubectl exec deployment/order-service -- env | grep -E OTEL|SW_|PINPOINT|JAVA_TOOL | sort # 顯示追蹤相關(guān)環(huán)境變量 ? # 4. 驗證 Trace 上報 curl http://order-service:8080/api/test # Jaeger/SkyWalking/Zipkin UI 搜索 order-service有 Trace 數(shù)據(jù) ? # 5. 驗證跨服務(wù)調(diào)用鏈 # 調(diào)用入口服務(wù)檢查完整調(diào)用鏈包含所有服務(wù) ? # 6. 驗證資源使用 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 標簽禁用 Metrics/Logs 導出Trace 不上報檢查 OTEL_EXPORTER_OTLP_ENDPOINT/SW_AGENT_COLLECTOR_BACKEND_SERVICES 地址網(wǎng)絡(luò)是否可達kubectl exec curl 測試Collector/后端是否正常采樣率是否為0Init Container 失敗檢查 Agent 鏡像是否可拉取cp 命令路徑是否正確共享卷掛載路徑是否一致Init Container 資源是否充足Sidecar 端口沖突檢查 Sidecar 容器端口是否與主應(yīng)用沖突修改 Collector 配置端口檢查 Pod 內(nèi) localhost 通信自動注入不生效檢查命名空間/Pod 注解是否正確Operator 是否正常運行MutatingWebhookConfiguration 是否存在Pod 是否在注入后創(chuàng)建需重啟性能開銷大降低采樣率使用異步批量上報禁用不需要的插件限制 Agent 資源使用 DaemonSet Collector 聚合減少連接按需啟用 Metrics/Logs