Контейнер 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 бинарный в контейнер и использовать это.

Другие вопросы по тегам