如何使用 Kindling 观测 Kubernetes 应用网络连接状态

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

a542966006da1dd85bf3697588987836.png

最近有一个需求,收集 Kubernetes 的外网访问情况。因此对相关项目进行了调用和试用,本篇主要是介绍如何安装 Kindling,配置 Grafana 查看 Kubernetes 网络连接数据。

1. 什么是 Kindling

Kindling 解决的是,在不入侵应用的前提下,如何观测网络的问题,其功能主要是通过暴露内核事件来实现观测。如果主机内核版本高于 4.14,可以使用 eBPF 模块;如果主机内核是低版本,采用的是 Sysdig 实现相关观测。

下面是一张架构图:

ede80a1ea3c3b6bcc443438bfedc0511.png

目前 Kindling 有两个版本,一个是开源版本,一个是商用版本。开源版本,采集数据不够详细、只能 Grafana 出图;商用版本,功能上有所增强,在项目的 Github 首页有介绍,在此不重复。

这种基于 eBPF 将内核函数调用转换为用户空间事件,然后暴露给用户程序的技术,在未来几年,应该会有一些落地场景,也会很有意思。下面就来简单部署,使用一下开源版本的 Kindling 吧。

2. 安装 Kindling

Kindling 的开源社区运作得并不算好,文档和资料不够清晰,我整理了一份 Yaml 用于安装。

2.1 确保内核版本大于 4.14

uname -a

Linux node1 5.4.0-81-generic #91-Ubuntu SMP Thu Jul 15 19:09:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

2.2 下载 Yaml 文件

git clone https://github.com/shaowenchen/demo

cd kindling/yaml

2.3 安装 Kindling

kubectl apply -f ./

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 的镜像与当前系统不匹配导致。需要重新编译镜像:

  • 安装 kernel headers

Ubuntu 执行命令:

apt-get -y install linux-headers-$(uname -r)

CentOs 执行命令:

yum -y install kernel-devel-$(uname -r)
  • 编译生成新的镜像

bash -c "$(curl -fsSL https://k8s-bpf-probes-public.oss-cn-hangzhou.aliyuncs.com/recompile-module.sh)"
  • 将镜像 tag 为 Yaml 中定义的镜像

docker tag kindlingproject/kindling-agent:bymyself shaowenchen/kindling-agent:ubuntu-20.04
  • 重启 Pod 即可

kubeclt -n kindling delete pod kindling-agent-xxx
  • 替代 kindling-agent 镜像时的技巧

需要将 kindling-agent 的镜像拉取策略改为 IfNotPresent。

imagePullPolicy: IfNotPresent

这里需要注意的是,如果你的基础设施比较统一,只有一种操作系统一种内核版本,那么可以将镜像 tag 为自己的私有镜像,然后推送到远端,修改 kindling-agent Daemonset 镜像地址即可。

如果你的基础设施不统一,一个集群包含有多种主机、多种操作系统、多种内核版本,那么可以在这些特殊的系统上进行逐个编译。由于 Daemonset 只能设置一个镜像名,需要保持所有 Kubernetes 节点重新编译的 kindling-agent 镜像名一致。

3. 安装 Grafana 插件并导入面板

3.1 安装 topo-plugin 插件

由于,我常用的 Grafana 是采用 Docker 部署的,安装插件过程稍显复杂。

  1. 下载插件

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
  1. 在容器中,创建目录解压插件

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
  1. 配置插件

/etc/grafana/grafana.ini 是只读文件,因此需要将其拷贝到容器外,修改之后,再拷贝覆盖原文件。

docker cp 392fe26ae57f:/etc/grafana/grafana.ini grafana.ini

本地编辑 grafana.ini 文件,新增如下内容

[plugins]
allow_loading_unsigned_plugins = kindlingproject-topology-panel

将修改后的 grafana.ini 文件拷贝回容器覆盖原文件

docker cp grafana.ini  392fe26ae57f:/etc/grafana/grafana.ini
  • 重启 Grafana

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 上报的数据

下面是截图:

68b43a91959bec14ce6fbb4fe7ed0957.png

126d995077ffc4f2d6181eeee55cfbd2.png

68adec7e41ef040d734946edbcd10d13.png

340746b13f709dbbbe10071a893e89af.png

在面板上,可以看到 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 列表。

count by (dst_ip) (kindling_trace_request_duration_nanoseconds{dst_ip!~"127..*|10..*|172..*"})

4b1d2929906c5cab070560a8bce3f71e.png

5. 参考

  • http://www.kindling.space:33215/project-1/doc-35/

  • https://github.com/CloudDectective-Harmonycloud/kindling

本文转载自:「陈少文」,原文:https://url.hi-linux.com/vXCpI,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

3d3a10c285e29641fa010bb72603bc65.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

b61d970cfaec282cba002f8d61451b39.png

你可能还喜欢

点击下方图片即可阅读

d604010068043ae7f792651bf2cb8355.jpeg

图解 Kubernetes 网络流量流转路径

48353ef92e1b1e44cb53ed2faefc47c9.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

396607b78f3f9bbcfe9be30d6555b0ea.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值