etcd cluster is unavailable or misconfigured

上周在配置跨主机flannel网络的时候,发现完全按照教程搭建 edcd 集群。在启动后使用 etcdctl 命令时出现如下报错:

1
2
3
4
Error:  client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused; 
error #1: dial tcp 127.0.0.1:2379: getsockopt: connection refused
error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused
error #1: dial tcp 127.0.0.1:2379: getsockopt: connection refused

出错的环境是两台装有最新的 Ubuntu 20.04 LTS 的 x86-64 机器,etcd 版本是 3.3.10。

搜索引擎查询后发现网友们的出错原因普遍是 etcd 的启动文件 etcd.service 或者 etcd.confETCD_LISTEN_CLIENT_URLS 这一项缺少 localhost 的地址 http://127.0.0.1:2379 ,只要补上就正常运行了。

可是我的 ETCD_LISTEN_CLIENT_URLS 中已经包括了 http://127.0.0.1:2379,但还是出此错误,属实让人迷惑。更奇怪的是,在此之前,我按教程在单一主机上配置了flannel容器网络,并没有出现上述报错。但是在跨主机时,却出现上述错误,网上也没有网友记录了类似的情况。

我又检查了端口的打开情况,该打开的端口也是打开的了。后来,经过好几个小时的调试,终于找到了出错的原因:

我没有没有在root身份下打开etcd,而是使用了 sudo 命令,这导致上述的报错。

我猜原因可能是 sudo 命令获取的只是临时的超级用户权限,而跨主机时 etcd 的运行需要持久的超级用户权限来保证分布式系统互相访问的能力。

所以如果有和我有相同问题的朋友,可以按下面的步骤尝试:

  1. 检查自己的 etcd 启动/配置文件里 ETCD_LISTEN_CLIENT_URLS 这一项有没有缺少 localhost 地址 http://127.0.0.1:2379 。若缺少了,需要补上。

  2. 检查etcd需要的端口打开了没有,比如我的 2379 、2380 端口。如果有没打开的端口,打开它。

  3. 启动 etcd 的时候前,先 sudo su 进入 root 权限,而不是在启动时使用 sudo 的临时root权限。

    1
    2
    sudo su
    systemctl start etcd