《Kubernetes 中分析调试网络流量的4种方法.docx》由会员分享,可在线阅读,更多相关《Kubernetes 中分析调试网络流量的4种方法.docx(10页珍藏版)》请在优知文库上搜索。
1、摘要Kubernetes中的应用出了问题,往往需要进行网络抓包分析.本文介绍了在Kubernetes中网络调试分析的4种方法。-X-t-刖三在当今世界,分布式系统,微服务/SOA架构遍地,服务之间的许多交互和通信都不再是同一主机的不同线程或进程,而是跨主机,甚至跨网络区域。那么一旦相关服务出现问题,我们就会需要调试服务间的通讯、主机间的网络Kubernetes中的应用出了问题,往往需要进行网络抓包分析。本文介绍了在Kubernetes中网络调试分析的4种方法。1使用sidecar2、使用netshoot-一个DOCker+Kubemetes网络故障排除的瑞士军刀容器3、NetworkNames
2、pace4、使用kubectl插件-ksniff方法一:使用SidecarSidecar应用范围不仅仅止于此,比如:APM监控的agent就可以通过这种方式来挂载。Sidecar前来救援!在过去的几个月里,我尝试了各种方法来克服这个问题,最终形成了我将在本文中概述的方法。它是捕获KubernetesZOpenShiftpods之间的网络流量数据的简单方法,允许开发人员更好地分析和调试容器化应用程序中的通信问题,并更快、更有效地解决问题。我们将使用tcpdump捕获一个所谓的PCAP(packetCaPtUre)文件,该文件将包含pod的网络流量。然后可以将这个PCAP文件加载到Wireshar
3、k之类的工具中来分析流量,在本例中,分析在pod中运行的服务的RESTful通信。在本文中,我将使用RedHatProcessAutomationManager产品的KIE服务器(执行服务器)作为示例,但是这种方法应该适用于任何类型的容器化应用程序。要克服的第一个问题是Kubernetespod中tcpdump命令的可用性。KIE服务器容器映像没有安装tcpdumpo其次,容器不提供从RedHat存储库安装tcpdump的实用程序。为了克服这个问题,我们使用了“sidecar容器”的概念。Sidecar概念sidecar容器是与实际服务/应用程序运行在相同pod中的容器,能够为服务/应用程序提
4、供附加功能。SideCar容器的一个例子是Istio的Envoysidecar,它使POd成为服务网格的一部分。在本例中,我们将部署一个SideCar容器,该容器提供tcpdump实用程序。由于POd中的多个容器共享相同的网络层,所以我们可以使用sidecar来捕获进出KIE服务器的网络流量。部署Sidecar在这个例子中,我部署了RedHatProcessAutomationManager7MortgageDemo,它将在我的OpenShiftnamespace中创建两个pod。一个pod运行BusinessCentralworkbench,W一个POd是执行服务器的pod。这两个组件之间的
5、通信是通过REST完成的,这是我们将要捕获的流量。我们的目标是捕获KIE服务器pod上的网络流量,以便分析BusinessCentralworkbench发送给KIE服务器的RESTful命令。要做到这一点,我们首先需要附加(attach)一个sidecar到KIE服务器的pod.1、在OVerVieW页面中,单击要分析的pod的名称。这将打开一部署配置(DeploymentConfig,简称DC1.页面。2、在一部署配置_屏幕的音上角,单击AetiOnSEditYAM1.。这将打开DC的YAM1.配置。3、向下滚动,直到看到单词containers。我们将添加一个额外的容器,安装了tcpdu
6、mp的sidecar到pod中。直接在containers定义下添加以下YAM1.片段::tcpdumplMg:corfrtcpduaa7ortg9e-kleserverZme:rhpa7ortg9kesRrverspec:CCCtdIrlUrS:-nane:tcptfunpi*age:corfr/tcpdunpCOMMnd:-binsleep-infinity-CAV:-nw:DATASOURCESvalue:M必-M*:RHPDATABASEvalue:rhn74、保存配置。这将部署一个新的pod,它现在由两个容器组成:一个容器包含KIE服务器,另一个容器包含我们的tcpdump工具,它将
7、无限期地持续运行。捕获和分析流量随着SideCar的部署和运行,我们现在可以开始捕获数据了。我尝试的方法之一是使用OCrsh命令远程执行SideCar中的tcpdump命令,将网络数据流输出到FlFO文件,并将数据直接导入WireShark。由于各种原因,这种方法失败了。其中一个问题是,tcpdump向stderr发送信息消息,但是这些消息与stdout在相同的流中,并且是通过SSH接收,从而破坏了进入WireShark的数据。我最后使用的方法是登录到SideCar容器,并在sidecar中运行tcpdump命令来创建PCAP文件。当您捕获了足够的数据后,就可以停止捕获过程并将PCAP文件复制
8、到您希望使用WireShark进行网络流量分析的机器上。具体步骤如下:1、在您的开发机器上,用。C客户端连接到OPenShift实例,并激活正确的项目(project,即namespace)运行OCgetpods命令来列出您的pods:dA21RE21STATUSRESTARTSAGERunning031mRunning19hHuncans-MacBook-Pro:ddoy1.eSocgetNAMErhpm7-mortgge-kieserver-2-zcpsnrhpam7-mortgage-rhpafncentr-2-phc7tDuncans-MacBook-Pro:ddoyle$I2、使用以
9、下命令登录到我们的KlE服务器pod的tcpdump容器中:oCrsh-ctcpdumprhpam7-mortgage-kieserver-2-zcpsn3、在tcpdump容器中,运行此命令以启动网络流量捕获过程:tcpdump-s0-n-WZtmpZkieservenpcap4、运行要分析的网络流量的测试。在本例中,我将从BusinessCentralworkbench中启动一个业务流程,它将向KIE服务器发送一个RESTful请求。5、捕获足够的数据后,在tcpdump容器中使用Ctrl+C完成捕获过程。6、回到本地机器。将PCAP文件,pod复制到本地机器:occp-ctcpdumpr
10、hpam7-mortgage-kieserver-2-zcpsn:tmp/kieserver.pcapkieserver.pcap7、用Wireshark打开PCAP文件并分析网络流量。在这个例子中,我正在分析我的HTTPPOST方法,它创建了Mortgage进程的一个新实例:.IM*v*twH.53Ql9.l“三*丁丁丁FHEQ47yE总结在容器环境(如Kubernetes和/或OPenShift)中分析pod之间的网络通信可能比在非容器环境中更困难一些。然而,sidecar容器的概念为开发人员提供了一种简单的工具,可以将容器连同所需的开发工具和实用程序附加到微服务pod上。这避免了开发人员
11、必须在应用程序容器映像本身中安装这些调试工具,从而保持容器的轻便和干净。使用像OCrsh和OCCD这样的OpenShift工具,我展示了如何轻松地从pod捕获网络流量数据并将数据带到开发机器进行分析。方法二:使用netshootNetshoot-Docker+Kubernetes网络故障排除的瑞士军刀容器用途Docker和Kubernetes网络故障排除变得复杂。通过正确理解Docker和Kubernetes网络的工作方式和正确的工具集,您可以排除故障并解决这些网络问题。netshoot容器有一组强大的网络troubleshoot工具,可以用来排除Docker网络问题。与这些工具一起出现的还有
12、一组用例,展示了如何在真实场景中使用这个容器。NetworkNamespaces-网络名称空间在开始使用这个工具之前,有一点很重要:网络名称空间。网络名称空间提供与网络相关的系统资源的隔离。DoCker使用网络和其他类型的名称空间(pid、mountUSer)为每个容器创建一个隔离的环境。从接口、路由到ip的所有内容都完全隔离在容器的网络名称空间中。KUbenIeteS也使用网络名称空间。Kubelets为每个pod创建一个网络名称空间,其中该POd中的所有容器共享相同的网络名称空间(eths、IP、tcp套接字)。这是Docker容器和Kubemetespod之间的关键区别。名称空间很酷的一
13、点是您可以在它们之间进行切换。您可以输入不同容器的网络名称空间,使用甚至没有安装在该容器上的工具在其网络堆栈上执行一些故障排除。此外,netshoot可以通过使用主机的网络名称空间来对主机本身进行故障排除。这允许您在不直接在主机或应用程序包上安装任何新包的情况下执行任何故障排除。针对容器的用法容器的网络名称空间:如果您的应用程序的容器存在网络问题,您可以像这样使用容器的网络名称空间启动netshoot:$dockerrun-it-netcontainer:nicolaka/netshoot主机的网络名称空间:如果您认为网络问题在于主机本身,那么可以使用该主机的网络名称空间启动netshoot。
14、命令:$dockerrun-itnethostnicolaka/netshoot网络的网络名称空间:如果要对Docker网络进行故障排除,可以使用nsenter输入网络的名称空间。这将在下面的nsenter部分进行解释。针对Kubernetes的用法grmtr80集你耳,:开一个eWHH9a1.tkubectlrun-gertor三run-pxlvltap-shell-r-1-tty-iteMcol*nethoot-b1nbsBII砌B在主VRM4g骅空其上所$tabctlruneeneratorirun-po4/vl-r,-tty-Krride(o*tMetwork*;true111oUMn
15、h%比逋样的黑也M00t也可必过5g仅方式注灯使用.网络问题许多网络问题可能导致应用程序性能下降。其中一些问题可能与底层网络基础设施有关。其他问题可能与主机或DoCker级别的配置错误有关。让我们来看看常见的网络问题:延迟(IatenCy)路由(routing)DNS解析(DNSresolution)防火墙(firewall)不完整的ARP(incompleteARPs)为了解决这些问题,netshoot包含了一组强大的工具,如图所示。1.inuxFterformanceObservabilityToolsIsofpcstatidstatPerfftractapIttngIbCC(BPF)5bpftrace5OperatingSystemApplicationsSystomCallInterfaceFileSy