前言如何知道K8S集群中Pod之间建立了哪些TCP连接?集群之间存在哪些调用关系?使用k8spacket和Grafana,您可以可视化集群中的TCP流量。查看工作负载如何相互通信、建立了多少连接、交换了多少字节以及这些连接处于活动状态的时间。简介k8spacket是一个用Golang编写的工具,它使用gopacket第三方库来嗅探工作负载(传入和传出)上的TCP数据包。它在运行的容器网络接口上创建一个TCP侦听器。当Kubernetes创建一个新容器时,CNI插件负责提供与其他容器通信的可能性。最常见的方法是使用linux命名空间隔离网络,并使用veth对将隔离的命名空间与网桥连接起来。除了网桥类型,CNI插件还可以使用其他类型(vlan、ipvlan、macvlan),但都是为容器创建网络接口,是k8spacketsniffer的主要把柄。k8spacket对于理解Kubernetes集群中的TCP数据包流量很有用:显示集群中工作负载之间的流量告知流量在集群外路由到哪里显示有关连接的信息关闭套接字显示工作负载发送/接收的字节数计算建立连接的时间显示整个集群中工作负载之间的网络连接拓扑k8spacket是一个KubernetesAPI客户端,可以将嗅探到的工作负载解析为视觉可见的集群资源名称(Pod和服务)。它作为DaemonSetPod启动,使用hostNetwork,并监听节点上的网络接口。k8spacket采集TCP流,处理数据,使用NodeGraphAPIGrafana数据源插件(详见NodeGraphAPI插件),通过API显示在Grafana面板上。安装k8spacket,需要同时安装Grafana。下面将在Kind安装的k8s集群上进行演示。使用Helm安装安装k8spacket:helmrepoaddk8spackethttps://k8spacket.github.io/k8spacket-helm-charthelminstallk8spacket--namespacek8spacketk8spacket/k8spacket--create-namespace默认安装会使用如下命令获取所有监听器网络接口:ip地址|grep@|sed-E's/.*(\w+)@.*/\1/'|tr'\n'','|sed's/.$//'where它可能包含一些状态为Down的接口。这时候启动k8spacket会报错:2022/08/1500:17:34erroropeningpcaphandle:tunl0:Thatdeviceisnotup。错误消息表明网络接口tunl0的状态未启动。所以需要自定义修改values.yaml中的参数。将charts包拉到本地,解压后修改:mkdirk8spackethelmfecthk8spacket/k8spackettar-zxfk8spacket-0.1.0.tgzcdk8spacket修改values.yaml中的内容,过滤掉tunl0:k8sPacket:tcp:listener:interfaces:##执行容器网络接口命令的命令:"ipaddress|grep@|grep-vtunl0|sed-E's/.*(\\w+)@.*/\\1/'|tr'\\n'','|sed's/.$//'"##多久刷新一次网络接口列表以监听refreshPeriod:"10s"##每(periodDuration)秒,刷新过去没有看到活动(closeOlderThanDuration)秒连接。flushing:periodDuration:"10s"closeOlderThanDuration:"20s"refreshPeriod参数表示多久刷新一次要监控的网络接口列表,添加新的网络接口监控,移除旧的网络接口监控。每periodDuration秒,刷新在过去closeOlderThanDuration秒内未看到活动的连接。安装成功,包含以下DaemonsetPod和服务:#kgetpod-nk8spacket-owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESk8spacket-9m4cz1/1Running010m192.168.16.4k8s118-control-plane<无>k8spacket-b4q9k1/1运行010m192.168.16.6k8s118-control-plane3<无><无>k8spacket-b5nnp1/1运行010m192.168.16.7k8s118-control-plane2<无><无>k8spacket-c25jh1/1运行010m192.168.16.2k8s118-worker<无><无>k8spacket-cqqxh1/1运行010m192.168.16.5k8s118-worker2<无><无>k8spacket-h9hjc1/1运行010m8192.16.16.3k8s118-worker3<无><无>#kgetsvc-nk8spacket-owideNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGESELECTORk8spacketClusterIP11.0.227.1588080/TCP31mapp.kubernetes.io/instance=k8spacket,app.kubernetes.io/name=k8spacketk8spacketPod提供/metrics接口暴露指标:curl192.168.16.4:8080/metrics安装dashboards下载k8spacket工程,将dashboards目录下的panelconfigmaps创建到K8S中:wgethttps://github.com/k8spacket/k8spacket/archive/refs/heads/master.zipunzipmaster.zipcdk8spacket-masterkubectlapply--recursive-f./dashboards在k8spacket-logs-dashboard、k8spacket-metrics-dashboard、k8spacket-node-graph三个面板中创建metrics-dashboard面板暴露了Prometheus指标,这里不做演示。只关心节点图面板。安装grafana使用Helm安装grafana,helm-charts包地址如下:https://github.com/grafana/helm-charts同样拉取到本地:helmrepoaddgrafanahttps://grafana.github.io/helm-chartshelmfetchgrafana/grafanatar-zxfgrafana-6.32.13.tgzcdgrafana/charts包版本:6.32.13grafana版本:9.0.5修改values.yaml,添加NodeGraphAPI插件和数据源,和节点图仪表板配置映射已添加到Grafana。还启用数据持久性。例如:persistence:type:pvcenabled:trueenv:GF_INSTALL_PLUGINS:hamedkarbasi93-nodegraphapi-datasourcedashboardProviders:dashboardproviders.yaml:apiVersion:1providers:-name:'default'orgId:1folder:''type:filedisableDeletion:falseeditable:true选项:路径:/var/lib/grafana/dashboards/defaultdashboardsConfigMaps:默认:k8spacket-node-graph-dashboarddatasources:nodegraphapi-plugin-datasource.yaml:apiVersion:1数据源:-名称:“节点图API”jsonData:url:“http://k8spacket.k8spacket.svc.cluster.local:8080”访问:“代理”basicAuth:falseisDefault:falsereadOnly:false类型:“hamedkarbasi93-nodegraphapi-datasource”typeLogoUrl:“public/plugins/hamedkarbasi93-nodegraphapi-datasource/img/logo.svg"typeName:"node-graph-plugin"orgId:1version:1在values.yaml目录下执行创建命令:helminstallgrafana-fvalues.yaml./获取admin账号密码:kubectlgetsecret--namespacedefaultgrafana-ojsonpath="{.data.admin-password}"|base64——解码;echo启用临时端口转发,使集群外可以访问grafana实例:kubectl--namespacedefaultport-forwardservice/grafana3000:80--address0.0.0.0通过http://{Kind打开grafana面板hostIP}:3000,用上面获取的密码登录,可以看到NodeGraphAPI插件安装成功:在nodegraph面板可以看到集群中的网络连接拓扑:使用统计类型连接:帮助了解工作负载和外部客户端之间建立了多少连接,它会告诉您哪些套接字保持打开状态并可能导致问题。bytes:显示工作负载发送或接收的字节数。duration:计算连接的生命周期。按命名空间过滤:按名称选择一个或多个k8s命名空间included:按名称选择用于可视化的工作负载名称excluded:从可视化中排除工作负载名称