我对 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) 上
这将有助于查明问题发生的位置,并且数据包转储也可能揭示问题发生的原因。