简介

本章介绍 DeepFlow 的部署方法。DeepFlow 可用于监控多个 K8s 上的容器应用、多个 VPC 中的云主机应用。本章的内容安排如下:

  • all-in-one:使用一台虚拟机快速体验 DeepFlow
  • single-k8s:部署 DeepFlow 监控一个 K8s 集群上的所有应用,所有观测数据将会自动注入K8s 资源K8s 自定义 Label 标签
  • multi-k8s:部署 DeepFlow 监控多个 K8s 集群上的所有应用
  • legacy-host:部署 DeepFlow 监控传统服务器上的所有应用
  • cloud-host:部署 DeepFlow 监控云服务器上的所有应用,所有观测数据将会自动注入云资源标签
  • managed-k8s:部署 DeepFlow 监控云服务商托管 K8s 集群上的所有应用,所有观测数据将会自动注入云资源K8s 资源K8s 自定义 Label 标签
  • serverless-pod:部署 DeepFlow 监控 Serverless Pod 内的所有应用
  • upgrade:DeepFlow 升级

# 1. 在线 Demo 环境

如果你现在没有合适的资源部署 DeepFlow,也可登录我们的在线 Demo (opens new window), 借助如下文档章节抢先体验 DeepFlow 的强大能力:

# 2. 运行权限及内核要求

DeepFlow 中的 eBPF 能力(AutoTracing、AutoProfiling)对内核版本的要求如下:

体系架构 发行版 内核版本 kprobe Golang uprobe OpenSSL uprobe perf
X86 CentOS 7.9 3.10.0 [1] Y Y [2] Y [2] Y
RedHat 7.6 3.10.0 [1] Y Y [2] Y [2] Y
* 4.9-4.13 Y
* 4.14 [3] Y Y [2] Y
* 4.15 Y Y [2] Y
* 4.16 Y Y Y
* 4.17+ Y Y Y Y
ARM CentOS 8 4.18 Y Y Y Y
EulerOS 5.10+ Y Y Y Y
麒麟 KylinOS V10 SP3+ 4.19.90-52.25+ Y Y Y Y
其他发行版 5.8+ Y Y Y Y

对内核版本的额外说明:

  • [1]: CentOS 7.9、RedHat 7.6 向 3.10 内核中移植了一部分 eBPF 能力 (opens new window)
    • 在这两个发行版中,DeepFlow 支持的详细内核版本如下(依赖的 Hook 点 (opens new window)):
      • 3.10.0-957.el7.x86_64
      • 3.10.0-1062.el7.x86_64
      • 3.10.0-1127.el7.x86_64
      • 3.10.0-1160.el7.x86_64
    • 注意 RedHat 的申明:

      The eBPF in Red Hat Enterprise Linux 7.6 is provided as Tech Preview and thus doesn't come with full support and is not suitable for deployment in production. It is provided with the primary goal to gain wider exposure, and potentially move to full support in the future. eBPF in Red Hat Enterprise Linux 7.6 is enabled only for tracing purposes, which allows attaching eBPF programs to probes, tracepoints and perf events.

  • [2]: 容器内部的 Golang/OpenSSL 进程不支持
  • [3]: 在内核 4.14 版本中,一个 tracepoint 不能被多个 eBPF program attach(如:不能同时运行两个或多个 deepflow-agent),其他版本不存在此问题

deepflow-agent 运行权限的要求:

  • 当运行于 K8s 环境下,采集 K8s 信息需要的权限包括
    • [必须] 容器权限:HOST_PID
    • [建议] 内核权限:SYS_ADMIN
      • 不具备该权限时使用解析 ARP/ICMPV6 包获取 rootns 下网卡名、Pod IP 和 Pod MAC 的映射关系,并打印 WARN 日志
    • [必须] 内核权限:SYS_PTRACE
    • [建议] 文件权限:/var/run/netns 目录只读权限
      • 不具备该权限时,会影响获取容器网络命名空间的性能
      • deepflow-agent 会优先从这个目录获取容器的网络命名空间
      • 如果无法访问此目录则通过 /proc/$pid/ns/net 来获取容器的网络命名空间,此时有两个问题:
        • 进程停止了,这个文件会消失
        • 不同的 PID 可能对应同一个命名空间
  • 采集 AF_PACKET 流量需要的权限包括
    • [必须] 容器权限:HOST_NET
    • [必须] 内核权限:NET_RAWNET_ADMIN
    • [建议] 内核权限:IPC_LOCK(包含 MAP_LOCKED、MAP_NORESERVE)
      • 不具备该权限时 cBPF 性能会受到显著影响,且会打印 WARN 日志提醒
  • 采集 eBPF 数据需要的权限包括
    • [必须] 系统权限:SELINUX = disabled
    • [建议] 内核权限:SYS_ADMIN
      • 在内核 Linux 5.8+ 下可以不需要 SYS_ADMIN,使用 BPFPERFMON 的组合替代
      • 使用 SYS_ADMIN 权限无内核 Linux 5.8+ 版本依赖
    • [必须] 内核权限:SYS_RESOURCESYSLOG
    • [必须] 文件权限:/sys/kernel/debug/ 目录只读权限
      • 由于 kprobe、uprobe 类型探测点的 attach/detach 操作依赖于内核 debug 子系统,不具备该权限则无法开启 eBPF
      • 同时,由于该目录只能由 root 用户访问,所以 deepflow-agent 进程只能以 root 用户运行
    • [必须] 确保文件 /proc/sys/kernel/kptr_restrict 内容不等于 2,否则 Continuous Profiler 将不能使用
      • kptr_restrict 值为 2 时, 所有用户都无法读取内核符号地址,即使给予 CAP_SYSLOG 权限也无法读取内核地址
      • agent 在启动时会检测内核符号地址,如果无法读取会打印 WARN 日志提醒
      • 一般系统这个值默认为 1,如果这个值为 2 用户可提前将该文件内容设置为 1
    • [建议] 文件权限:/proc/sys/net/core/bpf_jit_enable 文件读写权限
      • 该文件内容不等于 1 时 eBPF 性能会受到显著影响
        • 当该值为 1 时,deepflow-agent 会读取该值,若不具备读取权限会打印 WARN 日志提醒
        • 当该值不为 1 时,deepflow-agent 会尝试修改为 1,若修改失败会打印 WARN 日志提醒
      • 如果希望在不赋予写权限的同时获得良好的 eBPF 性能,用户可提前将该文件内容设置为 1
      • K8s 下 deepflow-agent DaemonSet 会默认开启一个特权 init container 将该值设置为 1,使得 deepflow-agent 可运行于非特权模式下

deepflow-agent 调用 K8s apiserver 同步信息需要以下资源的 get/list/watch 权限:

  • nodes
  • namespaces
  • configmaps
  • services
  • pods
  • replicationcontrollers
  • daemonsets
  • deployments
  • replicasets
  • statefulsets
  • ingresses
  • routes

另外关联 K8s 标签信息需要对 CNI 进行适配,目前 DeepFlow 已适配的 CNI 包括:

  • Flannel
  • Calico
  • Cilium
  • Multus
  • Open vSwitch
  • Weave
  • TKE GlobalRouter
  • TKE VPC-CNI
  • ACK Terway
  • QKE HostNIC
  • IPVlan
  • MACVlan 额外配置