Telegraf 容器化部署完全指南:Docker 单机与 K8s 集群指标采集
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
机器一多,挨个 SSH 上去装采集代理、再逐台改配置,是一件让人想摔键盘的事;集群扩缩容之后,你还得记得去新节点补装。Telegraf 是 InfluxData 出品的开源代理(Agent),负责收集、处理、聚合并写入系统与应用的指标数据——把它容器化,单机场景走 Docker 部署,集群场景走 K8s 部署,就是生产环境最常见的两种落地方式。
30 秒选对 Telegraf 镜像
| 镜像 | 特点 | 适用场景 | 拉取命令 |
|---|---|---|---|
telegraf(Debian) | 依赖完整、兼容性好 | 生产环境,稳定性优先 | docker pull telegraf |
telegraf:alpine | 体积小、启动快 | 边缘设备、资源受限环境 | docker pull telegraf:alpine |
镜像选型不用纠结:拿不准就选 Debian 版,Alpine 版留给对镜像体积敏感的边缘节点。官方维护策略是 InfluxData 会为最近三个次要版本持续提供安全更新,所以升级小版本基本无感。
场景一:单机与边缘的 Docker 快速启动
生成一份基础配置
用一次性容器把官方完整示例配置导出到本地,后面只需在此基础上裁剪:
docker run --rm telegraf telegraf config > telegraf.conf只保留最需要的插件
示例配置里几百个插件全部是注释,我们只留 agent 采集周期、一个 CPU 输入插件和 InfluxDB 输出目标,其余保持注释即可:
[agent] interval = "10s" [[inputs.cpu]] percpu = true totalcpu = true [[outputs.influxdb]] urls = ["http://127.0.0.1:8086"]启动容器并预防 memlock 警告
配置以只读方式挂载,--ulimit参数直接带上,避免下面这个高频坑:
docker run -d --name telegraf \ -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \ --ulimit memlock=8192:8192 telegraf🛑你可能会撞上的报错:日志出现
W! Insufficient lockable memory 64kb when 72kb is required,严重时直接panic: could not acquire lock。原因是 Telegraf 默认使用可锁定内存存放数据库口令、token 这类敏感信息,防止密钥被换页写到磁盘,而容器默认的 memlock 限额往往不够。解法就是启动时加
--ulimit memlock=8192:8192(或在宿主机执行ulimit -l 8192)。也有--unprotected参数可彻底关闭内存锁定,但密钥可能落盘,属于"不推荐"选项,生产环境别用。
场景二:K8s 集群的 DaemonSet 规模化部署
为什么推荐 DaemonSet + ConfigMap + Secret 组合:inputs.kubernetes插件官方明确要求以 DaemonSet 形式运行、每个节点一个实例并对接本地 kubelet,而 ConfigMap 让配置改一次全集群生效,Secret 则把敏感信息从配置里剥离出去。
DaemonSet 清单要点
Pod 骨架部分,selector与labels必须成对一致:
apiVersion: apps/v1 kind: DaemonSet metadata: name: telegraf spec: selector: matchLabels: {app: telegraf} template: metadata: labels: {app: telegraf}在spec.template.spec下补充容器定义,resources 分两档:requests 是调度器承诺的最低资源(50m / 64Mi 保证 Pod 能被安排到节点),limits 是运行期天花板(100m / 128Mi 防止指标暴涨拖垮节点)。两者给不同值,就是为了"平时够用、忙时封顶":
containers: - name: telegraf image: telegraf resources: requests: {cpu: 50m, memory: 64Mi} limits: {cpu: 100m, memory: 128Mi}节点规格大(8 核以上)时,可放宽到 limits 200~300m / 256~512Mi。如果还要挂/var/run/docker.sock来启用 docker 输入插件,记得以hostPath卷方式添加。
ConfigMap 存放配置
把上面的 TOML 配置放进 ConfigMap 供 DaemonSet 挂载。这里[[inputs.kubernetes]]特意指向本地 kubelet(10255 端口),意味着插件只和本机说话,完全不碰 API Server,权限要求直接归零:
apiVersion: v1 kind: ConfigMap metadata: name: telegraf-config data: telegraf.conf: | [agent] interval = "10s" [[inputs.kubernetes]] url = "http://127.0.0.1:10255"数据库 token、访问密钥等敏感值单独建 Secret,以文件形式挂载后在配置中引用路径,别明文写在 ConfigMap 里——它没有加密,kubectl get cm -o yaml谁都能看。
RBAC:仅集群模式需要
只有当url留空(插件会经 API Server 枚举所有节点再逐个访问 kubelet)时,才需要最小权限的 ClusterRole;本地 kubelet 模式下可以跳过本节:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: telegraf rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list"]创建后还要补一个 ServiceAccount 和对应的 ClusterRoleBinding,并在 Pod 的serviceAccountName中引用。权限只给nodes的get/list,够用就好,别顺手加watch或pods。
生产加固清单
上生产前,按下面四项逐条过一遍:
- 非 root 运行:自建镜像时追加
USER telegraf,拒绝以 root 身份采集指标 - 只读根文件系统:
securityContext里设readOnlyRootFilesystem: true,并给/tmp挂 emptyDir,防止进程在磁盘上随意写文件 - 收紧 capability:
capabilities: {drop: ["ALL"]},仅当需要 ping 类插件时再加回NET_RAW - 监控 Telegraf 自身:开启
[[inputs.internal]]的collect_memstats = true,让内存统计也进指标库
排障速查表
| 症状 | 可能原因 | 解决 |
|---|---|---|
Insufficient lockable memory警告或panic: could not acquire lock | 容器 memlock 限额过低 | docker run 加--ulimit memlock=8192:8192;--unprotected仅作临时验证 |
K8s 下拿不到节点指标、日志出现forbidden | ServiceAccount 权限缺失或绑定错误 | kubectl describe sa telegraf -n monitoring核对绑定;集群模式确认 ClusterRole 含nodes的get/list |
日志报Error loading plugin | 插件名拼错或 TOML 语法错误 | 用telegraf config check --config telegraf.conf静态校验,插件名对照 plugins/inputs/ 目录 |
| Pod CrashLoopBackOff | 配置挂载失败或只读文件系统冲突 | kubectl logs看首行报错;配置目录保持readOnly: true挂载,可写路径另挂 emptyDir |
结尾
单机或边缘设备直接 Docker 跑,集群规模上 DaemonSet + ConfigMap + Secret,按需二选一。未来官方镜像还会继续瘦身,对 Prometheus ServiceMonitor 等生态的支持也会更顺,方向上可以期待。有踩坑经验欢迎在评论区交流 👇
资源速查
- 容器化官方文档:docs/DOCKER.md
- 插件总目录:plugins/
- Kubernetes 输入插件源码:plugins/inputs/kubernetes/
- 配置与过滤指南:docs/CONFIGURATION.md
- 输入插件列表:plugins/inputs/
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考