问题描述
- 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是指定网段?
方式一
- 在代码中的配置文件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
-
在nacos中的公共配置文件application-dev.yml中添加,可以避免每个项目都修改一次bootstrap.yml再打镜像发布。
-
确保所有项目的代码调用application-dev.yml这个公共配置文件。