使用 K8spacket 和 Grafana 对 K8S 的 TCP 数据包流量可视化

1d8e154944369ac4106d9c0c6e2642fa.png

前言

如何知道 K8S 集群内 Pod 之间建立了哪些 TCP 连接?集群之间存在哪些调用关系?

使用 k8spacketGrafana,你可以可视化集群中的 TCP 流量。了解工作负载如何相互通信,以及建立了多少连接,交换了多少字节,这些连接处于活动状态的时间。

介绍

k8spacket是用 Golang 编写的工具,它使用gopacket第三方库来嗅探工作负载(传入和传出)上的 TCP 数据包。它在运行的容器网络接口上创建 TCP 侦听器。当 Kubernetes 创建一个新容器时,CNI 插件负责提供与其他容器进行通信的可能性。最常见的方法是用linux namespace隔离网络并用veth pair连接隔离的 namespace 与网桥。除了bridge 类型,CNI 插件还可以使用其他类型(vlan, ipvlan,macvlan),但都为容器创建了一个网络接口,它是k8spacket嗅探器的主要句柄。

k8spacket有助于了解 Kubernetes 集群中的 TCP 数据包流量:

  • 显示集群中工作负载之间的流量

  • 通知流量在集群外路由到哪里

  • 显示有关连接关闭套接字的信息

  • 显示工作负载发送/接收的字节数

  • 计算建立连接的时间

  • 显示整个集群中工作负载之间的网络连接拓扑

k8spacket是一个 Kubernetes API 客户端,可以将嗅探到的工作负载解析为可视化上可见的集群资源名称(PodsServices)。它作为DaemonSet Pod启动,使用 hostNetwork,并监听节点上的网络接口。

k8spacket 收集 TCP 流、处理数据,使用 Node Graph API Grafana 数据源插件(详情请查看 Node Graph API 插件),通过 API 展示在Grafana面板。

要安装k8spacket,需要同时安装 Grafana。下面将在Kind安装的 k8s 集群上做演示。

安装 k8spacket

使用 Helm 安装:

helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart
helm install k8spacket --namespace k8spacket k8spacket/k8spacket --create-namespace

默认安装会使用下面的命令获取所有需要监听的网络接口:

ip address | grep @ | sed -E 's/.* (\w+)@.*/\1/' | tr '\n' ',' | sed 's/.$//'

其中可能包含一些状态为Down的接口,此时启动k8spacket会报错:

2022/08/15 00:17:34 error opening pcap handle: tunl0: That device is not up

报错中提示网络接口tunl0状态不是up

所以需要自定义修改values.yaml中的参数。将charts包拉取到本地,解压之后再修改:

mkdir k8spacket
helm fecth k8spacket/k8spacket
tar -zxf k8spacket-0.1.0.tgz
cd k8spacket

修改 values.yaml 中的内容,过滤掉tunl0

k8sPacket:tcp:listener:interfaces:## 实现容器网络接口的命令command: "ip address | grep @ | grep -v tunl0 | sed -E 's/.* (\\w+)@.*/\\1/' | tr '\\n' ',' | sed 's/.$//'"## 多久刷新一次要监听的网络接口列表refreshPeriod: "10s"## 每 (periodDuration) 秒,刷新在过去 (closeOlderThanDuration) 秒内没有看到活动的连接。flushing:periodDuration: "10s"closeOlderThanDuration: "20s"
  • refreshPeriod参数表示多久刷新一次要监听的网络接口列表,增加新的网络接口监听,移除旧网络接口监听。

  • periodDuration秒,刷新在过去 closeOlderThanDuration秒内没有看到活动的连接。

安装成功,包含以下Daemonset PodsService

