背景,Java 项目,spring cloud 技术栈。因为和 springcloud 体系耦合很重,一下子剥离不开,还需要继续使用 springcloud 。 开发人员需要和开发环境相互调用,但注册中心里是 docker 容器里的 IP 地址。想简单处理,开发环境维持老的方式部署,测试和生产部署 k8s 容器。请教一下有经验的大佬,这样会有什么坑吗?

各位大佬,我想我还需要澄清一下

网络设备不受我们控制。
服务器和开发机均没有root和管理员权限。
网络环境受限,无法自由安装软件。

由于上面的条件显示,所以我才会考虑使用传统的宿主机方式进行开发环境部署。

开发人员需要和开发环境相互调用---没看懂。

配置下静态路由,本地环境就可以访问 service 的 cluster ip 了

改下应用网络,直接使用宿主机网络,不过这样可能会出现端口冲突,需要规划下各个应用端口使用

开发环境怎么能网络调用其他的服务呢,单测的话 mock 掉就好了,想运行发测试环境就行

developer 的 pc 需要调用 dev 环境上的 server

路由器配置下 K8 网段的静态路由表

集群里起一个 vpn 或者使用 ingress 、metallb 这种工具直接暴露出来

各位大佬,网络权限不在我们控制之下,而且我们是没有服务器的 root 权限的。

我不是 java 栈的, 机会难得, 想请教大佬.>>> Java 项目,spring cloud 技术栈。因为和 springcloud 体系耦合很重,一下子剥离不开,还需要继续使用 springcloud 。剥离之后使用什么技术栈啊?

直接用 springboot 就行了。或者任意 web 框架都可以,只关注 http 协议,不关注具体框架

推荐使用 telepresence , 可以帮助开发者更方便的进行 k8s 环境下的应用开发,它能让你的本机直接访问到 k8s 集群内的服务,也可以将集群内的请求流量劫持到本机进行处理,这样就不需要在开发调试中反复进行构建镜像,推送镜像,部署服务的流程了,直接在本地一站式完成,比较方便。 github.com/telepresenceio/telepresence

farer.org/2022/09/04/developing-debugging-with-teleprensence/

既让网络控制不了,就部署一个 VPN ,我之前弄过一个类似的,在一台服务器上部署一个 v2ray ,然后电脑连接到该服务器 v2ray ,这样本地电脑就可以轻松访问只有服务器才能访问的资源了

感谢,我研究一下这个方案。这个需要 windows 开发机的管理员权限吗?这个权限我们也是没有的。

感谢大佬,vpn 的方案我去研究一下。

没在 win 下装过,你试试,如果不行可以在 wsl 里试试

这是个假需求

okteto 可以了解一下,本地编辑代码,syncthing 自动同步到 pod 里

你无非就是想把容器当宿主机使用,你把你需求报你的运维人员看看他们能不能给你们提供方案,不能你就部署容器的时候往里面丢类似 webmin 、1panel 这样的管理套件然后让运维人员给你们暴露端口即可。楼上这些建议有点偏离你的本质需求。

谢谢,实际上网络端口都是通的,只是需要暴露出来。ingress 的方式是可以的。

说明你们这个 dev 环境的 k8s 搭建的时候对开发的需求考虑的不周到。遇到同样的问题,我搭建的 k8s 集群用的 cilium 的 bgp 路由方案,pod IP 和宿主机 IP 在同一个大二层。on-premises 的 本地开发机和 pod 容器 三层路由互相可达。服务注册到注册中心的地址既可以是开发机的地址,也可以是 pod 的地址,由于网络互通,对开发均无感。

直接 k8s 里面起容器开发,idea 、vscode 都支持 remote development

telepresence 或者 kt-connect 都可以将集群内的请求流量劫持到本机进行处理 github.com/telepresenceio/telepresence github.com/alibaba/kt-connect

没明白你说的“宿主机”到底是个啥你说的“没有服务器 root 权限”这个服务器和那句宿主机不是同一个东西吗?

同意 22 楼的方案,容器内开发。提升效率方便摸鱼!~

这个我有经验,我是这样弄的。1.服务打开 NodePort 获取宿主机映射端口2.在配置容器启动命令,固定在注册中心注册使用的 ip 和 port 。比如 nacos 在 spring 里固定就传--spring.cloud.nacos.discovery.ip=xxx.xxx.xxx.xxx --spring.cloud.nacos.discovery.port=xxxx这样开发在注册中心寻找服务时就能正确命中 k8s 中部署的服务这个方法由于 nacos 注册的为宿主机映射端口,所以网络性能要弱于 ClusterIP ,不过开发环境一般不会有网络压力,所以可以忽略了

我觉得用了 k8s 就不要使用注册中心了,直接使用 k8s 的 service 来做服务发现,本地测试不启动服务测试,而是写单元测试,跨服务调用的接口使用 mock ,实在不能 mock 的再考虑暴露端口来调用,不需要服务发现就不存在要把服务注册到注册中心了。只需要其它服务的地址就行了。

正常来说肯定是这样的,但我们是个老项目进行改造,有历史包袱需要兼顾。一时半会还没办法抛弃这套东西。