Контейнер Docker не может связаться с etcd
Я создал 3 машины coreos в digitalocean, используя этот cloud-config.yml: https://gist.github.com/socketwiz/d6fe23d19180a1ad8b5a где токен был заменен на тот, который я получил из:
$ curl -w "\n" "https://discovery.etcd.io/new?size=3"
До этого момента все работало хорошо. Я могу видеть другие машины, я могу
$ curl -L http://<machine_ip>:2379/v2/keys/
на каждом из них и верните действительные данные, поэтому я подозреваю, что настройки брандмауэра в порядке (но, возможно, нет). Моя проблема начинается, когда я настраиваю Docker-контейнер. Сначала я получаю IP-адрес для docker0:
$ ifconfig docker0
Затем я настраиваю Docker-контейнер:
$ docker run -it alpine ash
После загрузки я запускаю:
$ apk update && apk add curl
Затем я пытаюсь получить доступ к etcd, используя IP-адрес, полученный от ifconfig:
$ curl -L http://172.17.42.1:2379/v2/keys/
Но команда curl просто зависает и со временем истекает. Я подозреваю, что у меня что-то неправильно сконфигурировано в моем cloud-config.yml в разделе etcd2 или в конфигурации iptables, но я все еще новичок во всем этом, и я весь день его настраивал и просто могу не пройти эту проблему. Любые идеи будут высоко оценены.
1 ответ
Обнаружение IP etcd слушает
Адрес, по которому прослушивается 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://faultserver.ru/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
бинарный в контейнер и использовать это.