Docker容器不能与etcd通信

我使用这个cloud-config.yml在digitalocean创build了3个coreos机器: https ://gist.github.com/socketwiz/d6fe23d19180a1ad8b5a其中令牌被replace为我从中检索到的:

$ curl -w "\n" "https://discovery.etcd.io/new?size=3"

到目前为止,一切运作良好。 我可以看到其他机器

$ curl -L http://<machine_ip>:2379/v2/keys/

在他们中的每一个,并获取有效的数据,所以我怀疑我的防火墙设置是好的(但也许不)。 我的问题开始时,我设置docker集装箱。 首先我得到docker0的IP地址:

$ ifconfig docker0

然后我设置docker集装箱:

$ docker run -it alpine ash

一旦启动,我运行:

$ apk update && apk add curl

然后我尝试使用从ifconfig获取的IP地址访问etcd:

$ curl -L http://172.17.42.1:2379/v2/keys/

但curl命令只是挂起,最终超时。 我怀疑我的cloud-config.yml在etcd2部分或iptablesconfiguration中有一些configuration错误,但是我对这一切还是有点新的,而且我一整天都在调整它,不能克服这个问题。 任何想法将不胜感激。

发现IP etcd正在监听

地址etcd正在监听可以在/run/systemd/system/etcd.service.d/20-cloudinit.conffind,所以一个巧妙的技巧是添加一些额外的configuration到etcd服务,以便它写入到一个环境文件,你可以在你的etcd单元中使用。

当你的集群增长到你想要一个单独的etcd集群到实际工作者的地步时,这种方法是有用的 – 那么你只需要一个全局单元为每个worker编写环境文件。

创build/etc/etcd.environment

假设你在每台机器上运行etcd

首先,添加一些额外的configuration到etcd服务启动,创build一个包含正在监听的地址ETCD的新环境文件。 这里是一个bash片段,它将为您写入必要的configuration…

 cat << EOF > /run/systemd/system/etcd.service.d/30-environment.conf [Service] #write an environment file to use in other units #see http://serverfault.com/a/741283/2411 ExecStartPost=/bin/bash -c "echo ETCD_ENDPOINT=\${ETCD_ADDR} > /etc/etcd.environment" EOF chmod 644 /run/systemd/system/etcd.service.d/30-environment.conf 

你可以重新启动,让这个生效,或只是像这样重新加载…

 systemctl daemon-reload systemctl restart etcd 

在单元文件中使用/etc/etcd.environment

你可以在你的单元描述中使用这个/etc/etcd.environment ,然后把ETCD_ENDPOINT传递给你的容器,这样它就可以把它看作是一个环境variables。

 [Service] EnvironmentFile=/etc/etcd.environment ExecStart=/usr/bin/docker run --rm \ -e ETCD_ENDPOINT=${ETCD_ENDPOINT} \ --name example \ ubuntu:15.10 

现在你的容器可以使用它来构buildcurl命令行,或者更好的方法是将etcdctl二进制文件复制到容器中并使用它。