我使用这个 cloud-config.yml 在 digitalocean 创建了 3 个 coreos 机器:https://gist.github.com/socketwiz/d6fe23d19180a1ad8b5a其中 token 被替换为我从中检索到的 token:
$ 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 部分或 iptables 配置中存在某些配置错误,但我对这一切仍然有点陌生,我整天都在调整它,但就是无法解决这个问题。任何想法都将不胜感激。
答案1
发现 etcd 正在监听的 IP
etcd 正在监听的地址可以在 中找到/run/systemd/system/etcd.service.d/20-cloudinit.conf
,因此一个巧妙的技巧是向 etcd 服务添加一些额外的配置,以便它将其写入您可以在 etcd 单元中使用的环境文件中。
当您的集群增长到需要为实际工作者提供单独的 etcd 集群的程度时,这种方法很有用 - 然后您只需要一个全局单元为每个工作者编写环境文件。
创建 /etc/etcd.environment
假设你在每台机器上运行 etcd
首先,在 etcd 服务启动时添加一些额外的配置,以创建一个新的环境文件,其中包含 ETCD 正在监听的地址。这是一个 bash 片段,它将为您写入必要的配置...
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 传递给您的容器,以便它将其视为环境变量......
[Service]
EnvironmentFile=/etc/etcd.environment
ExecStart=/usr/bin/docker run --rm \
-e ETCD_ENDPOINT=${ETCD_ENDPOINT} \
--name example \
ubuntu:15.10
现在您的容器可以使用它来构建curl
命令行,或者更好的是,将etcdctl
二进制文件复制到容器中并使用它。