Spring cloud配置指定网络掩码

时间:2016-05-10 22:57:50

标签: java spring microservices netflix-eureka rancher

我尝试在多个Amazon实例上使用Rancher部署微服务集群。

我遇到的一个问题是每个docker容器现在有2个IP地址; 1个本地IP地址,由docker本身定义,以及另一个路由到Rancher网桥的IP地址。

45: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:b4:d3:52:be:25 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.42.232.123/16 scope global eth0
       valid_lft forever preferred_lft forever

Rancher定义的IP地址是10.42.*.*范围内的IP地址,对于每个容器都是唯一的,这就是为什么我想让我的Spring云配置使用这个IP地址。

否我发现您可以在配置中指定要使用的接口,但是是否也可以指定子网?因为两个IP都在同一个接口(eth0)上,但服务应该使用10.42。(例如,在发现服务处注册自己)。

我希望有人可以帮助我进一步解决这个问题。

我的配置的相关部分:

eureka:
    instance:
        preferIpAddress: true

(Eureka使用与spring cloud相同的配置)

2 个答案:

答案 0 :(得分:0)

您可以像这样使用rancher-metadata api:

http://rancher-metadata/latest/self/container/service_name

您可以获得service_namehostnameprimary_ip和其他人。

所以你可以在Dockerfile中使用:

enter image description here

答案 1 :(得分:0)

我已经实施了一个类似De Zhang的解决方案,该解决方案使用由IPSec管理网络上的牧场主设置的IP地址发布,该迷你脚本作为图像的入口点:

echo "Setting rancher managed ip address on MANAGED_IP environment variable"
export MANAGED_IP=$(curl --retry 5 --connect-timeout 3 -s 169.254.169.250/latest/self/container/primary_ip)
echo "Rancher IP is ${MANAGED_IP}"
java -Djava.security.egd=file:/dev/./urandom -jar /app.jar

在应用程序引导之前,这将设置从元数据服务获取的IP地址并将其存储在环境变量MANAGED_IP中,然后将其打印出来。

我的配置存储库(我正在使用Spring Cloud Config Server)看起来像这样

eureka:
  {...}
  shouldUseDns: false
  instance:
    preferIpAddress: true
    ip-address: ${MANAGED_IP}