Получение IP-адреса контейнера после `lxc start` - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий скрипт, который я запускаю в cloud-init на моем облачном провайдере. Он захватывает контейнер с другого хоста в моей сети, запускает его и затем пытается перенаправить порт на хосте в контейнер:

lxc init ...
lxc remote add gateway 10.132.98.1:8099 --accept-certificate --password securpwd
lxc copy gateway:build-slave build-slave
lxc start build-slave
CONTAINER_IP=$(lxc list "build-slave" -c 4 | awk '!/IPV4/{ if ( $2 != "" ) print $2}')
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 2200 -j DNAT --to ${CONTAINER_IP}

Единственная проблема заключается в том, что существует произвольная задержка между возвращением lxc start и получением информации IPV4. Мое текущее решение состоит в том, чтобы добавить sleep 5s после команды lxc start, но я беспокоюсь, что, если мой сервер находится под нагрузкой, может пройти более 5 секунд до инициализации контейнера.

Есть ли лучшее решение, которое не зависит от произвольного периода ожидания?

1 Ответ

0 голосов
/ 01 ноября 2018

Как указал Лоуренс в комментариях, LXD предоставляет «прокси» device, который можно установить на контейнере. Таким образом, мне не нужно знать IP-адрес контейнера, чтобы установить правильную запись IPTABLES. Вместо этого LXD установит мое прокси-правило для меня при запуске указанного мной контейнера.

Я настроил это так:

DROPLET_PUB_IP=$(ip -f inet addr show ens3 | sed -En -e 's/.*inet ([0-9.]+).*/\1/p')
lxc config device add build-slave ssh-slave proxy listen=tcp:${DROPLET_PUB_IP}:2200 connect=tcp:localhost:22
...