Я создал 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, но я все еще новичок во всем этом, и я весь день настраивал его и просто могу Не уйду с этой проблемы. Будем очень признательны за любые идеи.
Адрес, который прослушивает etcd, можно найти в /run/systemd/system/etcd.service.d/20-cloudinit.conf
, поэтому хитрый трюк - добавить некоторую дополнительную конфигурацию в службу etcd, чтобы она записывала ее в файл среды, который вы можете использовать в своих модулях etcd.
Этот подход полезен, когда ваш кластер разрастается до точки, когда вам нужен отдельный кластер etcd для фактических работников - тогда у вас просто есть глобальный модуль, записывающий файл среды для каждого рабочего.
Предположим, вы запускаете 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
в описании вашего модуля, а затем передайте 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
двоичный файл в контейнер и используйте его.