如何让nacos中服务注册的ip是自定义的网段ip ( docker swarm )

问题描述

  1. Nacos进行服务发现得时候,注册是容器得虚拟ip。docker swarm集群下,做overlay后,容器会有多个网卡。Nacos进行发现得时候,获取的ip和服务端口,存在一定问题,网关服务与其他服务可能发生不通的情况。

查看网络

# docker network ls


查看各个网络的网段

# docker network inspect vonedao_net|grep Subnet



docker_gwbridge:172.18.0.0/16    
ingress:10.0.0.0/24
vonedao_net:192.168.0.0/24   该网络是我为项目而添加的

集群创建网络的命令:指定网段

docker network create --driver overlay --subnet=192.168.0.0/24  --gateway=192.168.0.254  vonedao_net

在项目的yaml文件中会将容器增加到该网络中

# cat vonedao-tenant-finance-biz.yaml 
version: '3.0'
services:
  vonedao-tenant-finance-biz:
    image: docker.vonedao.com/vonedao-cs/vonedao-tenant-finance-biz:3.7.0
    extra_hosts:
      - "nacos.vonedao.com:ip"
    environment:
      - NACOS-PORT=80
      - NACOS-HOST=nacos.vonedao.com
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
    networks:
      - vonedao_net
    ports:
      - "6060:6060"

networks:
  vonedao_net:
    external: true

查看容器网络:

容器有:eth0@if6455 、eth2@if6457、eth1@if6459 3个网卡,用于与
docker_gwbridge、ingress、vonedao_net三个网络进行沟通。

nacos中发现服务,进行服务注册时候,只取eth0地址


由于这个网卡是随机分配的3个需要的网络,不能确保eth0就一定是vonedao_net的网络,若nacos取到ingress地址,会导致网关服务出现连接超时问题,初步怀疑是ingress没有开放服务端口:

验证这个怀疑可以使用下面办法:
在网关服务这个容器中可以安装telnet命令进行检测(telnet安装方法在 https://www.cnblogs.com/zoujiaojiao/p/12753071.html),eth0@if6455 、eth2@if6457、eth1@if6459 3个网卡对应的ip,和端口进行验证。
发现只有属于vonedao_net网络的ip和端口才能telnet通过:

也就是说,必须保证nacos上面注册的ip是vonedao_net网络的ip

如何让nacos上容器注册的ip是指定网段?

方式一

  1. 在代码中的配置文件bootstrap.yml里面添加配置,这个方式需要在每个项目都加上:
spring:
  application:
    name: @artifactId@
  cloud:
    inetutils:
      ignored-interfaces: eth.*
      preferred-networks: 192.168.0

指定网络:preferred-networks: 192.168.0
2. 重新打包镜像,更新服务
3. 通过nacos检查

4. 在网关服务中,可以看日志,是否还有连接失败的错误。

已经成功了。

方式2

  1. 在nacos中的公共配置文件application-dev.yml中添加,可以避免每个项目都修改一次bootstrap.yml再打镜像发布。

  2. 确保所有项目的代码调用application-dev.yml这个公共配置文件。

posted @ 2020-04-22 16:18  邹姣姣  阅读(2376)  评论(0编辑  收藏