我使用这个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错误,但是我对这一切还是有点新的,而且我一整天都在调整它,不能克服这个问题。 任何想法将不胜感激。
地址etcd正在监听可以在/run/systemd/system/etcd.service.d/20-cloudinit.conffind,所以一个巧妙的技巧是添加一些额外的configuration到etcd服务,以便它写入到一个环境文件,你可以在你的etcd单元中使用。
当你的集群增长到你想要一个单独的etcd集群到实际工作者的地步时,这种方法是有用的 – 那么你只需要一个全局单元为每个worker编写环境文件。
假设你在每台机器上运行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 ,然后把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二进制文件复制到容器中并使用它。