Enhancing K8s API - 挂载K8s资源为本地云盘

文摘   2024-07-16 09:24   中国香港  

标题起的有点唬人,这里想给大家介绍一个我业余时间搞的一个 RUST 项目,很巧合的是和 K8S-API 也有关系,于是也放在了 Enhancing Kubernetes API 这个系列,本文主要介绍一个 k8s 的新奇玩法,把 k8s 的资源(Pod、Deployment、CRD)像云盘一样挂载到本地,你可以像操作普通文件一样操作Pod、Node,比如 cat pod.yaml 就等于执行了 kubectl get pod 

背景

这个项目的立意源自和一分哥聊天的时候,一分哥无意间提到了他在前司的时候,做过把 etcd 的 KV 映射到机器的文件系统的小工具,可以像操作普通文件一样操作 etcd。

跟着这个思路自然而然的,那不如把 K8S 的资源也映射到本地文件系统,不用再记一大堆 kubectl 的命令,在Linux下一切都是文件!,直接把 K8S 对象当做文件处理,Shell命令总算熟吧? 下面放飞你的思路:

  1. 1. pod logs/port-forward 通通变成文件, 看日志直接 tail -f

  2. 2. pod 软链到 node 下, event 软链到 pod下,只有想不到没有做不到

其实实现这个功能没有太大的难度,不过直接用 Go 实现这个功能就太无聊了,为了有机会能练习一下 Rust,于是尝试使用Rust来编写这个工具,其实 Rust 在 K8S 生态下的支持是比较完善的,KubeVela 的第一个版本就是基于 Rust 实现。

设计思路

实现这个功能需要考虑几点问题,使用者如何像操作本地文件一样操作K8S资源?答案是 用 FUSE 用户文件系统,挂载用户实现的文件系统到特定的目录下,在本地对这个目录下所有文件的操作行为都会被系统转发到用户进程处理,用户实现特定文件操作接口,在文件操作接口内实现特定的逻辑,

FUSE你一定不会陌生,很多云盘的实现都是依赖这个能力,在这里K8S就是一个远端的存储,把K8S这个云盘挂载到用户电脑上,使用 Rust 编写的 https://github.com/cberner/fuser 库可以帮助我们实现用户文件系统的挂载和请求映射,实现 fuser 中特定的 trait 即可。

AWS的https://github.com/awslabs/mountpoint-s3 就是类似的模式挂载s3

接下来我们要考虑在接收到用户对文件操作的请求如何映射到对K8S的处理?可能最直接的做法就是读写操作都直接映射到APIServer,不过作为一个客户端工具,我们还是要考虑到服务端的压力,直接把请求转发到APIServer不仅响应慢,而且会对APIServer造成一定压力,影响正常的服务响应。

这里我们还是利用APIServer的List&Watch能力,监听特定资源的变化,把最新的资源配置存储到一个本地KV数据库(使用数据库是方便资源的管理),对K8S资源的读操作都转为对本地数据库的读取。而更新操作还是直接请求APIServer完成。

https://github.com/kube-rs/kube 项目是一个K8S Rust SDK,用法和 client-go类似,我们使用 kube 来完成资源变更的订阅,对不同的事件注册 Handler 来变更本地数据库的存储。

然后选择https://github.com/spacejam/sled 作为本地数据库临时存储K8S资源。

经过上面的分析,最终的方案为 https://github.com/kube-rs/kube 监听K8S资源的变更同步到 https://github.com/spacejam/sled 构建的本地数据库内,使用 https://github.com/cberner/fuser 挂载用户文件系统到本机,每次用户对该用户文件系统内的文件的读操作都会映射为读取 sled 数据库内的内容,写操作会转换为对K8S-APIServer的直接请求,并依赖List&Watch机制等待变更再同步到本地。

我给这个项目命名为 Kufu(kube fuse),音似:功夫,大概的功能实现图如下,非常简单。

更多

kufu已经开源到了https://github.com/yangsoon/kufu,你可以下载到本地,通过执行 cargo run 来体验一下这种新奇的操作。

我们通过helm安装了kurise组件,来观察本地文件有什么变化,可以看到本地文件新增一个 kruise-system 的ns,在这个ns下有pod资源,可以通过ls命令查看都有哪些具体的pod,cat命令可以看到pod具体的配置信息。如果你对这个工具很感兴趣,欢迎留言沟通,也欢迎提PR,一起把这个工具做得更好。


文章转载自流心知识点击这里阅读原文了解更多


CNCF概况(幻灯片)

扫描二维码联系我们!




CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 

CNCF云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。

CNCF
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。
 最新文章