# k get pod -n k8spacket -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP             NODE                    NOMINATED NODE   READINESS GATES
k8spacket-9m4cz   1/1     Running   0          10m   192.168.16.4   k8s118-control-plane    <none>           <none>
k8spacket-b4q9k   1/1     Running   0          10m   192.168.16.6   k8s118-control-plane3   <none>           <none>
k8spacket-b5nnp   1/1     Running   0          10m   192.168.16.7   k8s118-control-plane2   <none>           <none>
k8spacket-c25jh   1/1     Running   0          10m   192.168.16.2   k8s118-worker           <none>           <none>
k8spacket-cqqxh   1/1     Running   0          10m   192.168.16.5   k8s118-worker2          <none>           <none>
k8spacket-h9hjc   1/1     Running   0          10m   192.168.16.3   k8s118-worker3          <none>           <none># k get svc -n k8spacket -o wide
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE   SELECTOR
k8spacket   ClusterIP   11.0.227.158   <none>        8080/TCP   31m   app.kubernetes.io/instance=k8spacket,app.kubernetes.io/name=k8spacket

k8spacket Pod 提供了 /metrics 接口暴露指标:

curl 192.168.16.4:8080/metrics

安装 dashboards

下载k8spacket项目,并将dashboards目录下的面板 configmaps 创建到 K8S 中:

wget https://github.com/k8spacket/k8spacket/archive/refs/heads/master.zip
unzip master.zip
cd k8spacket-master
kubectl  apply --recursive -f ./dashboards

创建了 k8spacket-logs-dashboard、k8spacket-metrics-dashboard、k8spacket-node-graph-dashboard三个面板。

其中的metrics面板公开了 Prometheus 指标,这里不做演示。只关心node-graph面板。

安装 grafana

使用 Helm 安装 grafana,helm-charts 包地址如下:

https://github.com/grafana/helm-charts

同样的拉取到本地:

helm repo add grafana https://grafana.github.io/helm-charts
helm fetch grafana/grafana
tar -zxf grafana-6.32.13.tgz
cd grafana/

charts包版本为:6.32.13
grafana版本为:9.0.5

修改values.yaml,将 Node Graph API 插件和数据源,以及 node-graph dashboard configmaps 添加到 Grafana。同时开启数据持久化。例如:

persistence:type: pvcenabled: trueenv:GF_INSTALL_PLUGINS: hamedkarbasi93-nodegraphapi-datasourcedashboardProviders:dashboardproviders.yaml:apiVersion: 1providers:- name: 'default'orgId: 1folder: ''type: filedisableDeletion: falseeditable: trueoptions:path: /var/lib/grafana/dashboards/defaultdashboardsConfigMaps:default: k8spacket-node-graph-dashboarddatasources:nodegraphapi-plugin-datasource.yaml:apiVersion: 1datasources:- name: "Node Graph API"jsonData:url: "http://k8spacket.k8spacket.svc.cluster.local:8080"access: "proxy"basicAuth: falseisDefault: falsereadOnly: falsetype: "hamedkarbasi93-nodegraphapi-datasource"typeLogoUrl: "public/plugins/hamedkarbasi93-nodegraphapi-datasource/img/logo.svg"typeName: "node-graph-plugin"orgId: 1version: 1

values.yaml目录下执行创建命令:

helm install grafana -f values.yaml  ./

获取到admin账号的密码:

kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

开启临时端口转发,使得集群外可以访问grafana实例:

kubectl --namespace default port-forward service/grafana 3000:80  --address 0.0.0.0

通过http://{Kind宿主机IP}:3000打开grafana面板,并使用上面获取到的密码登录,可以看到Node Graph API插件成功安装:

f235509aa16c698a1c3b877dce3522d1.png

node graph面板可以看到集群中网络连接拓扑:

033b5469547fe0d603e67383c9551140.png

使用

统计类型

  • connection:帮助了解工作负载之间以及与外部客户端之间建立了多少连接。它会告诉你哪些套接字保持打开状态并可能导致问题。

  • bytes:显示工作负载发送或接收的字节数。

  • duration:计算连接的生命周期。

cea7ef0af539a13e65a8fb323bcd4676.png


过滤器

  • by namespace:选择一个或多个 k8s 命名空间

1d294f08a17b58d0e3a8e036b3fc9e37.png


  • by names included:选择工作负载名称进行可视化

  • by names excluded:从可视化中排除工作负载名称

90da7e0421256c346ad8c5111f52876a.png

- END -  

分享、点赞和在看

