Docker 容器无法与 etcd 通信

Docker 容器无法与 etcd 通信

我使用这个 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二进制文件复制到容器中并使用它。

相关内容