最近有一个需求,收集 Kubernetes 的外网访问情况。因此对相关项目进行了调用和试用,本篇主要是介绍如何安装 Kindling,配置 Grafana 查看 Kubernetes 网络连接数据。
1. 什么是 Kindling
Kindling 解决的是,在不入侵应用的前提下,如何观测网络的问题,其功能主要是通过暴露内核事件来实现观测。如果主机内核版本高于 4.14,可以使用 eBPF 模块;如果主机内核是低版本,采用的是 Sysdig 实现相关观测。下面是一张架构图:
目前 Kindling 有两个版本,一个是开源版本,一个是商用版本。开源版本,采集数据不够详细、只能 Grafana 出图;商用版本,功能上有所增强,在项目的 Github 首页有介绍,在此不重复。这种基于 eBPF 将内核函数调用转换为用户空间事件,然后暴露给用户程序的技术,在未来几年,应该会有一些落地场景,也会很有意思。下面就来简单部署,使用一下开源版本的 Kindling 吧。
2. 安装 Kindling
Kindling 的开源社区运作得并不算好,文档和资料不够清晰,我整理了一份 Yaml 用于安装。
2.1 确保内核版本大于 4.14
|
| uname -a | | | | Linux node1 5.4.0-81-generic |
|
2.2 下载 Yaml 文件
|
| git clone https://github.com/shaowenchen/demo | | | | cd kindling/yaml |
|
2.3 安装 Kindling
2.4 查看 Pod 状态
|
| kubectl -n kindling get pod | | | | NAME READY STATUS RESTARTS AGE | | kindling-agent-8xt7c 1/1 Running 0 2d20h | | kindling-agent-bvxzc 1/1 Running 0 2d20h | | kindling-agent-l9phl 1/1 Running 0 2d20h | | kindling-agent-nx5zh 1/1 Running 0 2d20h | | kindling-agent-qd9cs 1/1 Running 0 2d20h | | kindling-agent-sxglf 1/1 Running 0 2d20h |
|
2.5 Pod 可能一直 CrashLoopBackOff
Pod 一直 CrashLoopBackOff,这是由于 kindling-agent 的镜像与当前系统不匹配导致。需要重新编译镜像:
Ubuntu 执行命令:
1
|
apt-get -y install linux-headers-$(uname -r)
|
CentOs 执行命令:
1
|
yum -y install kernel-devel-$(uname -r)
|
1
|
bash -c "$(curl -fsSL https://k8s-bpf-probes-public.oss-cn-hangzhou.aliyuncs.com/recompile-module.sh)"
|
1
|
docker tag kindlingproject/kindling-agent:bymyself shaowenchen/kindling-agent:ubuntu-20.04
|
1
|
kubeclt -n kindling delete pod kindling-agent-xxx
|
需要将 kindling-agent 的镜像拉取策略改为 IfNotPresent。
1
|
| imagePullPolicy: IfNotPresent | | |
|
这里需要注意的是,如果你的基础设施比较统一,只有一种操作系统一种内核版本,那么可以将镜像 tag 为自己的私有镜像,然后推送到远端,修改 kindling-agent Daemonset 镜像地址即可。如果你的基础设施不统一,一个集群包含有多种主机、多种操作系统、多种内核版本,那么可以在这些特殊的系统上进行逐个编译。由于 Daemonset 只能设置一个镜像名,需要保持所有 Kubernetes 节点重新编译的 kindling-agent 镜像名一致。
3. 安装 Grafana 插件并导入面板
3.1 安装 topo-plugin 插件
由于,我常用的 Grafana 是采用 Docker 部署的,安装插件过程稍显复杂。
下载插件
|
| git clone https://github.com/shaowenchen/demo | | cd kindling/dashboard |
|
将插件拷贝至容器内
1
|
docker cp topo-plugin.tar.gz 392fe26ae57f:/var/lib/grafana/plugins/
|
其中的 392fe26ae57f 为 Grafana 运行的容器 ID。
进入容器创建目录
1
|
docker exec -it 392fe26ae57f sh
|
在容器中,创建目录解压插件
|
| cd /var/lib/grafana/plugins/ | | | | mkdir kindlingproject-topology-panel | | | | mv topo-plugin.tar.gz kindlingproject-topology-panel/ | | | | cd kindlingproject-topology-panel/ | | | | tar xvf topo-plugin.tar.gz |
|
配置插件
/etc/grafana/grafana.ini
是只读文件,因此需要将其拷贝到容器外,修改之后,再拷贝覆盖原文件。
1
|
docker cp 392fe26ae57f:/etc/grafana/grafana.ini grafana.ini
|
本地编辑 grafana.ini
文件,新增如下内容
|
| [plugins] | | allow_loading_unsigned_plugins = kindlingproject-topology-panel |
|
将修改后的 grafana.ini
文件拷贝回容器覆盖原文件
1
|
docker cp grafana.ini 392fe26ae57f:/etc/grafana/grafana.ini
|
1
|
docker restart 392fe26ae57f
|
3.2 导入 Grafana 面板
我使用的 Grafana 版本是 8.3.1
。相关的 Dashboard Json 文件在 https://github.com/shaowenchen/demo/tree/master/kindling/dashboard
有备份。相较于 Kindling 官方提供的 Dashboard 主要是增加了 DataSource 字段用于切换数据源,方便在不同的集群上查看监控数据。
4. 查看 kindling-agent 上报的数据
下面是截图:


在面板上,可以看到 DNS,四元组相关的一些信息,甚至还能看到命令空间、Service 之间的网络拓扑。资源消耗方面,也可以接受:
|
| kubectl -n kindling top pod | | | | NAME CPU(cores) MEMORY(bytes) | | kindling-agent-8xt7c 32m 444Mi | | kindling-agent-bvxzc 31m 337Mi | | kindling-agent-l9phl 63m 413Mi | | kindling-agent-nx5zh 62m 255Mi | | kindling-agent-qd9cs 99m 452Mi | | kindling-agent-sxglf 34m 701Mi |
|
在上面的一些图中,可以发现有些数据是空缺的,还有一些字段显示 NOT_FOUND_INTERNAL
,项目的体验不算很好。通过 PromQL 语句,我获取到了集群对外部访问的 IP 列表。
1
|
count by (dst_ip) (kindling_trace_request_duration_nanoseconds{dst_ip!~"127..*|10..*|172..*"})
|

5. 参考
- http://www.kindling.space:33215/project-1/doc-35/
- https://github.com/CloudDectective-Harmonycloud/kindling