前言
好久没有写文章了,主要是好像没啥进步,这里就来简单介绍一下我长期在做的一个项目吧,KubeVPN,一个可以连通 K8s 集群网络和本地网络的一个小工具
初衷
一直在想如果上了 K8s
的话,如何才能快速进行业务开发呢。其实这里还有一个开源项目 nocalhost,这个项目是公司项目,成功的进入了 CNCF sandbox
,这里尝试探索了在云端开发和在本地开发两种模式。下面就来简单来说一说这两类模式。
云端开发
将远端容器的启动命令修改为 tail -f /dev/null
,任意一个挂起且不退出的命令都可以,也就是把远端容器看成是一个微型 Linux
,然后将本地的源码同步到远端,此时在本地修改的代码,会自动实时同步到远端容器(有的同学可以会担心源码安全问题,这里可以使用 K8s
的 RBAC
来解决,比如对于开发用户可以创建自己的 Role
和 RoleBinding
,对于开发容器只有自己可以操作,别人无法操作,具体详见文档),那么想要验证功能的时候,就可以使用比如 go run main.go
或者 mvn spring-boot:run
的方式,快速将服务跑起来,然后就可以通过传统的验证方式验证程序功能是否满足期望。如果此时需要 debug
,则可以使用对应语言的 remote debug
,不过 nocalhost
已经有相应的封装了,有兴趣的同学可以看看官网文档。
本地开发
nocalhost
还支持流量代理模式,也就是可以打通本地和远端容器的网络。就可以在本地访问到远端 K8s
容器集群的网络,同时远端集群也可以访问到本地网络。那么作为一个开发人员,就可以在本地将项目启动起来,因为项目依赖的其它组件都可以直接访问到。这样调试就方便许多了。感兴趣的小伙伴可以参见文档。
两类模式比较
云端开发 | 本地开发 | |
---|---|---|
优点 | 复用容器所有能力,包括挂载的卷,环境变量等 | 调试很方便,如同传统的开发方式一样 |
缺点 | 将源代码放在云上,可能会有安全问题 | 不能使用环境变量,挂载的卷。不支持复杂的场景 |
KubeVPN 简介
个人还是比较偏好在本地开发的,因为本地有熟悉的 ide
工具,并且打通网络后可以直接在本地直接启动项目,是一个很大的亮点,鄙人不才,nocalhost
项目的 VPN
方案也是我提供并实施的。同时我将 VPN
的能力加以扩展,做了项目 KebeVPN
,这个项目的基本能力和 nocalhost
的 VPN
基本能力相同,但是这里将其抽离为一个简单的工具,用户运行这个工具,就可以访问容器网络,关闭工具就不能访问。比较简洁,小而美。
亮点
除了前面说将到的可以在本地访问容器网络,以及容器可以访问本地网络之外,KubeVPN
还支持 service mesh
,即将带了指定 header
的 http/GRPC
流量路由到本地,其它不带指定 header
的流量不受影响,原理是使用 envoy
作为数据平面,然后自己写的控制平面。用以控制指定容器的流量代理模式。
后记
欢迎各位大佬帮我提 PR
,让我们来一起完善这个项目,做大做好,能够帮助到有需要的人是我的初心。感谢大佬🙏