OneData是我们实验室某个存储项目的对比项目之一,因此我在阿里云上部署了一套OneData的测试集群,在部署的过程中遇到不少坑,故记录下来以免以后再走。
由于之前借助开源项目https://github.com/wgslr/getting-started 部署过OneData,因此这次也是轻车熟路,做好了如下准备工作:
- 在阿里云上申请了 北京、上海、成都、深圳等5个ECS实例
- 由于仅仅是测试需要,因此将五个实例的安全组设为
all open
,操作系统选择ubuntu server 18.04 (图省事) - 系统内部,通过docker官方源安装
docker 19.03.8
,同时准备好了docker-compose
等环境
然而还是碰到了坑
坑1 - 容器运行失败 hostname -f return non-zero value
这里不得不承认我并不熟悉docker的使用,因此对于已经运行失败stop的容器我根本不知道如何进去debug。一种可行的debug方式为将运行失败的容器commit为image,然后以此image启动新的容器并且执行bash程序可以帮助调试。
最终我通过将docker-compose file中的网络类型从host
改成了桥接,并且手动暴露了9443/443/80/53
等端口,绕过了这个坑。
坑2 - 容器运行失败 cannot connect to node1.xxx
到这里我放弃了getting-started
带来的简便脚本,因为我意识到这份三年前的脚本在新新环境下的适应能力需要一个时间充裕且富有挑战精神的冒险家来调试,而不是熬夜到两点快抓狂的我。因此我开始直接使用官网提供的最新docker-compose file,其中依赖的onedata image为19.02.1,几个月前刚出炉的版本。
坑3 - dns resolve failed
我实在是没想到onedata 19.02.1竟然需要一个专属域名来支持子域名管理,现在买域名和走域名审批根本不现实。。。
因此我在上海ECS上自己搭建了一个老牌DNS服务器,用的是bind,为自己赋予了一个假域名,并通过把ECS中resolv.conf全都指向我的dns server来获得一个局部地区认可的假域名。
坑4 - oneprovider无法连接onezone
仔细less日志的时候我突然发现,已经02:30了,所以不再细看直接ctrl+G到末尾,问题出在我虽然用了假域名和假的证书,然而证书oneprovider并没有认,导致ssl连接失败。幸亏onedata早就为了假证书的问题留了后路,通过overlay.config设定{force_insecure_connections, true}
能够忽略不安全的ssl连接。
坑5 - oneprovider无法通过域名连接onezone
通过忽略证书问题,已经能直接通过ip连接onezone了,然而通过域名时就会出现connection reset
,使用任一非onezone主机curl -k https://mydomain.com
也会出现SSL_SYSCALL_ERROR (35)
的错误。奇怪了,只听说过域名能过ip不给过的,今天竟然还反了,不睡觉了。经过wireshark抓包、tcpdump抓包,各种分析,发现使用域名进行ssl连接的时候,在第一次握手阶段就onezone就没反应了,这种场景让我不禁回想起当年我VPS被封时候的场景,该不会被封了吧?
果然,没有备案的域名无法绑定到阿里云ECS,所以http协议80端口的会友情提示备案,而https协议443端口的则一声不吭就drop了。解决方式是换成香港地区的ECS重新搭建一个Onezone。
睡觉!