我在coreos中启用了flanneld.service部署了kubernetes。然后我通过kubernetes replication-controller启动了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时遇到了以下两个问题:
如果我在core-site.xml中使用namenode service ip 10.100.220.223作为数据节点的fs.defaultFS。当datanode尝试通过rpc请求将自己注册到namenode时,namenode获取了datanode的错误ip地址。通常它应该获取datanode的pod ip,但是在这种情况下,datanode主机的docker0 inet地址被报告给namenode。
为了解决这个问题,我在core-site.xml中使用了namenode pod ip 10.20.96.4来获取datanode。这次datanode根本无法启动。错误信息报告" k8s_POD-2fdae8b2_namenode-controller-keepsk_default_55b8147c-881f-11e5-abad-02d07c9f6649_e41f815f.bridge"用作namenode主机而不是namenode pod ip。
我试图通过网络搜索此问题,但没有任何帮助我。你可以帮我解决这个问题吗?感谢。
答案 0 :(得分:3)
使用最新的kubernetes并将params --proxy-mode=iptables
传递给kube-proxy start命令,HDFS群集现在正常工作
答案 1 :(得分: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/363和https://groups.google.com/forum/#!search/hdfs%2420flannel/google-containers/P4uh7y383oo/bPzIRaxhs5gJ。