Kubernetes中分析调试网络流量_第1页
Kubernetes中分析调试网络流量_第2页
Kubernetes中分析调试网络流量_第3页
Kubernetes中分析调试网络流量_第4页
Kubernetes中分析调试网络流量_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Kubernetes 中分析调试网络流量 目 录 TOC o 1-3 h z u HYPERLINK l _Toc66544245 Kubernetes 中分析调试网络流量 PAGEREF _Toc66544245 h 1 HYPERLINK l _Toc66544246 前言 PAGEREF _Toc66544246 h 3 HYPERLINK l _Toc66544247 方法一:使用 Sidecar PAGEREF _Toc66544247 h 3 HYPERLINK l _Toc66544248 Sidecar 前来救援! PAGEREF _Toc66544248 h 4 HYPER

2、LINK l _Toc66544249 部署 Sidecar PAGEREF _Toc66544249 h 4 HYPERLINK l _Toc66544250 捕获和分析流量 PAGEREF _Toc66544250 h 6 HYPERLINK l _Toc66544251 总结 PAGEREF _Toc66544251 h 7 HYPERLINK l _Toc66544252 方法二:使用 netshoot PAGEREF _Toc66544252 h 7 HYPERLINK l _Toc66544253 用途 PAGEREF _Toc66544253 h 8 HYPERLINK l _T

3、oc66544254 Network Namespaces - 网络名称空间 PAGEREF _Toc66544254 h 8 HYPERLINK l _Toc66544255 针对容器的用法 PAGEREF _Toc66544255 h 9 HYPERLINK l _Toc66544256 针对 Kubernetes 的用法 PAGEREF _Toc66544256 h 9 HYPERLINK l _Toc66544257 网络问题 PAGEREF _Toc66544257 h 9 HYPERLINK l _Toc66544258 被包含的包 PAGEREF _Toc66544258 h 1

4、0 HYPERLINK l _Toc66544259 方法三:利用Network Namespace PAGEREF _Toc66544259 h 11 HYPERLINK l _Toc66544260 方法四:使用 kubectl 插件ksniff PAGEREF _Toc66544260 h 11 HYPERLINK l _Toc66544261 题外话:krew - kubectl 插件包管理器 PAGEREF _Toc66544261 h 11 HYPERLINK l _Toc66544262 使用方法 PAGEREF _Toc66544262 h 12【摘要】Kubernetes 中

5、的应用出了问题, 往往需要进行网络抓包分析. 本文介绍了在 Kubernetes 中网络调试分析的4种方法。前言在当今世界,分布式系统,微服务/SOA架构遍地,服务之间的许多交互和通信都不再是同一主机的不同线程或进程,而是跨主机,甚至跨网络区域。那么一旦相关服务出现问题,我们就会需要调试服务间的通讯、主机间的网络Kubernetes 中的应用出了问题,往往需要进行网络抓包分析。本文介绍了在 Kubernetes 中网络调试分析的4种方法。1、使用 sidecar2、使用netshoot- 一个 Docker + Kubernetes网络故障排除的瑞士军刀容器3、利用Network Namesp

6、ace4、使用 kubectl 插件 - ksniff方法一:使用 SidecarSidecar应用范围不仅仅止于此,比如:APM监控的agent就可以通过这种方式来挂载。Sidecar 前来救援!在过去的几个月里,我尝试了各种方法来克服这个问题,最终形成了我将在本文中概述的方法。它是捕获Kubernetes/OpenShift pods之间的网络流量数据的简单方法,允许开发人员更好地分析和调试容器化应用程序中的通信问题,并更快、更有效地解决问题。我们将使用tcpdump捕获一个所谓的PCAP(packet capture)文件,该文件将包含pod的网络流量。然后可以将这个PCAP文件加载到W

7、ireshark之类的工具中来分析流量,在本例中,分析在pod中运行的服务的RESTful通信。在本文中,我将使用Red Hat Process Automation Manager产品的KIE服务器(执行服务器)作为示例,但是这种方法应该适用于任何类型的容器化应用程序。要克服的第一个问题是Kubernetes pod中tcpdump命令的可用性。KIE服务器容器映像没有安装tcpdump。其次,容器不提供从Red Hat存储库安装tcpdump的实用程序。为了克服这个问题,我们使用了“sidecar容器”的概念。Sidecar 概念sidecar容器是与实际服务/应用程序运行在相同pod中的

