問題描述
- 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這個公共配置文件。