維實(shí)操)
K8s集群腳本K8s Deployment注入追蹤運(yùn)維實(shí)操技術(shù)棧Kubernetes v1.32.13 Rocky Linux 8.6 OpenTelemetry Operator Java Agent Sidecar/Init Container操作環(huán)境 / 對(duì)接原理 / 詳細(xì)步驟 / 完整命令 / 配置文件 / 驗(yàn)證流程 / 排錯(cuò)方案K8s集群腳本K8s Deployment注入追蹤運(yùn)維實(shí)操操作環(huán)境K8s 集群版本 v1.32.13應(yīng)用部署于 default 命名空間鏈路追蹤后端 Jaeger v1.55.x OpenTelemetry Collector部署于 observability容器運(yùn)行時(shí) Containerd 1.7.xDocker 鏡像接入方式Init Container 掛載 Agent、Sidecar 采集、環(huán)境變量注入、Admission Webhook 自動(dòng)注入多語(yǔ)言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對(duì)接原理容器應(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)境變量自動(dòng)激活 Agent、Admission WebhookMutatingWebhook 自動(dòng)為 Pod 注入 Init Container/Agent/環(huán)境變量無需修改應(yīng)用配置。Java 應(yīng)用通過字節(jié)碼增強(qiáng)Java Agent實(shí)現(xiàn)無侵入埋點(diǎn)自動(dòng)攔截 Spring/Tomcat/DB/Cache/MQ 等組件。Go/Node.js/Python/.NET 應(yīng)用通過 OpenTelemetry SDK 手動(dòng)或半自動(dòng)埋點(diǎn)。多容器 Pod 需確保 Agent 掛載到正確容器TraceID 在容器間通過共享卷或網(wǎng)絡(luò)傳遞。K8s 中通過 ConfigMap 管理 Agent 配置Secret 管理追蹤后端憑據(jù)Resource 限制控制 Agent 資源開銷。詳細(xì)步驟1. 環(huán)境變量自動(dòng)注入 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 # 每個(gè)服務(wù)單獨(dú)設(shè)置 volumeMounts: - name: otel-agent mountPath: /otel volumes: - name: otel-agent emptyDir: {} EOF kubectl apply -f env-from-deploy.yaml # 驗(yàn)證環(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驗(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 啟動(dòng)日志 ? # 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 上報(bào) 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排錯(cuò)方案Agent 不加載檢查 JAVA_TOOL_OPTIONS 環(huán)境變量Agent jar 是否正確掛載到共享卷Init Container 是否成功執(zhí)行應(yīng)用啟動(dòng)命令是否覆蓋 JAVA_TOOL_OPTIONS應(yīng)用啟動(dòng)失敗檢查 Agent 版本與 JDK 版本兼容性Agent 與其他 Java Agent 沖突如 Arthas/JRebel增加啟動(dòng)超時(shí)時(shí)間查看啟動(dòng)錯(cuò)誤日志OOM 內(nèi)存溢出增加容器內(nèi)存 limits限制 Agent JVM 內(nèi)存OTEL_JAVAAGENT_JVM_ARGS降低采樣率減少 Span 標(biāo)簽禁用 Metrics/Logs 導(dǎo)出Trace 不上報(bào)檢查 OTEL_EXPORTER_OTLP_ENDPOINT/SW_AGENT_COLLECTOR_BACKEND_SERVICES 地址網(wǎng)絡(luò)是否可達(dá)kubectl exec curl 測(cè)試Collector/后端是否正常采樣率是否為0Init Container 失敗檢查 Agent 鏡像是否可拉取cp 命令路徑是否正確共享卷掛載路徑是否一致Init Container 資源是否充足Sidecar 端口沖突檢查 Sidecar 容器端口是否與主應(yīng)用沖突修改 Collector 配置端口檢查 Pod 內(nèi) localhost 通信自動(dòng)注入不生效檢查命名空間/Pod 注解是否正確Operator 是否正常運(yùn)行MutatingWebhookConfiguration 是否存在Pod 是否在注入后創(chuàng)建需重啟性能開銷大降低采樣率使用異步批量上報(bào)禁用不需要的插件限制 Agent 資源使用 DaemonSet Collector 聚合減少連接按需啟用 Metrics/Logs