Corda 4.0 AWS节点部署问题

时间:2019-03-09 00:15:23

标签: linux docker networking amazon-ec2 corda

由于开发原因将库升级到新版本(Corda 4)后,我在升级库后在Docker上运行JVM进程时遇到了问题,因为到目前为止,我将运行在Docker容器中的程序(节点)设置为侦听所有接口(0.0.0.0)在AWS EC2上以主机模式运行时,会将其绑定到所有网络接口,在所有接口上侦听并使用该转发。

现在,他们已经在https://github.com/corda/corda/blob/061db8b1a1ac1fa9f1a063caf7ce4f009aa283db/node/src/main/kotlin/net/corda/node/internal/Node.kt#L322中进行了编码,最近阻止了该功能,为4。

https://docs.corda.net/corda-configuration-file.html

结合使用
  

实际上,ArtemisMQ消息传递服务绑定到指定端口上的所有本地地址。但是,请注意,主机已作为广告中的条目包含在网络图中。因此,当跨计算机群集运行节点时,此处列出的值必须可从外部访问。如果提供的主机不可访问,则该节点将尝试自动发现其公共主机。

这导致必须在节点配置中指定公共IP,然后尝试绑定到该公共IP,但由于EC2没有将公共IP视为直接网络接口,而仅将其作为内部路由接口(NIC),因此它不能),然后在其堆栈的较后阶段转换为公共IP。

AWS EC2实例ifconfig:

 br-9121696521bd Link encap:Ethernet  HWaddr 02:42:56:7C:6A:27
      inet addr:172.18.0.1  Bcast:172.18.255.255  Mask:255.255.0.0
 ...
 docker0   Link encap:Ethernet  HWaddr 02:42:78:C3:69:1B
      inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
 ...
 eth0      Link encap:Ethernet  HWaddr 02:5F:BE:63:67:82
      inet addr:10.0.0.56  Bcast:10.0.0.255  Mask:255.255.255.0
 ...
 lo        Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
 ...
 veth0c214d6 Link encap:Ethernet  HWaddr BE:2A:29:08:94:B3
      inet6 addr: fe80::bc2a:29ff:fe08:94b3/64 Scope:Link
 ...
 veth2b54799 Link encap:Ethernet  HWaddr 66:81:E9:01:91:10
      inet6 addr: fe80::6481:e9ff:fe01:9110/64 Scope:Link
 ...
 veth60fffa5 Link encap:Ethernet  HWaddr 7A:FE:10:33:A9:80
      inet6 addr: fe80::78fe:10ff:fe33:a980/64 Scope:Link
 ...
 vethe4f9a9a Link encap:Ethernet  HWaddr EE:C7:CB:C8:25:85
      inet6 addr: fe80::ecc7:cbff:fec8:2585/64 Scope:Link

结果:

  1. Corda现在强制我在node.conf p2pAddress中进行设置,然后将其发布到NMS,并由其他节点用于与之通信。
  2. 我无法设置EC2公共IP,因为Corda尝试使用该主机名“绑定”到该NIC,而该主机名没有直接暴露给EC2
  3. 我无法将其设置为0.0.0.0以使其绑定到所有nic并监听所有传入的路由,因为它们在核心Node.kt中进行了硬编码以阻止节点(如果提供了0.0.0.0的话)
  4. 我只能设置为在容器/主机中可见的ip,而在->节点不可访问之外不可见
  5. 我已经研究过尝试使Docker网络堆栈欺骗以将其本地IP表示为外部IP的本地IP,因为它是虚拟网络层,但它仅提供对现有NIC(10.0.xx IP)或环回IP的子网划分功能范围(192.168.xx或10.xx或172.xxx)
  6. 这篇帖子Running corda nodes in different machines也正好说明了我的问题以及我所提出的解决方案,他们在4.0版中将其关闭。

问题/可能性

选项1(AWS / Docker):

通过公有IP接口伪装的IP,通过Docker IPAM / Pipeworks可以在EC2中将欺骗性的公共IP作为实际的NIC IP看到?

选项2(特定于Corda):

将配置更改为以某种方式接受0.0.0.0或使detectPublicIp更智能,并使用NMS查找其自己的IP。我希望它具有这种智能,但是后来我发现它只是在可用的NIC上查找。失败,出现AMQ224000错误。

据我了解, Corda 4.0无法无法在公共云提供商(Azure / AWS / GC)上运行,因为它要求存在具有公共IP的NIC,而Azure / AWS / GC则需要这样做没有空位,如果我错了,Corda团队的人可以纠正我吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解,内部Artemis服务器将无法绑定,因为它正在使用(默认情况下)p2pAddress,该地址现在必须是有效的公共地址。您也可以通过提供messagingServerAddress来覆盖它。有关更多详细信息,请参见https://docs.corda.net/corda-configuration-file.html?highlight=messagingserveraddress