Internal Blog Theory

将 Kubernetes API 翻译成 systemd 操作

想法复杂度 实现难度 是否已实现
2/5 1/5

自己在 Shopee 的工作中, 即使是最近很长一段时间做的分布式存储的项目, 或者是以前一些偏重 CRUD 的项目, 服务的部署都相当的野蛮:

目前集群管理的手段, 是将各个可能的操作写成了不同的 Ansible roles. 那么有没有什么办法, 将这种简单的服务调度的场景转换成使用 K8s 呢?

这样的好处就是:

Virtual Kubelet

翻来翻去, 找到了 systemk 这个项目, 但是这个项目做的事情太多了 (volumes, secrets, configMap, emptyDir 等等), 而它底下基于的框架 Virtual Kubelet, 用户只要实现 PodLifecycleHandler 接口, 就能假扮成一个 kubelet 并适配上 apiserver 的各种行为操作, 看起来很有望.

接下来就要关注 K8s 概念和 systemd 概念之间的静态对应关系:

Systemd unit 服务名遵循这样的命名规则:

unitlet.NAMESPACE_NAME.POD_NAME.CONTAINER_NAME.service

接下来就可以关注 pod 本身的生命周期了.

Introducing unitlet

我花了两天的时间, 用了 1k 左右的代码, 实现了 unitlet 这个项目. 整个项目分成了几个核心模块 (interface 的形式):

整个实现没有什么复杂的地方, 查询/创建/删除 pod 等变成操作 systemd unit 文件以及 systemctl 的各种命令就完事儿了.

一些未来可以做的事情: