• docker swarm下部署的spring cloud,时不时就会取到ingress网络的ip


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Hobart-Ljw 2024-04-12 11:50 采纳率: 25% 浏览 2 首页/ 开发工具 / docker swarm下部署的spring cloud,时不时就会取到ingress网络的ip dockerjavaspring cloud ​我的spring cloud项目和nacos分别部署到不同的docker容器下,然后通过docker swarm管理这两个docker容器。 两个docker容器都加入 base-network和nacos-server-net网络的 我发现spring cloud往nacos注册的时候, 有时候取到的是ingress网络的ip,然后openFeign就调用接口失败,因为ingress的ip是ping不通的。怎么做才能忽略不去取ingress网络的ip呢? ​ 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-12 11:50
      关注

      引自免费微信小程序:皆我百晓生

      为了确保Spring Cloud应用在Docker Swarm环境中正确地连接到Nacos服务,你需要调整应用内部的配置,使其优先使用base-networknacos-server-net网络中的IP地址,而不是自动获取的Ingress网关IP。这里是一个详细的步骤:

      1. 理解Docker Swarm的网络模式: Docker Swarm会为每个服务创建一个逻辑上的overlay网络,并将服务实例连接到这个网络上。同时,如果你定义了外部网络(如base-networknacos-server-net),服务也会连接到这些网络。

      2. 配置Spring Cloud应用: 在Spring Cloud应用中,OpenFeign客户端默认会使用LocalServerAddress来自动发现服务提供者的地址。这可能会导致它从Ingress网关获取IP地址。为了避免这种情况,你需要手动指定Nacos服务的地址。

      3. 修改application.yml 或 application.properties: 在Spring Cloud应用的配置文件中,添加以下配置,明确指定Nacos服务器的地址:

        # application.yml
        spring:
          cloud:
            discovery:
              client:
                service-url:
                  defaultZone: http://nacos-service-name:nacos-port@nacos-server-ip:8848/
        

        或者

        # application.properties
        spring.cloud.discovery.client.serviceUrl.defaultZone=http://nacos-service-name:nacos-port@nacos-server-ip:8848/
        

        其中,

        • nacos-service-name 是你在Swarm中给Nacos服务起的名字。
        • nacos-port 是Nacos服务暴露的端口。
        • nacos-server-ip 应该是你在Docker Swarm中实际运行Nacos服务的节点的IP地址。你可以通过查看Swarm集群的服务状态来确定这个IP地址。
      4. 验证配置: 重启Spring Cloud应用,检查日志确认应用是否已经成功连接到正确的Nacos服务地址。

      5. 监控和调试: 如果仍然存在问题,可以考虑在Spring Cloud应用的日志中增加更多关于服务发现的详细信息,以便于进一步排查问题。

      注意:由于你没有提供具体的Nacos服务名称和端口,你需要根据实际情况替换上述示例中的nacos-service-namenacos-portnacos-server-ip。另外,确保你的Docker Swarm环境中的Nacos服务确实可用,且端口正确暴露。

      展开全部

      评论 编辑记录
    • GISer Liu 2024-04-12 13:46
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对你描述的问题,我会提供详细的解决思路和解决方案:

      问题分析:

      1. Spring Cloud 往 Nacos 注册时不稳定地取到 Ingress 网络的 IP 地址。
      2. Ingress 网络的 IP 地址不可达,导致 OpenFeign 调用接口失败。

        解决思路:

      3. 排查 Docker Swarm 网络配置 :确认 Docker Swarm 网络配置是否正确,以确保容器之间能够正常通信。
      4. 限制服务发现范围 :限制 Spring Cloud 服务发现时的 IP 地址范围,避免获取到不可达的 Ingress IP。
      5. 配置 Spring Cloud 注册中心 :在 Spring Cloud 项目中配置注册中心,指定正确的 IP 地址或主机名,确保注册信息正确传递给 Nacos。

        解决方案:

      6. 排查 Docker Swarm 网络配置 :确认容器都正确加入了 base-networknacos-server-net 网络,并且网络配置无误。
      7. 限制服务发现范围 :在 Spring Cloud 项目的配置中,指定 Nacos 注册中心的地址,并限制注册中心的服务发现范围,避免获取到不可达的 Ingress IP。示例配置如下:
        yamlCopy code
        spring:
        cloud:
        nacos:
        discovery:
        server-addr: ${NACOS_SERVER_ADDR:localhost}:${NACOS_SERVER_PORT:8848}
        # 设置服务发现的 IP 范围,避免获取到 Ingress IP
        client-ip: ${LOCAL_IP}
        
      8. 配置 Spring Cloud 注册中心 :在 Spring Cloud 项目中,配置 Nacos 注册中心时,使用正确的 IP 地址或主机名,确保服务注册信息正确。示例配置如下:
        yamlCopy code
        spring:
        cloud:
        nacos:
        discovery:
        server-addr: ${NACOS_SERVER_ADDR:localhost}:${NACOS_SERVER_PORT:8848}
        
        确保在 Docker Swarm 中,Nacos 服务和 Spring Cloud 服务都能够正常访问,避免因网络配置或地址解析问题导致注册失败或调用失败。
        以上方案应该能够解决你描述的问题。如果有任何疑问或需要进一步的帮助,请随时提出。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-12 23:04
      关注

      【相关推荐】



      • 这篇博客: Docker Swarm Nacos指定容器虚拟IP自定义网络中的 查看网络 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
        # 创建初始化服务 该网络是我为项目而添加的
        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

      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 12:23
      关注

      中午好🌞🌞🌞
      本答案参考ChatGPT-3.5

      针对该问题,我们可以采取以下方法来解决:

      1. 配置Docker Swarm的DNS服务,使得服务能够直接通过服务名称访问,避免使用IP地址直接访问服务。具体可以参考Docker Swarm官方文档 https://docs.docker.com/engine/swarm/services/#dns-services,进行配置。

      2. 配置Spring Cloud的注册中心,使得服务注册到注册中心时使用的是docker私有网络的IP地址,而不是Ingress网络的IP地址。可以在Spring Cloud配置文件中,通过配置nacos的ip,指定使用docker私有网络上的nacos服务,如下:

      spring:
        cloud:
          nacos:
            server-addr: nacos-service:8848
      

      在这里,nacos-service为docker私有网络中nacos服务的服务名称。

      1. 如果以上两种方法无法解决问题,可以考虑重新配置Ingress网络,避免出现选错IP地址的情况。如具体实现可以参考Ingress网络的官方文档 https://kubernetes.io/docs/concepts/services-networking/ingress/。

      修改后的docker-compose.yml文件如下:

      version: "3.7"
      networks:
        base-network:
          external:true
        nacos-server-net:
          external:true
      
      services:
        app:
          image: ir
          networks:
            - base-network
            - nacos-server-net
          ports:
            - 7004:7004
            - 20889:20889
          environment:
            - spring.cloud.nacos.server-addr=nacos-service:8848
      

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    夏季,糖友需要注意些什么
    【王道】计算机网络网络层(三)
    [篇四章一]_在 VMWare 16 上安装 Windows 98 SE 操作系统
    数据可视化之疫情可视化
    简单讲解Android Fragment(三)
    低代码助力软件开发
    Pillow(PIL)库的主要方法介绍
    【数据结构与算法】用队列实现栈&&用栈实现队列&&设计循环队列
    pytest之parametrize()实现数据驱动
    厨神之蛋糕制作
  • 原文地址:https://ask.csdn.net/questions/8087293