2

我部署了 kubernetes,并在 coreos 中启用了 flanneld.service。然后我通过 kubernetes 复制控制器启动了 hdfs namenode 和 datanode。我还为 namenode 创建了 kubernetes 服务。namenode服务ip为10.100.220.223,namenode的pod ip为10.20.96.4。就我而言,一个namenode 和一个datanode 恰好位于同一主机上。并且namenode pod和datanode pod可以互相ping通。

但是我在尝试启动hdfs datanode时遇到了以下两个问题:

  1. 如果我在 datanode 的 core-site.xml 中使用 namenode 服务 ip 10.100.220.223 作为 fs.defaultFS。当 datanode 尝试通过 rpc 请求将自己注册到 namenode 时,namenode 为 datanode 获取了错误的 IP 地址。通常它应该获取datanode的pod ip,但在这种情况下,datanode主机的docker0 inet地址会报告给namenode。

  2. 为了解决这个问题,我在 core-site.xml 中为 datanode 使用了 namenode pod ip 10.20.96.4。这次datanode根本无法启动。错误信息报告“k8s_POD-2fdae8b2_namenode-controller-keptk_default_55b8147c-881f-11e5-abad-02d07c9f6649_e41f815f.bridge”被用作namenode主机而不是namenode pod ip。

我试图通过网络搜索这个问题,但没有任何帮助。你能帮我解决这个问题吗?谢谢。

4

2 回答 2

3

使用最新的 kubernetes 并将参数传递--proxy-mode=iptables给 kube-proxy start 命令,HDFS 集群现在可以工作了

于 2015-11-12T08:44:02.120 回答
0

问题可能是由于通过 kube-proxy,它是一个用户空间代理将导致所有源 IP 相同。不知道有没有办法通过应用层协议指定datanode IP。如果有办法通过命令行参数或一些 xml 配置文件提供它,您可以将二进制文件包装在首先获取 IP 的 shell 脚本中:

 IP=$(ip -4 -o addr show eth0 | grep -Po 'inet \K[\d.]+')

然后通过参数传递它或在启动 datanode 二进制文件之前将其写入配置文件。

有关更多信息,请参阅https://github.com/coreos/flannel/issues/363https://groups.google.com/forum/#!search/hdfs%2420flannel/google-containers/P4uh7y383oo/bPzIRaxhs5gJ

于 2015-11-11T23:46:29.517 回答