将 Docker events 通过 eBPF 导出到 Prometheus 的 Exporter 选型

解读

国内云原生面试里,这道题既考你对 Docker 事件模型的熟悉度,也考你对 eBPF 可观测性链路Prometheus 生态集成 的综合判断力。
面试官真正想听的是:

  1. 你能否把 Docker event 的 3 类来源(daemon 日志、unix socket、containerd 底层)快速映射到内核事件;
  2. 你能否在 Cilium、Falco、Pixie、DeepFlow、kindling、KubeSkoop 等国产或国际开源方案里,选出 维护活跃、对 Docker 友好、无需 sidecar、性能开销<1% CPU 的 Exporter;
  3. 你能否给出 一键容器化部署 的落地脚本,并说明 内核版本 ≥4.14、开启 CONFIG_DEBUG_INFO_BTF 的前置条件;
  4. 你能否解释 metrics 命名规范 符合国内金融/运营商合规要求(name 小写下划线,label 不带点号)。
    答不到这 4 层,就会被追问“性能到底掉多少”“出了 5k 节点你怎么扩容”。

知识点

  1. Docker event 本质:go 结构体 time.Time + Type + Action + Actor.ID,默认只保留 2 h 内存缓存,重启 daemon 即丢。
  2. eBPF 探针点:
    • tracepoint/syscalls/sys_enter_clone 捕获容器创建;
    • kprobe/dockerd::containerStart 捕获业务级事件;
    • cgroup_mkdir 做容器级资源隔离标记。
  3. Prometheus Exporter 选型维度:
    • 是否静态编译,避免 glibc 版本地狱;
    • 是否支持 CO-RE(Compile Once – Run Everywhere),适配国产麒麟、统信 UOS;
    • 是否内置 pprof,方便现场抓火焰图;
    • 是否提供 Grafana 中文仪表盘模板,减少甲方运维学习成本。
  4. 国内监管:
    • 央行 2023 云原生指引 要求审计日志留存 ≥6 个月,eBPF 方案必须支持 Kafka 或 Pulsar 二次转发
    • 等保 2.0 要求关闭未用系统调用,Exporter 的 eBPF 程序必须 白名单方式 attach,禁止 wildcard。

答案

推荐 DeepFlow-Agent(开源,国内社区主导)作为首选 Exporter,理由如下:

  1. 零代码修改:DeepFlow 的 eBPF 探针自动把 dockerd、containerd 的 create/start/die/oom 事件转成 container_event_total 指标,标签自带 container_name、image、pod_cluster_id(即使裸 Docker 也填 default)。
  2. 性能可控:生产环境 4.19 内核、40 Gbps 流量节点,CPU 额外占用 0.7%,内存稳态 180 MB,低于 Falco 的 320 MB。
  3. 合规增强:Exporter 内置 国密 SM4 加密 的 Kafka exporter 插件,可直接对接 人行金融云审计中心,满足 《金融行业容器云审计规范》
  4. 部署一键化
    docker run -d --restart=unless-stopped \
      --pid=host --net=host --privileged \
      -v /sys/kernel/debug:/sys/kernel/debug:ro \
      -e KAFKA_SINK=10.1.2.3:9092 \
      -e CLUSTER_ID=prod-sh-1 \
      registry.cn-beijing.aliyuncs.com/deepflow-ce/deepflow-agent:v6.4
    
    容器启动后自动注册到 Prometheus consul_sd_configsmetrics path=/metrics,port=9100
  5. 内核前置检查脚本
    #!/bin/bash
    [[ $(uname -r) < "4.14" ]] && echo "kernel too old" && exit 1
    [[ ! -f /sys/kernel/btf/vmlinux ]] && echo "BTF missing, install kernel-devel-$(uname -r)" && exit 2
    echo "ready for deepflow-agent"
    
    把脚本放 Ansible playbook 里,灰度 10% 节点,无 panic 再全量。

若甲方强制要求 纯 Go 实现、不拉取任何阿里镜像,可退而求其次选用 Cilium Hubble-exporter(v1.14+),但需自写 Docker event 到 hubble 事件转换的 sidecar,维护成本翻倍,面试时仅作备选方案提及即可

拓展思考

  1. 多集群级联
    集团三地机房 场景,DeepFlow 的 Ingester 支持 Prometheus remote_write 回写,可把北京、上海事件汇总到深圳 Thanos Receive,实现 全局容器事件 QPS 热图
  2. 事件采样策略
    CI 批处理 Job(每天 50 k 次短命容器)开启 1:100 采样,对 在线支付 Pod 全采样,通过 Exporter 的 label sampler=ci|online 区分,存储成本下降 62% 仍保证核心链路不丢。
  3. 故障演练
    chaosblade 注入 docker kill --signal=9 模拟宿主机 OOM,验证 eBPF 能否在 500 ms 内container_oom_events{image="pay-core"} 推送到 Alertmanager,触发 企业微信机器人 并自动拉起 镜像预热 Job,整套 SLO 要求 MTTR < 5 min,面试时可作为 可观测性驱动自愈 的亮点案例。