在容器化的过程中,我们遇到了一个非常棘手的问题。玩过 k8s 的知道,k8s 有自己的一套网络管理机制,集群内的容器和容器之间是可以相互通信的。但是在容器化升级改造的过程中,不可能一步到位的将所有的服务全部迁移到 k8s 的容器当中来,毕竟新的技术在没有经过实践趟坑时,肯定不能轻易的全面铺开升级。那么就涉及到集群外的服务访问集群内的服务,集群内容器中的 ip 都是 k8s 管理的 ip,dubbo 服务注册的也是获取的容器内分配的 ip。比如我们的宿主主机 ip 是 172.10.15.xx,容器内的 ip 就是 10.10.2.x。群外的和宿主主机同网段的服务通过拿到 dubbo 的注册的 10.10.2.x 也根本没法访问容器内的 dubbo 服务,请问如何解决这个问题?
1
symb0l OP v2ex 的老哥们,救命哇。。
|
2
monsterxx03 2019-04-29 18:10:29 +08:00
给 k8s 内的 dubbo 服务设置一个 NodePort 类型的 service 不就完了吗: https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
|
3
symb0l OP @monsterxx03 谢谢回答,有考虑过,但后期 K8S 节点扩容后,集群外服务往集群内的一些网络权限变更就得重新搞,一个服务就得开一个策略,假设有一百个服务,扩容一台节点,就得加一百条策略,网络工程师应该会砍死我,。
|
4
monsterxx03 2019-04-29 18:31:42 +08:00
自建的话我也想不到什么好办法, 你们估计用的 flannel 之类的 overlay 网络. 在 aws 上的话可以通过 vpc cni plugin 直接给 pod 分配 vpc 里的 ip, 这样 k8s 内外的服务可以直接通过 ip 通信.
我对 dubbo 不熟悉, overlay 网络, 你要内外通信, 必然需要一个 service 做 NodePort, 不知道 dubbo 有没有单端口的代理方案. |
5
YzSama 2019-05-10 18:11:57 +08:00
我猜楼主是想让研发的网络与集群内部网络通信。
如果是这样的话,只需要进行打通就可以了。 |
6
Ksmriacle 2020-06-08 15:40:07 +08:00
兄弟解决了么
|
7
symb0l OP @Ksmriacle 不好意思,平时比较少登陆 v2ex
目前是这样解决的,在容器部署模板里的 env 部分定义一个变量,并声明 valueFrom.fieldRef.fieldPath 的值为 status.hostIP,这样容器启动后就可以通过环境变量获取到宿主机的 IP 地址,将注册地址改为主机地址,外部 zookeeper 对主机地址可见即可。 |
8
mrsupns 2020-09-17 10:04:24 +08:00
能发一个 demo 吗
|
9
monkeyWie 2021-11-15 17:42:42 +08:00
@monsterxx03 @symb0l @Ksmriacle @mrsupns 可以试试 dubbo-ingress-controller: https://github.com/monkeyWie/dubbo-ingress-controller
|