场景
我们的Dev环境是使用了K8S来部署微服务。但默认的容器ip是随机的,而且每次发布都会发生变更,微服务RPC调用也调不通容器内部的IP。而且后期项目微服务一多起来,要在本地调试就要把所有服务都起了,效率很低。
后来我们通过用Host Network
网络方式直接让容器使用宿主机的IP,端口也是直接挂在了宿主机。这样可以本地就可以直接访问Dev环境的微服务,而本地只需要针对启动某些要调试的服务即可,大大提高了调试效率。
但过了一段时间后,我们发现了一个比较麻烦的问题时,在同一微服务在K8S Dev环境中有在多个命名空间下运行,且运行节点一致,那么所涉及端口又是固定出去的就会产生冲突。随后我们想到了利用NodePort
方式来进行映射端口来暴露服务就能解决这个问题。
当然如果有条件的可以通过开放K8S网络环境连通公司内部网络。具体可以参考这篇文章:打通Kubernetes内网与局域网的N种方法
环境
- K8S + Rancher 2.6.3
- SpringCloud Alibaba 2.2.5.RELEASE
- Nacos 2.0.3
- Dubbo 2.7.8
配置K8S Deployment
端口映射
- Web端口,SpringBoot、Tomcat之流一般都是8080。
- Dubbo端口,一般按默认规则都是20880。
环境变量
- DUBBO_IP_TO_REGISTRY =
Node IP
- DUBBO_PORT_TO_REGISTRY =
Dubbo端口映射端口
- WEB_PORT_TO_REGISTRY =
Web端口映射端口
DUBBO_*
的变量是Dubbo框架内置的变量key。有兴趣可以看看这段源码:org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol
org.apache.dubbo.config.ServiceConfig#findConfigedHosts
org.apache.dubbo.config.ServiceConfig#findConfigedPorts
配置微服务bootstrap.yml
server:
port: 8080
spring:
application:
name: test-dubbo
cloud:
nacos:
discovery:
# Nacos地址
server-addr: 192.168.100.10
# 命名空间
namespace: np
# 组
group: service
# 注册到Nacos的服务ip(通过环境变量注入)
ip: ${DUBBO_IP_TO_REGISTRY}
# 注册到Nacos的服务端口(通过环境变量注入)
port: ${WEB_PORT_TO_REGISTRY}
config:
# Nacos地址
server-addr: 192.168.100.10
# 命名空间
namespace: np
# 组
group: config
# 配置文件格式
file-extension: yml
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.test
protocol:
# dubbo 协议
name: dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
port: -1
registry:
# 挂载到 Spring Cloud 注册中心
address: spring-cloud://192.168.100.10
group: ${spring.cloud.nacos.discovery.group}
cloud:
# 订阅服务(支持多个,使用","分隔。默认为"*",表示订阅所有应用)
subscribed-services: "*"
Nacos注册效果
如上图所示的注册效果,即可在本地连到K8S Dev环境中的test-dubbo服务啦。
细心的观众可能看出来
dubbo.metadata-service.urls
中的bind.ip
和bind.port
参数还是容器的IP端口,因为这两个参数是用于Netty绑定网络IP端口所用的,不能直接用NodePort映射出来的。不然其实可以直接在bootstrap.yml里面配置dubbo.protocol.host
和dubbo.protocol.port
,可惜因为这个特性故而只能借助上述环境变量才可做到更改Dubbo url上的IP端口且不影响Netty。具体可以看看这段源码:
org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol
org.apache.dubbo.remoting.transport.netty.NettyServer
org.apache.dubbo.remoting.transport.AbstractServer#AbstractServer
原创不易,转载请注明出处,谢谢。