支持我们分享更多好文章,谢谢!

 点个在看集群永保稳定👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粒子系统(一):从零开始画一颗树

准备 IDE&#xff1a;VisualStudio 2017 Language&#xff1a;VB.NET / TypeScript 图形API&#xff1a;Win2D Github&#xff1a;[ UWP ] [ TypeScript ] 本文将向你介绍一种粒子系统&#xff08;Particle System&#xff09;模拟植物的简单方法。 第一节 移动 粒子按照某种规…

python 获取Dmidecode 输出的系统硬件信息

目的&#xff1a;熟悉利用python 分析文本的信息。分析的文件信息是通过dmidecode 工具抓取的系统硬件信息。本文结构&#xff1a;(1) 分析dmidecode 工具的输出信息结构(2) 分别用两种方式对dmidecode 输出的信息实现抓取&#xff0c;获取Manufacturer、Product Name和 Serial…

20165313 《Java程序设计》第七周学习总结

教材学习总结 1.下载安装MySQL数据库管理系统。 2.MySQL数据库基本操作。 3.利用JAVA程序对MySQL数据库系统进行查找&#xff0c;更新&#xff0c;添加和删除操作。 学习中的问题与解决方案 1.运行书上安装MySQL命令后命令提示行显示系统错误5 解决方案 以管理员身份运行 2.运行…

五:CentOS7安装出现Warning

U盘安装CentOS 7提示 “Warning: /dev/root does not exist, could not boot” 解决办法 想将旧电脑安装CentOS7系统以作学习之用&#xff0c;奈何安装时出现错误&#xff0c;错误图示如下&#xff1a; 经多方查找、分析得知可能是启动引导不正确。 用usb writer重新制作了系统…

微软和Canonical宣布适用于Ubuntu 22.04 LTS的原生.NET 6

微软和 Canonical 达成新的合作伙伴关系&#xff0c;宣布了 Ubuntu 22.04 LTS 主机和容器的原生 .NET 可用性。.NET 开发人员现在可以通过一个 “apt install” 命令从 Ubuntu 22.04 LTS 安装 ASP.NET 和 .NET SDK 和运行时Canonical 为 .NET 6 LTS 和 ASP.NET 运行时发布新的、…

TCP的连接状态标识 (SYN, FIN, ACK, PSH, RST, URG)

一、TCP的状态 在TCP层&#xff0c;有个FLAGS字段&#xff0c;这个字段有以下几个标识&#xff1a;SYN, FIN, ACK, PSH, RST, URG。 其中&#xff0c;对于我们日常的分析有用的就是前面的五个字段。 它们的含义是&#xff1a; SYN 表示建立连接&#xff0c;FIN 表示关闭连接…

MySQL性能优化总结

一、MySQL的主要适用场景 1、Web网站系统 2、日志记录系统 3、数据仓库系统 4、嵌入式系统 二、MySQL架构图 三、MySQL存储引擎概述 1&#xff09;MyISAM存储引擎 MyISAM存储引擎的表在数据库中&#xff0c;每一个表都被存放为三个以表名命名的物理文件。首先肯定会有任何存储引…

Blazor University (45)依赖注入 —— 将依赖项注入 Blazor 组件

原文链接&#xff1a;https://blazor-university.com/dependency-injection/injecting-dependencies-into-blazor-components/将依赖项注入 Blazor 组件源代码[1]定义我们的依赖在注入依赖之前&#xff0c;我们需要创建一个。我们将使用古老的 ToDo 示例&#xff0c;但请放心&a…

顾小清:人工智能何以促进未来教育发展

自工业革命以来&#xff0c;人类社会的发展总是在技术与教育的角逐互动中前行。技术作为推动人类历史发展的核心推进力&#xff0c;与教育这一“人力资本发动机”竞相成为推动经济社会发展的主力。人工智能作为第四次工业革命的显著标签&#xff0c;其飞速发展正在逐步塑造社会…

server 2008R2 AD域环境中DHCP服务器的授权步骤

