场景

我们的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

端口映射

  1. Web端口,SpringBoot、Tomcat之流一般都是8080。
  2. Dubbo端口,一般按默认规则都是20880。

环境变量

  1. DUBBO_IP_TO_REGISTRY = Node IP
  2. DUBBO_PORT_TO_REGISTRY = Dubbo端口映射端口
  3. 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.ipbind.port参数还是容器的IP端口,因为这两个参数是用于Netty绑定网络IP端口所用的,不能直接用NodePort映射出来的。不然其实可以直接在bootstrap.yml里面配置dubbo.protocol.hostdubbo.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

原创不易,转载请注明出处,谢谢。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