eBPF 实践 -- 网络可观测
简介
观测云采集器,是一款开源、一体式的数据采集 Agent,它提供全平台操作系统支持,拥有全面数据采集能力,涵盖基础设施、指标、日志、应用性能、用户访问以及安全巡检等各种场景。通过 eBPF 技术的引入,观测云采集器实践了网络传输层和应用层的部分协议的可观测。
采集器架构
采集管理:配置加载模块用于配置动态管理与采集插件的开启关闭;监视器模块用于查看采集器资源使用、采集插件开启、数据处理器脚本工作状况、采集器外部数据接入API 的响应与延迟信息等
数据采集:采集器不仅可以通过内置插件进行数据采集,还能接入外部数据源,如云原生计算基金会下的可观测项目 OTEL 的链路、指标数据等
数据清洗:在采集插件生成数据后和数据上传之间的数据清洗层,用户可以通过编程介入,如使用可编程数据处理器的语言编写脚本修改 Point ,使用内置函数分析提取网络数据中 IP 归属的城市、省份和国家到 Point 中;脚本支持动态加载和卸载
数据上传:采集器对各种数据进行分类上传,类别有日志、指标、链路、网络等,所有类别的数据均使用 Point 结构封装,每一个 Point 代表一条数据,大致由四个部分:名字、 标签字典、字段字典以及时间戳构成 (其名字可以是指标名 cpu, 日志来源 nginx ,网络的 httpflow等)
-
eBPF 技术应用
观测云采集器使用了三种类型的 eBPF 程序:socket filter、kprobe、uprobe,能够抓取以太网帧、跟踪与 socket 和 TCP/IP 协议栈相关的内核函数以及用户共享库函数,实现网络协议可观测。下图介绍观测云采集器如何实践 eBPF 技术进行主机上的网络观测。
数据采集
观测云采集器的 eBPF 网络观测功能采集并生成了三个数据集,分别为 netflow, dnsflow 和 httpflow,其 tag 基本相同,以下是其 tag 名与描述。
Tag 名 描述 src_ip 源 IP dst_ip 目标 IP src_port 源端口 dst_port 目标端口 transport tcp 或 udp family IPv4 或 IPv6 direction 传输方向(incoming/outgoing) srciptype 源 IP 类型 (other/private/multicast) dstiptype 目标 IP 类型 (other/private/multicast) host 主机名 source 数据源(netflow,httpflow,dnsflow) pid 进程 id,仅 netflow dst_domain 仅 netflow,来自 dnsflow 抓包记录 srck8snamespace 源 service 归属的 namespace srck8sdeployment_name 源 serivce 归属的 deployment srck8sservice_name 源 service srck8spod_name 源 pod dstk8snamespace 目标 service 归属的 namespace dstk8sdeployment_name 目标 serivce 归属的 deployment dstk8sservice_name 目标 service dstk8spod_name 目标 pod sub_source 子来源,默认 N/A,如若为 Kubernetes 流量则为 K8s 传输层网络观测
采集器使用 kprobe 类型 eBPF 程序获取部分内核函数的输入与返回值
通过 inetbind(6) 函数判断 srcip + src_port 是否为服务端
通过协议栈 tcp\udp 以及 ip 相关的内核函数,获取服务与客户端之间的流量大小以及 TCP 协议的连接的建立与关闭次数、重传和 RTT 信息
Field 名 描述 bytes_read 接收字节数 bytes_written 发送字节数 retransmits 重传次数 rtt rtt rtt_var rtt_var tcp_closed TCP 连接关闭次数 tcp_established TCP 连接建立次数 应用层网络观测
采集器使用 AF_PACKET + BPF 在采集器上分析 DNS 请求,以支持 CentOS(RedHat)7.6 (其不支持 socket filter 类型 eBPF 程序),记录请求信息支持 netflow 进行域名反向解析;
对于 HTTP 请求使用 socket filter 和 uprobe 类型 eBPF 程序实现 HTTP(S) 请求分析。
下面的为采集 dns 协议生成的字段 和 http 协议生成字段。
Field 名(dns) 描述 count 一个采集周期内的请求总数 latency DNS 平均请求响应时间间隔 latency_max DNS 最大请求的响应时间间隔 rcode DNS 响应码: 0 - NoError, 1 - FormErr, 2 - ServFail, 3 - NXDomain, 4 - NotImp, 5 - Refused, ... Field 名(http) 描述 count 一个采集周期内的请求总数 http_version 1.1 / 1.0 ... latency TTFB method GET/POST... path 请求路径 status_code 状态码,如 200, 301, 404 ... truncated 请求路径长度达到采集的(约 150)字节上限,存在截断可能 用户地理分布及 TCP 时延
通过内置数据处理器编写脚本,来解析 ip 并获取 ip 归属的省份、国家等信息作为标签追加到生成的 Point 上,并在观测云前端创建仪表板。下图通过世界地图和中国地图展示 netflow 中客户端 ip 的地理分布和服务端之间的 tcp 时延。
主机间四层网络拓扑
下图为当前工作空间内部署了观测云采集器并开启了 eBPF 网络采集器的主机间的网络拓扑图,图上我们可以看到主机间的数据发送与接受的字节数和网络波动等信息。
K8s Pod 间网络拓扑
当 eBPF 采集插件获取到 K8S 的 ip 和端口信息后将自动追加到生成的数据上,通过观测云前端构建不同的网络拓扑图,下图是构建的 Pod 网络拓扑关系图。
K8s Deployment 间网络拓扑
下图是构建的 Deployment 网络拓扑关系图,从图中可以看到 nginx deployment 上的 HTTP 协议的每秒请求数和请求错误率。
eBPF 实践 -- 网络可观测的更多相关文章
- C项目实践--网络协议和套接字编程
1.TCP/IP协议 TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议,ICMP(Internet Control Message Proto ...
- 聊聊风口上的 eBPF
eBPF 是一个用于访问 Linux 内核服务和硬件的新技术,由于其灵活性和高性能等特点,被迅速用于网络.出错.跟踪以及防火墙等多场景.目前国内已有少数企业开始尝试将 eBPF 引入生产实践,又拍云也 ...
- 2017-2018-2 20155315《网络对抗技术》Exp9 :Web安全基础
实验目的 理解常用网络攻击技术的基本原理. 教程1 教程2 教程3 实验内容 SQL注入攻击 XSS攻击 CSRF攻击 Webgoat前期准备 从GitHub上下载jar包 拷贝到本地,并使用命令ja ...
- 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础
目录 实验目的 实验内容 Webgoat前期准备 出现的问题 (一)SQL注入攻击 命令注入:Command Injection 数字型注入:Numeric SQL Injection 日志欺骗:Lo ...
- eBPF会成为服务网格的未来吗?
服务网格现状 服务网格为服务提供了复杂的应用层网络管理,如服务发现.流量路由.弹性(超时/重试/断路).认证/授权.可观察性(日志/度量/追踪)等. 在分布式应用的早期,这些要求是通过直接将所需的逻辑 ...
- Rainbond结合NeuVector实践容器安全管理
前言 Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器.Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期.但是随着云原生时代的一点点 ...
- 关于docker
摘要: 最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术.为此,我们列了一个路线图供大家学习Docker和阿里云容器服务.这个列表包含了一些社区的优秀资料和我们的原创文章.我们会随着 ...
- 说说SACC2016第八届架构师大会
每年这方面的会议很多,不知不觉已经连续举办八年了.一届比一届办的有质量,规模越大.今年也如约而至.2016-10-27在北京万达索菲特酒店.4000多人规模,云集各领域顶尖架构师,运维,云计算,技术专 ...
- WEB前端学习资源清单
常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...
- OVS
基于 OpenvSwitch的OpenFlow实践 Open vSwitch 概述 OpenvSwitch(简称OVS)是由NiciraNetworks主导的,运行在虚拟化平台(例如 KVM,Xen) ...
随机推荐
- Docker问题:"docker build" requires exactly 1 argument.
今天在搭建Docker私有仓库的时候.提示错误:"docker build" requires exactly 1 argument. 原因是因为(少了一个 '.' , '.' 代 ...
- VM虚拟机安装和使用
作者:菘蓝 时间:2022/8/30 ================================================================================= ...
- 【Vue项目笔记】—— 父子组件之间传递参数和子组件执行父组件中的方法
父组件(MyBlog.vue) <template> <!-- Delete Modal --> <!-- 注意:这里的@deleteBlog中的deleteBlog要和 ...
- vivo 全球商城:电商平台通用取货码设计
vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...
- SDN实验环境安装配置
- 微信小程序-全局配置、组件、页面跳转、用户信息等
全局配置 三个页面 app.json pages字段 "pages":[ "pages/index/index", # 首页 "pages/home/ ...
- 【设计模式】Java设计模式 - 模板模式
Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- Traefik 2.0 实现灰度发布
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484478&idx=1&sn=238390dc ...
- Elasticsearch:管理 Elasticsearch 内存并进行故障排除
文章转载自:https://elasticstack.blog.csdn.net/article/details/116974695
- Java Maven项目之Nexus私服搭建和版本管理应用
转载自:https://cloud.tencent.com/developer/article/1010603 1.Nexus介绍 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓 ...