在 Kubernetes 上用 Helm 部署 OpenTelemetry Collector 完整指南
Helm 是 K8s 环境部署 OpenTelemetry Collector 的标准方式。本文讲解 Chart 的核心概念(values 配置、Presets、环境变量替换)、DaemonSet 与 Deployment 两种部署模式的取舍,以及 OTLP 接收器、批处理、内存限制等关键配置项,并对比观测云 DataKit 的一键 DaemonSet 部署方案。
在 Kubernetes 中部署 OpenTelemetry Collector,官方 Helm Chart 是最省事的路径——它把 RBAC 权限、工作负载配置、服务暴露打包成模板,一条命令完成部署;但要用好它,得先理解 values 覆盖、Presets 预设与部署模式这三个核心概念。
核心要点速览
- Helm Chart 通过
values.yaml覆盖默认配置,切勿直接改模板; - Presets 是一键开启的预置功能包(如 K8s 元数据富化),自动处理 RBAC;
- DaemonSet 贴近数据源、Deployment 便于集中处理,可组合使用;
- Collector 接入后端前,应分别确认接收器、导出器协议和网络可达性。
部署前先懂三个概念
1. 配置文件与默认 values:Chart 自带完整的默认配置,你的 values.yaml 只做增量覆盖。所有定制都发生在这一层,升级 Chart 时配置不丢。
2. Presets 预设:复杂功能的一键开关。比如开启 kubernetesAttributes 预设,Chart 会自动创建所需 RBAC 权限,并配置好 k8sattributes 处理器,为遥测数据附加 Pod 名、命名空间、节点等 K8s 元数据——手动配这些要写几十行 YAML。
3. 环境变量替换:敏感信息(Token、密钥)不要写死在 values 里,通过环境变量注入,配置中以 ${env:VAR_NAME} 引用。
两种部署模式怎么选?
| 模式 | 特点 | 适用场景 |
|---|---|---|
| DaemonSet | 每个节点一个实例,贴近数据源 | 采集节点日志、主机指标、本机应用 OTLP 流量 |
| Deployment | 独立副本组,便于扩缩容 | 集中式网关:汇聚集群流量做统一处理、限流、路由 |
生产环境常见组合:DaemonSet 做节点级采集(Agent 角色),Deployment 做集群级汇聚(Gateway 角色),两层各司其职。
部署实操步骤
前置条件:K8s 1.16+、Helm 3、集群部署权限。
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
准备 values.yaml:
mode: daemonset # 或 deployment
presets:
kubernetesAttributes:
enabled: true # 自动附加 K8s 元数据
config:
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
send_batch_size: 8192
timeout: 5s
memory_limiter:
check_interval: 5s
limit_mib: 800
spike_limit_mib: 150 # 内存保护,防 OOM
exporters:
otlp:
endpoint: "http://datakit-service:4318"
headers:
Authorization: "Token ${env:GUANCE_TOKEN}"
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp]
部署:
helm install otel-collector open-telemetry/opentelemetry-collector -f values.yaml
配置要点解读
memory_limiter必须放在管道第一个处理器:它是防止 Collector OOM 的保险丝,内存逼近限额时主动拒绝新数据;batch紧跟其后:攒批导出,显著降低后端请求压力;- K8s 元数据富化:
kubernetesAttributes预设让每条遥测数据自带 Pod/命名空间标签,后续按业务维度聚合全靠它; - CORS:若接收浏览器直发的 OTLP 流量,HTTP 接收器需配置
cors.allowed_origins。
配置 DataKit 作为接收端
后端使用观测云时,可以按 DataKit Kubernetes 部署文档配置 DaemonSet,再让 Collector 向已启用的 OTLP 接收端导出。应用清单前,先核对工作空间地址、权限与采集器配置:
# 应用观测云控制台生成的 datakit.yaml
kubectl apply -f datakit.yaml
按 OpenTelemetry 接入文档检查 DataKit 的实际监听地址与协议;Collector 的 exporter 需与之匹配,不能把示例中的 4318 当作 DataKit 默认端口。先发送一条测试链路,核对服务名和 Pod 标签,再决定是否调整原有 Collector 处理器。
常见问题(FAQ)
Q:DaemonSet 模式下应用怎么找到 Collector? 通过 status.hostIP 注入环境变量,应用把 OTLP 端点指向节点 IP——同节点通信,延迟最低。
Q:Chart 升级会丢配置吗? 不会。所有定制在 values.yaml 中,helm upgrade 时带上原文件即可;建议 values 纳入 Git 管理。
Q:资源限额设多少? 视流量而定,起步建议 requests 100m/256Mi、limits 1C/1Gi,配合 memory_limiter 留 20% 余量;按《监控 Collector》的指标持续调优。
Q:多集群怎么管理配置? values.yaml 按集群分层(基础层 + 集群覆盖层),用 Helm 的 -f 多文件叠加,或上 GitOps(ArgoCD/Flux)统一管理。