HDFS 集群无法与 kubernetes + flannel 一起工作

HDFS cluster can't work with kubernetes + flannel

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

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

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

  2. 为了解决这个问题,我在 core-site.xml 中使用了 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。

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

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

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

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

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

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