当连接来自 AWS EC2 上群模式下的不同 Docker 容器时,Netstat 显示相同的外部地址

当连接来自 AWS EC2 上群模式下的不同 Docker 容器时,Netstat 显示相同的外部地址

我一直在尝试找出这个问题,但无法确定实际原因。这始于尝试在 AWS EC2 上的 docker swarm 中运行 HDFS。服务正确启动,日志显示 HDFS 数据节点能够获取正确的容器 IP(XXX你的意思是来自 Swarm 网络,对吗?),但当它尝试连接到 namenode 时,请求包含子网中的 IP,但主机部分是错误的。我还注意到,在 namenode 上执行 netstat 时,来自 datanode 的所有连接都显示相同的外部地址,并带有 ec2.internal prostfix

[root@hdfs-namenode /]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 hdfs-namenod:cslistener ip-10-0-255-10.ec:54714 ESTABLISHED
tcp        0      0 hdfs-namenode:ssh       ip-10-0-255-10.ec:53178 ESTABLISHED
tcp        0      0 hdfs-namenode:ssh       ip-10-0-255-10.ec:34606 ESTABLISHED
tcp        0      0 hdfs-namenod:cslistener ip-10-0-255-10.ec:54548 ESTABLISHED
tcp        0     79 hdfs-namenod:cslistener ip-10-0-255-10.ec:59888 ESTABLISHED
Active UNIX domain sockets (w/o servers)

swarm 覆盖网络子网是10.0.255.0/24。如果我更改子网,IP 地址始终具有正确的子网,但最后一个八位字节不同。

如果您检查netstat输出,就会发现 ssh 连接来自同一主机上的不同容器。

当我将另一个 ec2 实例添加为工作节点时,我看到了同样的问题。连接到 namenode 的数据节点都具有相同的 IP 地址。它将是同一个子网,但与管理器节点的最后一个八位字节不同。似乎主机网络上有 NATing,但我找不到有关它的任何信息。这仅在 swarm 模式和 AWS EC2 上发生。当我尝试在 Mac 上运行它时,swarm 网络正常工作。

我正在调查/etc/resolv.conf

[root@hdfs-namenode /]# cat /etc/resolv.conf
search ec2.internal
nameserver 127.0.0.11
options ndots:0

我不确定这个配置是否会影响 DNS 解析。

netstat -n显示相同的外国地址,但不正确

root@hdfs-namenode /]# netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 10.0.255.3:9000         10.0.255.10:54714       ESTABLISHED
tcp        0      0 10.0.255.3:22           10.0.255.10:53178       ESTABLISHED
tcp        0      0 10.0.255.3:22           10.0.255.10:34606       ESTABLISHED
tcp        0      0 10.0.255.3:9000         10.0.255.10:54548       ESTABLISHED
tcp        0      0 10.0.255.3:9000         10.0.255.10:59888       ESTABLISHED

希望这是发布此问题的正确论坛。任何建议都将不胜感激。

更新:

我正在使用 Ubuntu 18.04,并且 EC2 实例在 AWS 默认 VPC 中配置,并将安全组设置为向该特定安全组开放所有端口,从而打开节点之间的互连。

为了部署服务,我使用了 docker stack deploy 为 docker-compose.yml 文件提供了定义的覆盖网络,并且每个服务都连接到该网络

networks:
  data-net:
    driver: overlay

  hdfs-namenode:
    container_name: hdfs-namenode
    hostname: hdfs-namenode
    image: hdfs-namenode:latest
    networks:
    - data-net
    ports:
    - 9000:9000
    - 50070:50070
    - 50470:50470
    volumes:
    - ./data/hdfs-namenode:/opt/app/data/namenode

如果任何其他信息有助于重现此问题,请告诉我。

相关内容