尝试访问Docker容器内的etcd时,获取“连接被拒绝”
我想从一个正在运行的Docker容器中访问etcd。 当我跑步
curl http://172.17.42.1:4001/v2/keys
我明白了
curl: (7) Failed to connect to 172.17.42.1 port 4001: Connection refused
我有四个其他主机,这工作正常,但在这台机器上的每个容器都有这个问题。 我真的不知道发生了什么,我不知道如何debugging它。
我的etcd环境variables是
ETCD_ADVERTISE_CLIENT_URLS=http://10.242.10.2:2379 ETCD_DISCOVERY=https://discovery.etcd.io/<token_removed> ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.242.10.2:2380 ETCD_LISTEN_CLIENT_URLS=http://10.242.10.2:2379,http://127.0.0.1:2379,http://0.0.0.0:4001 ETCD_LISTEN_PEER_URLS=http://10.242.10.2:2380
我也可以从主机访问etcd
curl http://localhost:4001/v2/keys
所以当从容器路由到主机时似乎有一些错误。 但我无法弄清楚它是什么。 任何人都可以指向正确的方向吗?
我观察到我必须使用–advertise-client-urls和–listen-client-urls。 像这样:
./etcd --advertise-client-urls 'http://0.0.0.0:2379,http://0.0.0.0:4001' --listen-client-urls 'http://0.0.0.0:2379,http://0.0.0.0:4001'
然后,我成功地做到了
curl -L http://hostname:2379/version
从任何可以到达该服务器的机器上运行。
事实certificate,etcd只在本机上监听localhost:4001
,这就是为什么我无法从容器中访问它。 这是尽pipe我configuration其中一个监听客户端url为0.0.0.0:4001
。
事实certificate,我运行了sudo systemctl enable etcd2
,导致它在运行cloud-config服务之前运行。 因此,etcd以默认configuration开始,而不是我在云configuration中指定的configuration。 运行sudo systemctl disable etcd2
修复了这个问题。