在 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 便于集中处理,可组合使用;
- 观测云 DataKit 提供等价能力:一条 DaemonSet YAML 完成全集群采集。
部署前先懂三个概念
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 的 K8s 一键部署
如果后端是观测云,可以进一步简化——DataKit 官方提供 K8s DaemonSet 部署,一条命令全集群生效:
# 应用观测云控制台生成的 datakit.yaml
kubectl apply -f datakit.yaml
DataKit 内置 OTLP 接收(4317/4318)、K8s 元数据自动富化、容器日志采集与主机指标采集,上述 Helm 配置中的接收器、处理器、富化预设全部开箱自带,应用直接把 OTLP 端点指向本节点 DataKit 即可。已在用 OTel Collector 的团队,也可把 exporter 指向 DataKit 服务地址,平滑迁移。
常见问题(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)统一管理。