Docker Swarm Nacos指定容器虚拟IP自定义网络

Docker Swarm Nacos指定容器虚拟IP自定义网络

版权声明:内容供内部学习使用,请勿外传!转载请附上作者信息

Description:
Nacos进行服务发现得时候,注册是容器得虚拟ip。docker swarm集群下,做overlay后,容器会有多个网卡。Nacos进行发现得时候,获取的ip和服务端口,存在一定问题,网关服务与其他服务可能发生不通的情况。
在运行时指定自己网络的时候,容器里面多个网络,多个IP,但是注册的不是固定注册某个网卡的IP作为服务IP。
这就导致有时候注册的IP不是属于overlay网络的IP。服务访问就会出现问题。

查询资料发现有很多解决方式 但是都是无果:

route -n路由转发方式

iptables -A INPUT -p tcp --dport 7946 -j ACCEPT 在worker节点增加以下策略 方式

ip link set docker_gwbridge down link模式各种,都会有问题

Docker Swarm初始化集群


# 在manage机器初始化主节点
docker swarm init
得到:docker swarm join --token SWMTKN-1-0jluwrk0utcegtz87jg2s6f6rvblyfm2due5yjhun9lqc71yyv-9zrrbpept3qzy73ue98tr4ldm 192.168.3.63:2377
docker node ls #查看集群节点
# 在子节点node1加入集群
docker swarm join --token SWMTKN-1-0jluwrk0utcegtz87jg2s6f6rvblyfm2due5yjhun9lqc71yyv-9zrrbpept3qzy73ue98tr4ldm 192.168.3.xx:2377
# 在子节点node2加入集群
docker swarm join --token SWMTKN-1-0jluwrk0utcegtz87jg2s6f6rvblyfm2due5yjhun9lqc71yyv-9zrrbpept3qzy73ue98tr4ldm 192.168.3.xx:2377
# 在manage机器初始化集群网络
docker network create -d overlay --subnet=192.168.0.0/24 --gateway=192.168.0.254 --attachable by-sw-net

注意:我这边创建了一个自定义网络 by-sw-net

查看网络

# 创建初始化服务 该网络是我为项目而添加的
docker network inspect by-sw-net
# 查看Containers节点能看到目前注册进来的服务,问题是其他服务注册到哪里了?
# 原来是docker swarm 网络会有一个默认的网络 是 ingress
docker network inspect ingress
# 查看容器网卡信息
docker exec 0792caa53281 ip addr

  • 问题:部分服务没有指定会被随机分配到这个网卡里面 也就是eth1,可以用命令查看 看图片发现 eth0是我们自定义网络 eth1是 默认 ingress网络 我们要保证每个服务切换到eth0这样集群服务内部访问就会正常 后面会做解释 先创建集群部署
image-20210307025924243 image-20210307025517090

先创建集群服务Service


# 创建初始化服务
docker service create --with-registry-auth --replicas 1 --publish published=9100,target=9100 --network by-sw-net --reserve-memory 512M --limit-memory 512M --name by-service-gateway-prod registry-vpc.cn-hangzhou.aliyuncs.com/by366-server/by-service-gateway-prod:2021_0305_0051

docker service create --with-registry-auth --replicas 1 --publish published=9200,target=9200 --network by-sw-net --reserve-memory 512M --limit-memory 512M --name by-service-securitys-prod registry-vpc.cn-hangzhou.aliyuncs.com/by366-server/by-service-securitys-prod:2021_0305_0051

docker service create --with-registry-auth --replicas 1 --publish published=9300,target=9300 --network by-sw-net --reserve-memory 512M --limit-memory 512M --name by-service-job-prod  registry-vpc.cn-hangzhou.aliyuncs.com/by366-server/by-service-job-prod:2021_0306_0129

docker service create --with-registry-auth --replicas 1 --publish published=9001,target=9001 --network by-sw-net --reserve-memory 512M --limit-memory 512M --name by-service-cust-prod registry-vpc.cn-hangzhou.aliyuncs.com/by366-server/by-service-cust-prod:2021_0305_0100

当创建多个比如10来个服务的时候会发现,服务注册的端口在Nacos显示不一致导致服务和服务之间调用会出现问题

image-20210307024346012image-20210307024435999

这时候需要进行配置 我们可以进行查询,先查看Service网络

# 查询部署的服务
docker service ls
# 查看服务详情信息
docker inspect 0nc7v7f6oje2

可以查询VirtualIPs 能看到会有多个网卡 或查询
或者直接查询docker service inspect wcsmuap81i2q -f “{{ .Endpoint.VirtualIPs }}”

image-20210307024855722 image-20210307025010188
  • 这时候会发现有的服务注册的IP是192有的服务注册是10开头(这里就会有问题 服务调用connect 调用不通)

这里有个比较蠢的方法可以解决暂时的需求

# 先断开网络
docker network disconnect by-sw-net f754aba2ea9c
# 在从新加入创建的自定义网络
docker network connect by-sw-net f754aba2ea9c
# 在重启网络,这样Nacos注册的IP会变成192开头的
docker restart f754aba2ea9c
  • 但是会存在一个问题因为是容器 这时候原先的10端口注册进来不会被kill 这时候需要手动下线这个服务否则一样会存在问题 如图:
image-20210307030545310

解决方案 :加入集群,初始化自定义网络后

在项目bootstrap.yml下手 增加配置:

spring:
  cloud:
  	inetutils:
  		ignored-interfaces: eth.*
  		preferred-networks: 192.168.0
  • 这时候从新更新启动service服务会发现就正常了 有哪些服务调用就要改哪些服务
image-20210307030811415
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薯条大爹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值