前言碎语
在容器化的过程中,我们遇到了一个非常棘手的问题。玩过k8s的知道,k8s有自己的一套网络管理机制,集群内的容器和容器之间是可以相互通信的。但是在容器化升级改造的过程中,不可能一步到位的将所有的服务全部迁移到k8s的容器当中来,毕竟新的技术在没有经过实践趟坑时,肯定不能轻易的全面铺开升级。那么就涉及到集群外的服务访问集群内的服务,集群内容器中的ip都是k8s管理的ip,dubbo服务注册的也是获取的容器内分配的ip。比如我们的宿主主机ip是172.10.15.xx,容器内的ip就是10.10.2.x。群外的和宿主主机同网段的服务通过拿到dubbo的注册的10.10.2.x也根本没法访问容器内的dubbo服务。而k8s容器是通过service来暴露集群内的服务,假如我们的dubbo服务注册的是service暴露的端口和宿主的ip那么集群外的服务也可以直接访问集群内容器中的服务了。通过这个思路,下面是具体的解决方案
2018/11/8补充网络图谱:
解决方案
改造dubbo,将通过网卡选址改成通过kubernetes-client直接获取k8s集群内的信息,具体是将选址拿到的pod中的ip去k8s客户端拿到的pod列表筛选出pod的所在的宿主主机的ip+service暴露的端口,然后将这个注册到dubb的注册中心,那么集全外的服务拿到的地址就是172.10.15.xx:xxxx这样的地址,当然就可以直接和pod通讯了。
kubernetes-client的坐标:https://github.com/fabric8io/kubernetes-client
如图,我们可以通过k8s的api拿到集群内的所有信息,然后我们通过pod的ip+资源的标签来确定和pod相关的宿主主机以及暴露的service