行万里路,此处相逢,共话云原生之道。
偶逗趣事,明月清风,与君同坐。
琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。
k8spacket
能够帮助我们了解Kubernetes集群中的TCP数据包流量情况:展示集群内工作负载之间的流量、指示流量如何在集群外路由、显示连接关闭的信息、统计工作负载发送/接收的字节数、计算连接建立的时间、展示整个集群中工作负载之间的连接网络。
k8spacket是什么
k8spacket
是一个工具,可让你可视化 K8s 集群中的 TCP 流量,并让你更好地了解不同工作负载如何相互通信。使用k8spackt
和Grafana
,你可以轻松检查打开的连接数、交换的字节数以及这些连接的活动时间。
一个简单的示例如下所示:
k8spacket
是用 Golang 编写的,它使用第三方库 ( gopacket
) 来嗅探工作负载上的 TCP 数据包(传入和传出),并在运行的容器网络接口上创建 TCP 侦听器。
当一个新的容器被创建时,CNI插件负责提供与其他容器或从集群到外界通信的可能性。最常见的方法是使用 Linux 命名空间来隔离网络,并veth pairs
连接隔离的命名空间和网桥。也可以创建其他类型,例如vlan
、ipvlan
和macvlan
。无论何种类型,都会创建容器linux命名空间的网络接口,这是嗅探器k8spacket
的主要句柄。
k8spacket
运行的时候会使用 hostNetwork: true
选项,它通过收集 TCP 流、处理数据并通过 API 暴露结果以供 Grafana 使用。此外,
k8spacket
是一个 Kubernetes API 客户端, 可以将嗅探到的工作负载解析为可视化的集群资源名称(Pods 和 Services)。- 它作为 DaemonSet 启动以侦听所有节点上的网络接口。
- 如果有新的(或旧的)网络接口要观察(或忘记),已实现的监听器每 10 秒(默认)检查一次。
k8spacket 主要版本特性
1.1.0版本
: 新增了tls-parser插件,可以获取服务器证书链信息(适用于TLS版本低于1.3的情况)。仪表盘关于TLS连接的显示也进行了更改,现在展示了服务器证书链的详细信息(需要依赖marcusolsson-json-datasource和marcusolsson-dynamictext-panel Grafana插件)。1.0.0版本
: 改变了k8spacket的架构,引入了go插件(可以查看这里可用的插件:github.com/k8spacket/p…),新增了有关集群内外TLS握手过程指标的插件,以及有关TLS连接的仪表盘,其中包含了TLS客户端的IP和名称、TLS服务器的域名、IP和端口、客户端支持的TLS版本和密码套件,以及服务器选择的TLS版本和密码套件。
k8spacket 特点
k8spacket
有助于了解 k8s 集群中的 TCP 数据包流量,并具有以下功能:
- 显示集群中工作负载之间的流量
- 展示流量在集群外部路由到哪里
- 显示有关通过连接关闭套接字的信息
- 显示工作负载发送/接收的字节数
- 计算建立连接的时间
- 显示整个集群中工作负载之间的网络连接
k8spacket
使用 Node Graph API Grafana 数据源插件。具体可参考Node Graph API 插件。
k8spacket安装
k8spacket
使用Node Graph API Grafana数据源插件,可以通过Helm图表安装,同时需添加Node Graph API和JSON API插件和数据源到Grafana实例中。
k8spacket
可以使用Helm
安装,Chart位于: https: //github.com/k8spacket/k8spacket-helm-chart
安装后Helm
,你可以按如下方式添加存储库:
$ helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart
安装k8spacket
:
$ helm install k8spacket --namespace k8spacket k8spacket/k8spacket \
--create-namespace
如果你有想要使用自定义选项或值:
$ helm install k8spacket --namespace k8spacket -f my-k8spacket-values.yaml \
k8spacket/k8spacket
将插件Node Graph API
和JSON API
数据源添加到您的 Grafana 实例。您可以手动执行此操作或更改 Grafana 图表的 helm 值,例如:
grafana:
env:
GF_INSTALL_PLUGINS: hamedkarbasi93-nodegraphapi-datasource,marcusolsson-json-datasource
datasources:
nodegraphapi-plugin-datasource.yaml:
apiVersion: 1
datasources:
- name: "Node Graph API"
jsonData:
url: "http://k8spacket.k8spacket.svc.cluster.local:8080/nodegraph"
access: "proxy"
basicAuth: false
isDefault: false
readOnly: false
type: "hamedkarbasi93-nodegraphapi-datasource"
typeLogoUrl: "public/plugins/hamedkarbasi93-nodegraphapi-datasource/img/logo.svg"
typeName: "node-graph-plugin"
orgId: 1
version: 1
marcusolsson-json-datasource.yaml:
apiVersion: 1
datasources:
- name: "JSON API"
url: "http://k8spacket.k8spacket.svc.cluster.local:8080/tlsparser/api/data"
access: "proxy"
basicAuth: false
isDefault: false
readOnly: false
type: "marcusolsson-json-datasource"
typeLogoUrl: "public/plugins/marcusolsson-json-datasource/img/logo.svg"
typeName: "json-api-plugin"
orgId: 1
version: 1
填写额外的抓取配置以观察 Prometheus 指标:
- job_name: "k8spacket-metrics"
metrics_path: /metrics
scrape_interval: 25s
static_configs:
- targets: [k8spacket.k8spacket.svc.cluster.local:8080]
将仪表板配置映射添加到 Grafana 堆栈
$ kubectl -n $GRAFANA_NS apply --recursive -f ./dashboards
然后你可以将仪表板配置添加到 Grafana 堆栈中:
$ kubectl -n $GRAFANA_NS apply --recursive -f ./dashboards
使用演示
行万里路,此处相逢,共话云原生之道。
偶逗趣事,明月清风,与君同坐。
琦彦,在云原生百宝箱公众号等你,与你一起探讨应用迁移,GitOps,二次开发,解决方案,CNCF生态,以及生活况味。
使用时可以在Grafana的Dashboards中查找k8spacket – node graph,并使用相应的过滤器(如连接模式、命名空间、工作流名称等)来观察数据。
选择名为k8spacket - node graph
的Grafana 仪表板,你进行如下操作:
选择graph mode (connection, bytes, duration)
可以将其设置Graph mode
为以下三种不同类型:
connection
– 帮助了解在工作负载之间,以及从或到外部客户端建立了多少连接。它会告诉您哪些套接字保持打开状态并可能导致问题。bytes
– 显示工作负载发送或接收的字节数。duration
– 计算连接的生命周期。
下面显示了三种不同的模式:
按namespace过滤
按命名空间 – 支持正则表达式,可以选择一个或多个 K8s 命名空间
按包含或排除工作流程名称进行过滤
- 按包含的名称 – 选择工作负载名称以进行可视化
- 按名称排除 – 从可视化中排除工作负载名称
参考
k8spacket
:https ://github.com/k8spacket/k8spacket