8、容器,能够为服务/应用程序提供附加功能。sidecar容器的一个例子是Istio的Envoy sidecar,它使pod成为服务网格的一部分。在本例中,我们将部署一个sidecar容器,该容器提供tcpdump实用程序。由于pod中的多个容器共享相同的网络层,所以我们可以使用sidecar来捕获进出KIE服务器的网络流量。部署 Sidecar在这个例子中,我部署了 Red Hat Process Automation Manager 7 Mortgage Demo ,它将在我的OpenShift namespace中创建两个pod。一个pod运行Business Central workben

9、ch,另一个pod是执行服务器的pod。这两个组件之间的通信是通过REST完成的,这是我们将要捕获的流量。我们的目标是捕获KIE服务器pod上的网络流量,以便分析Business Central workbench 发送给KIE服务器的RESTful命令。要做到这一点,我们首先需要附加(attach)一个 sidecar 到KIE服务器的pod.1、在Overview页面中,单击要分析的pod的名称。这将打开_部署配置(Deployment Config, 简称DC)_页面。2、在_部署配置_屏幕的右上角,单击Actions - Edit YAML。这将打开DC 的YAML配置。3、向下滚动,

10、直到看到单词 containers 。我们将添加一个额外的容器,安装了tcpdump的sidecar到pod中。直接在 containers 定义下添加以下YAML片段:4、保存配置。这将部署一个新的pod,它现在由两个容器组成:一个容器包含KIE服务器,另一个容器包含我们的tcpdump工具,它将无限期地持续运行。捕获和分析流量随着sidecar的部署和运行,我们现在可以开始捕获数据了。我尝试的方法之一是使用oc rsh命令远程执行sidecar中的tcpdump命令,将网络数据流输出到FIFO文件,并将数据直接导入Wireshark。由于各种原因,这种方法失败了。其中一个问题是,tcpdu

11、mp向stderr发送信息消息,但是这些消息与stdout在相同的流中, 并且是通过SSH接收,从而破坏了进入Wireshark的数据。我最后使用的方法是登录到sidecar容器,并在sidecar中运行tcpdump命令来创建PCAP文件。当您捕获了足够的数据后,就可以停止捕获过程并将PCAP文件复制到您希望使用Wireshark进行网络流量分析的机器上。具体步骤如下:1、在您的开发机器上,用oc 客户端连接到OpenShift实例,并激活正确的项目(project, 即namespace),运行oc get pods命令来列出您的pods:2、使用以下命令登录到我们的KIE服务器pod的t

12、cpdump容器中:oc rsh -c tcpdump rhpam7-mortgage-kieserver-2-zcpsn3、在tcpdump容器中,运行此命令以启动网络流量捕获过程: tcpdump -s 0 -n -w /tmp/kieserver.pcap4、运行要分析的网络流量的测试。在本例中,我将从Business Central workbench中启动一个业务流程,它将向KIE服务器发送一个RESTful请求。5、捕获足够的数据后,在tcpdump容器中使用Ctrl+C完成捕获过程。6、回到本地机器。将PCAP文件从pod复制到本地机器: oc cp -c tcpdump rhp

13、am7-mortgage-kieserver-2-zcpsn:tmp/kieserver.pcap kieserver.pcap7、用Wireshark打开PCAP文件并分析网络流量。在这个例子中,我正在分析我的HTTP POST方法,它创建了Mortgage 进程的一个新实例:总结在容器环境(如Kubernetes和/或OpenShift)中分析pod之间的网络通信可能比在非容器环境中更困难一些。然而,sidecar容器的概念为开发人员提供了一种简单的工具,可以将容器连同所需的开发工具和实用程序附加到微服务pod上。这避免了开发人员必须在应用程序容器映像本身中安装这些调试工具,从而保持容器的

14、轻便和干净。使用像 oc rsh 和 oc cp 这样的OpenShift工具,我展示了如何轻松地从pod捕获网络流量数据并将数据带到开发机器进行分析。方法二:使用 netshootNetshoot - Docker + Kubernetes网络故障排除的瑞士军刀容器用途Docker和Kubernetes网络故障排除变得复杂。通过正确理解Docker和Kubernetes网络的工作方式和正确的工具集,您可以排除故障并解决这些网络问题。netshoot容器有一组强大的网络troubleshoot工具,可以用来排除Docker网络问题。与这些工具一起出现的还有一组用例,展示了如何在真实场景中使用这

