python微服务监控_基于网络抓包实现kubernetes中微服务的应用级监控
微服务是什么?
此话题不是本文重点,如你还不知道。请谷歌一波,会有遍地的解释。引用下图说明下微服务可能呈现的形态:
微服务监控的挑战
监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库服务,还是中间件服务。都能够健康稳定得运行,能发现问题,遇到问题能找到原因。
在过去,监控工具侧重于基础设施或单一软件组件以及衡量运营健康。这些工具在实现这一目标方面只取得了一定的成功,但是对于单一的,传统的应用程序和基础设施来说效果不错。微服务的出现暴露了工具中的弱点。
现在,组件托管在位于私有云,公共云或两者的混合体之间的虚拟化机器或容器内。获悉我并不需要关心服务cpu用了多少,内存用了多少?确保这些服务相互通信以提供所需的结果需要从监控的角度重要看几件事情:
微服务集群中是否所有的服务的吞吐率,响应时间都正常?
服务调用线中哪些线负载过大,哪些线负载过小?
服务的错误率,例如HTTP 500错误。
我们想要监控分析应用,从它的服务状态出发是否更直接呢?
已有监控方案
目前有些厂商提出了微服务的监控解决方案。
从APM角度监控服务端到端状态。
为每种类型服务开发agent收集应用状态信息。
通过产生统一的应用日志分析监控方案
其他方案
每一种商业或开源方案都有它的优势所在。可以根据你的需求来进行选择。例如你的所有服务都是自己研发,日志标准一致or能够统一处理。所有访问信息都能打出日志,那么我认为日志分析可能是你最适合的方案。但是对于公有云平台,那就不同了。
好雨云帮采用的方案
好雨云帮提供了公有云和私有化的部署方式,平台内部署的服务各式各样。各种通信协议,各种日志标准。我们怎么实现对所有服务的应用状态监控?好雨云帮完善的租户网络,环境隔离,因此我们提供用户在自己环境下安装自己的监控组件,我们的基础数据收集是通过网络分析。下文详细讲解:
kubernetes POD共享机制
kubernetes中pod内容器共享网络空间,挂在卷等为我们监控pod内主服务容器提供方便。其实按照官方对pod的定义的使用面来说:
* content management systems, file and data loaders, local cache managers, etc.
* log and checkpoint backup, compression, rotation, snapshotting, etc.
* data change watchers, log tailers, logging and monitoring adapters, event publishers, etc.
* proxies, bridges, and adapters
* controllers, managers, configurators, and updaters
pod内除了主服务外我们可以部署一些附属服务。之前的文章我谈过使用pod的插件服务收集处理日志。今天我再谈使用pod的网络便利监控主服务应用级指标。
通过共享的网卡抓包分析网络流量反应应用状况
我们拿一个http服务为例,我们监控网络流量能拿到几乎所有访问和服务返回信息。例如1分钟内多少request,分别请求哪些path,多长时间服务返回了。返回状态码等等信息。
要获得以上的数据,我们需要获取到网络包,解码网络包然后获得http协议数据。
我们WatchData服务容器与应用容器在同pod中,经过应用容器eth0网卡的流量我们再WatchData容器中eth0网卡获取。通过解码网络包获取http报文头关键信息,每一个Response形成一个消息发送到server端完成分析,存储然后形成连续的实时的监控数据。下图展现个简要的整体架构图:
当然,上文已经说了,我们采取此方案主要就是为了能够监控各种应用,只是http怎么行。不通的通信应用使用不同的通信协议,比如mysql的协议,mongodb的协议。TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。。我们抓取到的网络包信息也是四层模型。
网络抓包Golang实现
使用golang实现网络抓包非常容易。得益于谷歌的包:
github.com/google/gopacket
github.com/google/gopacket/layers
github.com/google/gopacket/pcap
这里我举一个监听网卡的Demo主要代码
//device 网卡名
if handle, err := pcap.OpenLive(device, int32(n.Option.Snaplen), true, n.Option.TimeOut); err != nil {
log.With("error", err.Error()).Errorln("PCAP OpenLive Error.")
return 1
} else if err := handle.SetBPFFilter(n.Option.Expr); err != nil { // optional
log.With("error", err.Error()).Errorln("PCAP SetBPFFilter Error.", n.Option.Expr)
return 1
} else {
log.Infoln("Start listen the device ", device)
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
go func(close chan struct{}, h *pcap.Handle) {
for {
select {
case packet := <-packetSource.Packets():
n.handlePacket(packet) // Do something with a packet here.
case <-close:
log.Infoln("stop listen the device.")
h.Close()
return
}
}
}(n.Option.Close, handle)
}
这段代码就是监听某个网卡,通过n.Option.Expr规则过滤点无用网络包,规则语法与linux tcpdump一样。参考:PCAP-FILTER
接收到网络包一般有多种类型:2层模型的包,和4层模型的包。如果你不关注tcp握手这种类型的包你只需要关注具有四层模型的网络包。
n.handlePacket(packet)处理网络包。
app := packet.ApplicationLayer()
if app != nil {
//log.With("type", app.LayerType().String()).Infoln("Receive a application layer packet")
//log.Infoln(packet.String())
go func() {
sd := &SourceData{
Source: app.Payload(),
ReceiveDate: packet.Metadata().Timestamp,
}
tran := packet.TransportLayer()
if tran != nil {
src, dst := tran.TransportFlow().Endpoints()
sd.SourcePoint = &src
sd.TargetPoint = &dst
if tran.LayerType().Contains(layers.LayerTypeTCP) {
tcp := &layers.TCP{}
err := tcp.DecodeFromBytes(tran.LayerContents(), gopacket.NilDecodeFeedback)
if err != nil {
log.With("error", err.Error()).Errorln("Decode bytes to TCP error")
} else {
sd.TCP = tcp
}
}
}
netL := packet.NetworkLayer()
if netL != nil {
src, dst := packet.NetworkLayer().NetworkFlow().Endpoints()
sd.SourceHost = &src
sd.TargetHost = &dst
}
decode := FindDecode(n.Option.Protocol)
if decode != nil {
decode.Decode(sd)
} else {
log.Debugf("%s protol can not be supported \n", n.Option.Protocol)
}
如上代码简单处理四层模型网络包。一般你可以从网络层获取双方ip地址,从传输层获取双方端口以及tcp包的相关信息。从应用层获取应用数据。
具体的怎么优化和实践就留给大家自己尝试吧。
网络抓包监控的优缺点
优点:
应用无关性,监控工具通用性强。
数据全面性,你可以获取很多直接和间接反应应用状态的数据。
不侵入代码,一般不影响网络。
高并发下不影响应用。
缺点:
资源消耗,抓包分析包是一个物理资源消耗的过程。
需要自己开发。
总之,就像上文说得一样。如果你的需求只是想监控一个应用。你就别考虑这个方案了。如果你想监控集群中所有应用,你可以尝试。
云盟认证成员:barnett
python微服务监控_基于网络抓包实现kubernetes中微服务的应用级监控相关推荐
- 基于网络抓包实现kubernetes中微服务的应用级监控
微服务是什么? 此话题不是本文重点,如你还不知道.请谷歌一波,会有遍地的解释.引用下图说明下微服务可能呈现的形态: 微服务监控的挑战 监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库 ...
- 基于网络抓包实现K8S中微服务的应用级监控
微服务监控的挑战 监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库服务,还是中间件服务.都能够健康稳定的运行,能发现问题,遇到问题能找到原因.在过去,监控工具侧重于基础设施或单一软件 ...
- xmpp协议抓包_开源网络抓包与分析框架学习-Packetbeat篇
开源简介 packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP.MySQL.Redis等.在实际使用中,通常和Elasticsearch以及kibana联合使 ...
- 基于netty的微服务网关_基于Rx-netty和Karyon2的云就绪微服务
基于netty的微服务网关 Netflix Karyon提供了一个干净的框架来创建可用于云的微服务. 在您的组织中,如果您使用包含Eureka的Netflix OSS堆栈进行服务注册和发现,使用Arc ...
- java 网络抓包_基于java的网络抓包方法
本实验是用java实现的网络抓包程序,在windows环境下安装winpcap4.0和jpcap6.0后,下载eclipse和jigloo插件(一种在eclipse底下作图形化开发的工具),将其安装好 ...
- Python下的网络抓包库
一直以来对于Python下的网络抓包库很疑惑,搞不清楚pylibpcap.pypcap.pycap这些库之间是什么关系,混沌了很长时间,在网上G了很久慢慢搞清楚了,其实这些都是libpcap的Pyth ...
- 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap
最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...
- 网络抓包与流量在线分析系统的设计与实现-基于libpcap在MacOS上实现 记录这愉快(DT)的一周
网络抓包与流量在线分析系统的设计与实现-基于libpcap在MacOS上实现 记录这愉快(DT)的一周 要求: 基于LINUX系统设计并实现一个网络流量的分析系统.该系统具有以下功能:(1)实时抓取网 ...
- 【Fidder网络抓包+Python爬虫】下载微信小程序视频
首先声明本篇博客以学习为目的,侵权即删. 文章目录 1. Fidder抓包 1.1 在电脑上打开微信小程序视频播放页以及Fidder软件 1.2 点击视频播放按钮,并查看Fidder抓到的数据包 2. ...
最新文章
- 魔与道的反复较量 反垃圾邮件技术
- 13 迷人的注册表单设计
- PI=3.1415926....
- 如何完美隐藏Disposable的存储和销毁过程(二)
- 配置一个 MVC 项目时 遇到的
- Stream流综合练习
- key位置 win10生成的ssh_Git实现ssh免密登录
- c#滚动条创建实例,多线程
- 实体与属性间的划分原则
- axios 注册拦截器 cdn引用_CDN加速原理
- 1月Web服务器份额之争:仅Microsoft份额下降
- 修改chrome中HTML元素,自由更改网页中的任何内容:Hack this page
- Python基础090:解决jupyter notebook无法自动跳转chrome浏览器的问题
- 程序员如何选择外包平台
- 机器学习进阶 第一节 第一课
- HTML 制作简单的下拉菜单
- Ubuntu 桌面死机后重启桌面方法
- 变身后是一只火鸟的机器人_中生代机器人 第一章 丛林求生历险记 05 (05)一-望书阁...
- Flutter 设置 App 的主色调与字体
- 【solidity】函数修饰器(Function Modifiers)