
OpenTelemetry Collector 高可用部署Kubernetes 集群零丢数据实战【免费下载链接】opentelemetry-collectorOpenTelemetry Collector项目地址: https://gitcode.com/GitHub_Trending/op/opentelemetry-collector凌晨两点你被电话叫醒一台节点宕机跑在它上面的 OpenTelemetry Collector 单 Pod 跟着消失两个小时 1000 多万条 span 全丢。你翻了 40 分钟日志才确认——不是后端问题是采集层单点挂了。这类事故根因基本一致OpenTelemetry Collector 高可用部署没做。这篇带你把 Kubernetes 集群里的采集层从祈祷不挂改成自动恢复。核心方案把单点 Collector 改成弹性采集层选对部署模式采集层拆成两层节点上的 Agent 和平面上的 Collector。数据流如下Agent 贴着节点收数据负责就近接入与批处理Collector 跑在控制平面负责聚合与高可用输出。因为节点数稳定Agent 用 DaemonSet 每节点一份因为吞吐波动大Collector 用 Deployment HPA 弹性伸缩坏副本被 Service 自动摘除链路不断。模式形态适合AgentDaemonSet每节点一份节点采集、就近批处理CollectorDeployment HPA跨节点聚合、弹性输出资源只动这两处Agent 节点上跑给小 request 防抢占GOMEMLIMIT压在 limit 的 80%让 Go 触发 GC 而不是被 OOM KillCollector 是聚合层replicas生产至少 3副本坏了 Service 继续把流量分给活着的。# otel-agentDaemonSet节点数固定每节点一份 resources: limits: { cpu: 500m, memory: 500Mi } requests: { cpu: 100m, memory: 100Mi } env: - name: GOMEMLIMIT value: 400MiB # ← limits 的 80%触发 GC 而非 OOM # otel-collectorDeployment聚合层生产建议 3 副本 replicas: 3 minReadySeconds: 5 resources: limits: { cpu: 1, memory: 2Gi } requests: { cpu: 200m, memory: 400Mi } env: - name: GOMEMLIMIT value: 1600MiB # ← 同为 limits 的 80%配好关键参数配置用base overlay分层base 是所有环境共用的默认值overlay 按环境只写差异CI 阶段合并成一份最终配置。因为这样改生产只动 overlay不会误伤其他环境diff 也只看得到真正变化。下面两段是两个源文件构建时合并不是同一份 YAML。processors: # ← base 共用默认 memory_limiter: { limit_mib: 1500 } batch: { send_batch_size: 8192 } processors: # ← overlay/prod 只覆盖差异 memory_limiter: { limit_mib: 3000 } # ← 生产内存翻倍 batch: { send_batch_size: 16384 }memory_limiter必须放在 pipeline 第一个 processor这样内存吃紧时能立刻给上游 receiver 回压batch放在它后面先背压再攒批避免把内存打满。设好扩缩容规则扩容怕抖动误判、缩容怕误杀所以scaleUp只等 60s 快速接住流量scaleDown等 300s 确认低谷再缩避免副本反复横跳。CPU 目标留 30% 余量因为 span 突发来得快余量不够就 OOM。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: otel-collector spec: scaleTargetRef: { kind: Deployment, name: otel-collector } minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: { type: Utilization, averageUtilization: 70 } behavior: scaleUp: { stabilizationWindowSeconds: 60 } scaleDown: { stabilizationWindowSeconds: 300 }生产落地数据不丢、连接不断、故障可发现数据不丢先落盘再重试后端抖动或 Collector 重启时数据不能直接丢。因为内存队列掉电即失所以用file_storage把待发请求落盘重启后从磁盘续传再配sending_queue给抖动留缓冲retry_on_failure设重试窗口超 300s 才放弃。extensions: file_storage: directory: /var/lib/otelcol # ← 崩溃重启后从磁盘续传 exporters: otlp: endpoint: backend:4317 sending_queue: { enabled: true, queue_size: 100000 } # ← 抖动时先落盘不丢 retry_on_failure: { enabled: true, max_elapsed_time: 300s }连接不断TLS 加密 最小权限 链路加密和访问控制要一起上。OTLP 端点默认走明文因为生产里 span 含请求参数等敏感字段所以强制 TLS、禁用insecure再用 NetworkPolicy 把入口锁到只允许 Agent 进来出口只允许写后端任何多余 Pod 都碰不到 4317。证书用 cert-manager 托管配一个 24h 短证书 6h 提前续期即可不用手工轮转。# OTLP 端点 TLS禁明文 exporters: otlp: endpoint: backend:4317 tls: ca_file: /secrets/ca.pem min_version: TLS1.2 --- # NetworkPolicy最小权限只放 agent 进、只写后端 kind: NetworkPolicy spec: podSelector: { matchLabels: { component: otel-collector } } ingress: - from: [ { podSelector: { matchLabels: { component: otel-agent } } } ] ports: [ { port: 4317 } ]故障可发现盯住这 5 个指标Collector 自带 8888 端点暴露otelcol_前缀指标Prometheus 抓它即可。下面 5 个最该设告警指标告警阈值otelcol_receiver_refused_spans1 分钟 100otelcol_exporter_send_failed_spans1 分钟 100otelcol_exporter_queue_size持续 80% capacityotelcol_receiver_accepted_spans5 分钟骤降 50%process_resident_memory_bytes 容器 limits 的 80%灾难恢复5 步把链路拉回来整节点损坏、配置被改坏时按这 5 步拉回拉取备份 PVC含 otel-config 与 file_storage 目录用备份覆盖坏掉的 ConfigMap滚动重启 Collector Deployment验证/ready探针与 8888 指标端点恢复确认 file_storage 数据补推、队列水位清零调优速查改对 5 个参数 ⚡参数只动这 5 个其余保持默认参数推荐值说明memory_limiter.limit_mib容器内存 80%硬限触发拒绝 GCbatch.send_batch_size8192批触发阈值压缩并降连接数sending_queue.queue_size100000后端抖动时的落盘缓冲grpc.max_recv_msg_size_mib16防超大 payload 撑爆内存HPA.averageUtilization70CPU 目标留 30% 余量抗突发调优前后对比吞吐量5k → 25k spans/s×5P99 延迟120ms → 45ms-62%内存峰值1.2GiB → 800MiB-33%。因为batch攒批压低了连接次数、memory_limiter卡住了 OOM 上限、HPA 吃掉了流量尖峰三个指标一起改善。单点变集群数据链路从祈祷不挂变成自动恢复。想核对指标语义看 内部遥测文档。如果你的集群还在跑单 Pod Collector现在就可以从 DaemonSet Agent 开始拆。【免费下载链接】opentelemetry-collectorOpenTelemetry Collector项目地址: https://gitcode.com/GitHub_Trending/op/opentelemetry-collector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考