百度了下&#xff0c;没有详细的授权步骤&#xff0c;找了好久才找到&#xff0c;拿出来分享下环境&#xff1a;dhcp服务器在ad服务器中登陆dhcp服务器&#xff0c;管理工具-dhcp&#xff0c;打开dhcp&#xff0c;点击操作&#xff0c;管理授权&#xff08;终于找到了&#xff…

基于scikit-learn机器学习库的分类预测

一旦你在scikit-learn中选择好机器学习模型&#xff0c;就可以用它来预测新的数据实例。初学者经常会有这样的疑问&#xff1a; 如何在scikit-learn中用我自己的模型进行预测&#xff1f; 在本教程中&#xff0c;你将会发现如何在Python的机器学习库scikit-learn 中使用机器学习…

.NET性能优化-快速遍历List集合

简介System.Collections.Generic.List<T>是.NET中的泛型集合类&#xff0c;可以存储任何类型的数据&#xff0c;因为它的便利和丰富的API&#xff0c;在我们平时会广泛的使用到它&#xff0c;可以说是使用最多的集合类。在代码编写中&#xff0c;我们经常需要遍历一个Lis…

Thread、Runnable、Callable、Future ... 的关系?

Thread、Runnable、Callable、Future、FutureTask&#xff0c;你能详细讲出他们的内部关系么&#xff1f;这也是面试经常问到的问题。 1. Thread 和 Runnable 1.1 Thread 我们先看一下 Thread 最简单的使用姿势&#xff1a; public class MyThread extends Thread {public M…

EntityFramework6.X 之 Fulent

Fulent Fulent是配置领域模型类的另一个方法&#xff0c;它比DataAnnotations提供更多的配置&#xff0c;提供以下三种方法映射 Mappings To Database Model-Wide Mapping 设置默认架构&#xff0c;设置经典约束 Entity Mapping 映射单个或多个表格或架构&#xff0c;映射…

Visual Studio 2022 正式支持 .NET MAUI 开发

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟)我们很高兴地宣布 Visual Studio 2022 正式支持 .NET MAUI 开发。现在&#xff0c;您可以使用 .NET 更快地构建跨平台原生客户端应用程序&#xff0c;并将它们从单个代码库发布到 Android、iOS、macOS 和 Windo…

python访问数据库

1. python DB api简介 python DB api python访问数据库的统一接口规范&#xff0c;详细可参考https://www.python.org/dev/peps/pep-0249/python DB api中主要包括三个重要的对象 数据库连接对象 connection&#xff0c;数据库交互对象 cursor和数据库异常类 exceptions2. 使用…

错误:“filesystem“ 不是 “std“ 的成员

分析原因&#xff1a;应该项目是C版本问题 1、项目属性 → 配置属性 → 常规 → C语言标准 2、项目属性 → C/C → 语言 → C语言标准 3、项目属性 → C/C → 建议行 → 其它选项 → 添加&#xff1a;/Zc:__cplusplus

Blazor预研与实战

背景最近一直在搞一件事&#xff0c;就是熟悉Blazor&#xff0c;后期需要将Blazor真正运用到项目内。前期做了一些调研&#xff0c;包括但不限于Blazor知识学习组件库生态预研与现有SPA框架做比对与WebForm做比对自己动手做个演示项目最终的体验非常不错&#xff0c;功能全面。…

并发编程10大坑,你踩过几个?

目录 前言 1. SimpleDateFormat线程不安全 2. 双重检查锁的漏洞 3. volatile的原子性 4. 死锁 4.1 缩小锁的范围 4.2 保证锁的顺序 5. 没释放锁 6. HashMap导致内存溢出 7. 使用默认线程池 8. Async注解的陷阱 9. 自旋锁浪费cpu资源 10. ThreadLocal用完没清空 前…

CAP理论与MongoDB一致性、可用性的一些思考

大约在五六年前&#xff0c;第一次接触到了当时已经是hot topic的NoSql。不过那个时候学的用的都是mysql&#xff0c;Nosql对于我而言还是新事物&#xff0c;并没有真正使用&#xff0c;只是不明觉厉。但是印象深刻的是这么一张图片&#xff08;后来google到图片来自这里&#…