15、个容器。Network Namespaces - 网络名称空间在开始使用这个工具之前,有一点很重要:网络名称空间。网络名称空间提供与网络相关的系统资源的隔离。Docker使用网络和其他类型的名称空间(pid、mount、user.)为每个容器创建一个隔离的环境。从接口、路由到ip的所有内容都完全隔离在容器的网络名称空间中。Kubernetes也使用网络名称空间。Kubelets为每个pod创建一个网络名称空间,其中该pod中的所有容器共享相同的网络名称空间(eths、IP、tcp套接字)。这是Docker容器和Kubernetes pod之间的关键区别。名称空间很酷的一点是您可以在它们之间进行

16、切换。您可以输入不同容器的网络名称空间,使用甚至没有安装在该容器上的工具在其网络堆栈上执行一些故障排除。此外,netshoot可以通过使用主机的网络名称空间来对主机本身进行故障排除。这允许您在不直接在主机或应用程序包上安装任何新包的情况下执行任何故障排除。针对容器的用法容器的网络名称空间:如果您的应用程序的容器存在网络问题,您可以像这样使用容器的网络名称空间启动netshoot: $ docker run -it -net container: nicolaka/netshoot主机的网络名称空间:如果您认为网络问题在于主机本身,那么可以使用该主机的网络名称空间启动netshoot。命令: $

17、 docker run -it -net host nicolaka/netshoot网络的网络名称空间:如果要对Docker网络进行故障排除,可以使用nsenter输入网络的名称空间。这将在下面的nsenter部分进行解释。针对 Kubernetes 的用法网络问题许多网络问题可能导致应用程序性能下降。其中一些问题可能与底层网络基础设施有关。其他问题可能与主机或Docker级别的配置错误有关。让我们来看看常见的网络问题:延迟(latency)路由(routing)DNS解析(DNS resolution)防火墙(firewall)不完整的ARP(incomplete ARPs)为了解决这些问

18、题,netshoot包含了一组强大的工具,如图所示。被包含的包方法三:利用Network Namespace正如方法二中提到的Network Namespace概念,实际上,不同的容器,只是在宿主机上不同 namespace 运行的进程而已。因此要在不同的容器抓包可以简单地使用命令切换 network namespace 即可,可以使用在宿主机上的 tcpdump 等应用进行抓包。具体操作步骤如下:1、查看指定 pod 运行在哪个宿主机上: kubctl describe pod -n mservice2、获得容器的 pid: docker inspect -f .State.Pid3、进入该

19、容器的 network namespace: nsenter -target -n4、使用宿主机的tcpdump 抓包, 指定 eth0 网卡: tcpdump -i eth0 tcp and port 80 -vvv5、或者直接抓包并导出到文件: tcpdump -i eth0 -w /tmp/out.cap6、从远程 scp 到本地: scp ipaddr:/tmp/out.cap ./7、之后在 Wireshark 中可以打开文件非常直观得查看过滤抓到的数据。方法四:使用 kubectl 插件ksniff题外话:krew - kubectl 插件包管理器Krew是kubectl插件的包管

20、理器。(后续会使用krew来安装 ksniff , 方便很多)什么是 krew?krew是一个使kubectl插件易于使用的工具。krew可以帮助发现插件,并在机器上安装和管理它们。类似于apt、dnf或brew等工具。krew 易于使用:查看在krew上可用的kubectl插件列表,或者运行kubectl krew search来发现可用的插件。安装 krewBash 和 ZSH:1、确保git 已安装;2、运行如下命令, 下载并安装krew3、添加 $HOME/.krew/bin 目录到 PATH 环境变。如下: export PATH=$KREW_ROOT:-$HOME/.krew/bi

21、n:$PATH 并重启下shell生效。安装ksniff通过 krew : kubectl krew install sniff使用方法kubectl 1.12:kubectl plugin sniff -n -c -i -f -o OUTPUT_FILE -l LOCAL_TCPDUMP_FILE -r REMOTE_TCPDUMP_FILEkubectl = 1.12:kubectl sniff -n -c -i -f -o OUTPUT_FILE -l LOCAL_TCPDUMP_FILE -r REMOTE_TCPDUMP_FILEPOD_NAME: Required. the nam

22、e of the kubernetes pod to start capture its traffic.NAMESPACE_NAME: Optional. Namespace name. used to specify the target namespace to operate on.CONTAINER_NAME: Optional. If omitted, the first container in the pod will be chosen.INTERFACE_NAME: Optional. Pod Interface to capture from. If omited, all Pod interfaces will be captured.CAPTURE_FILTER: Optional. specify a specific tcpdump capture filter. If omitted no filter will be used.OUTPUT_FILE: Optional. if specified, ksniff will redirect

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论