• 如何让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这个公共配置文件。

  • 相关阅读:
    Ecplilse使用
    JDK安装
    浏览器的前世今生
    RethinkDB
    [css]兼容性
    【js】undefined
    String面试题
    SOS.dll(SOS 调试扩展)
    【ajax跨域】原因原理解决
    腾讯WEB前端开发三轮面试经历及面试题
  • 原文地址:https://www.cnblogs.com/zoujiaojiao/p/12752860.html
Copyright © 2020-2023  润新知