摘要:請谷歌一波,會有遍地的解釋。網絡抓包實現使用實現網絡抓包非常容易。得益于谷歌的包這里我舉一個監聽網卡的主要代碼網卡名這段代碼就是監聽某個網卡,通過規則過濾點無用網絡包,規則語法與一樣。網絡抓包監控的優缺點優點應用無關性,監控工具通用性強。
微服務是什么?
此話題不是本文重點,如你還不知道。請谷歌一波,會有遍地的解釋。引用下圖說明下微服務可能呈現的形態:
監控的目的是為了讓集群中所有的服務組件,不管是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.Option.Protocol) }
如上代碼簡單處理四層模型網絡包。一般你可以從網絡層獲取雙方ip地址,從傳輸層獲取雙方端口以及tcp包的相關信息。從應用層獲取應用數據。
具體的怎么優化和實踐就留給大家自己嘗試吧。
優點:
應用無關性,監控工具通用性強。
數據全面性,你可以獲取很多直接和間接反應應用狀態的數據。
不侵入代碼,一般不影響網絡。
高并發下不影響應用。
缺點:
資源消耗,抓包分析包是一個物理資源消耗的過程。
需要自己開發。
總之,就像上文說得一樣。如果你的需求只是想監控一個應用。你就別考慮這個方案了。如果你想監控集群中所有應用,你可以嘗試。
云盟認證成員:barnett
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32524.html
摘要:大家好今天我分享的主題與游戲行業相關,為大家介紹的是在騰訊游戲中的應用實踐。隨著技術的興起,我們開始調研在游戲容器化方面的應用。也就是說,將不同游戲業務部署到同一臺母機,采用綁定核的方式。在母機上架部署時,創建設備和設備并將它們進行關聯。 今天小數的推送內容來自騰訊互娛高級工程師黃惠波,讓我們一起來看看吧~~~ 黃惠波,騰訊互娛高級工程師目前主要負責游戲計算資源容器化平臺的研發工作,包...
摘要:容器云將支持應用的一鍵式部署交付,提供負載均衡,私有域名綁定,性能監控等應用生命周期管理服務。本容器云平臺,對接持續集成發布系統。 前言 在移動互聯網時代,新的技術需要新技術支持環境、新的軟件交付流程和IT架構,從而實現架構平臺化,交付持續化,業務服務化。容器將成為新一代應用的標準交付件,容器云將幫助企業用戶構建研發流程和云平臺基礎設施。縮短應用向云端交付的周期,降低運營門檻。加速向互...
摘要:容器云將支持應用的一鍵式部署交付,提供負載均衡,私有域名綁定,性能監控等應用生命周期管理服務。本容器云平臺,對接持續集成發布系統。 前言 在移動互聯網時代,新的技術需要新技術支持環境、新的軟件交付流程和IT架構,從而實現架構平臺化,交付持續化,業務服務化。容器將成為新一代應用的標準交付件,容器云將幫助企業用戶構建研發流程和云平臺基礎設施。縮短應用向云端交付的周期,降低運營門檻。加速向互...
摘要:阿里云容器服務已經發布了基于容器集群的開源區塊鏈解決方案,利用容器技術可以在分鐘之內部署完成一個生產級別安全高可用的區塊鏈應用運行環境,幫助企業可以加速業務創新。對節點,阿里云服務會自動開啟相應調度能力。 摘要: 阿里云ECS彈性裸金屬服務器(神龍)已經與其容器服務全面兼容,用戶可以選擇在彈性裸金屬服務器上直接運行容器、管控Kubernetes/Docker容器集群,如此將會獲得非常出...
摘要:本文中,我們將描述系統的架構開發演進過程,以及背后的驅動原因。應用管理層提供基本的部署和路由,包括自愈能力彈性擴容服務發現負載均衡和流量路由。 帶你了解Kubernetes架構的設計意圖、Kubernetes系統的架構開發演進過程,以及背后的驅動原因。 showImg(https://segmentfault.com/img/remote/1460000016446636?w=1280...
閱讀 4006·2023-04-26 02:13
閱讀 2249·2021-11-08 13:13
閱讀 2737·2021-10-11 10:59
閱讀 1737·2021-09-03 00:23
閱讀 1307·2019-08-30 15:53
閱讀 2285·2019-08-28 18:22
閱讀 3056·2019-08-26 10:45
閱讀 735·2019-08-23 17:58