Назад | Перейти на главную страницу

Контейнер 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/

на каждом из них и получить действительные данные, поэтому я подозреваю, что настройки моего брандмауэра в порядке (но, возможно, нет). Моя проблема начинается, когда я настраиваю контейнер докеров. Сначала я получаю IP-адрес docker0:

$ ifconfig docker0

Затем я настраиваю контейнер докеров:

$ 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, но я все еще новичок во всем этом, и я весь день настраивал его и просто могу Не уйду с этой проблемы. Будем очень признательны за любые идеи.

Обнаружение 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://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 двоичный файл в контейнер и используйте его.