1

我正在尝试在谷歌计算上部署一个应用程序,但我遇到了一个网络问题,该应用程序由一个前端(在使用复制控制器部署的 docker 容器内运行)和一个 aerospike 节点的后端组成。

aerospike 节点不是容器集群的一部分,但它们在同一个项目中,并且容器集群和 aerospike 节点都运行在默认网络中。

使用默认配置运行的 aerospike 节点

从码头集装箱内部我正在尝试这样做

var client = aerospike.connect(internal-ip-of-aerospike-node, 3000)

但连接失败,我做错了什么?

4

1 回答 1

1

我对 docker 容器如何在 GCE 上运行(或者你是如何做到的)有点粗略,但是 IIRC 构建了一个覆盖网络,以便容器可以在它们自己的地址空间中被寻址。这通常通过在主机和容器之间创建一个虚拟网络接口对来完成。为了摆脱覆盖网络,在主机系统上添加了这样的伪装规则(来自https://docs.docker.com/articles/networking/#binding-container-ports-to-the-host ):

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16       !172.17.0.0/16

覆盖网络应该选择为不与主机网络冲突,但如果此覆盖网络与 GCE 内部网络重叠,则从容器到覆盖网络的连接将不起作用。

我无法回答为什么它不起作用的问题,但我可以建议尝试:

  • 为 aerospike 节点提供一个外部地址并尝试连接到该地址。如果它有效,则表明问题出在容器网络中。
  • 启动一个不相关的测试虚拟机并尝试从
  • GCE 默认网络中是否有任何防火墙可能会妨碍您?尝试添加显式规则以允许流量。

调试这些问题的常用方法是运行创建(失败)请求流的程序,然后尝试查看每个步骤的数据包流:

while :; do nc -w1 -n -v -z <aerospike-ip> 3000; sleep 1; done"

然后,tcpdump 查看是否有连接尝试以及数据包的样子:

  • ip link show 和/或 ip addr show(查找接口)
  • tcpdump -n -v -c 10 -i <接口> tcp 端口 3000

并在以下位置执行此操作:

  • 在容器中(应该是 eth0)
  • 在 docker 主机上,在容器虚拟接口上 (veth<something>)
  • 在 docker 主机上,在主机网络接口 (eth0) 上
  • 在 aerospike 主机 (eth0) 上

这将有助于查明问题发生的位置,并且数据包转储也可能揭示问题发生的原因。

于 2015-01-07T13:00:40.760 回答