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

Как использовать podman, чтобы поместить весь ансамбль смотрителя зоопарка в контейнер?

По причинам тестирования я хотел бы, как обычный пользователь, создать весь ансамбль зоопарка в капсуле, где все отдельные смотрители зоопарка могут разговаривать друг с другом.

Насколько я могу судить, либо все контейнеры в модуле используют одно и то же сетевое пространство имен, поэтому они могут использовать localhost для общения друг с другом, либо у каждого из них есть свое собственное пространство, и они вообще не могут разговаривать друг с другом.

Чтобы быть точным, с помощью podman вы можете использовать эту команду для создания модуля в сети, а пространства имен uts не используются совместно. (Если вы не разделяете сетевое пространство имен, вы также должны разрешить машинам иметь разные имена хостов.)

podman pod create -n zensemble --share cgroup,ipc

Есть ли какая-то золотая середина, когда все контейнеры в модуле находятся в подсети и могут таким образом общаться друг с другом?

podman не поддерживает Docker's --link параметр командной строки.

Ответ я получил на #podman канал на Freenode заключается в том, что это невозможно сделать так, как я пытаюсь это сделать. Что мне придется заставить каждого смотрителя зоопарка слушать другой порт, и все они могут использовать localhost поговорить друг с другом.

Это, вероятно, сработает в моей ситуации, хотя это осложняется тем фактом, что Zookeeper использует три порта, только один из которых является общедоступным. Остальные используются для выборов лидера и другой связи между узлами.

Я столкнулся с той же проблемой. Поскольку новый Zookeeper использует "Динамическая реконфигурация", я думаю, это не так уж сложно. Просто укажите порты (hpst:quorum:leaderelection;client, host по умолчанию 0.0.0.0) в ZOO_SERVERS список. Для серверов администрирования необходимо указать его для каждого контейнера, но это необязательно.

ZOO_SERVERS="server.1=:2888:3888;2181 \
             server.2=:2889:3889;2182 \
             server.3=:2890:3890;2183"

podman pod create -n zkensemble -p 8080-8082,2181-2183

podman run --pod zkensemble --name zk1 \
    -e ZOO_MY_ID=1 \
    -e ZOO_SERVERS=$ZOO_SERVERS \
    -d zookeeper
podman run --pod zkensemble --name zk2 \
    -e ZOO_MY_ID=2 \
    -e ZOO_SERVERS=$ZOO_SERVERS \
    -e JVMFLAGS="-Dzookeeper.admin.serverPort=8081" \
    -d zookeeper
podman run --pod zkensemble --name zk3 \
    -e ZOO_MY_ID=3 \
    -e ZOO_SERVERS=$ZOO_SERVERS \
    -e JVMFLAGS="-Dzookeeper.admin.serverPort=8082" \
    -d zookeeper

Конечно, если вы не хотите net чтобы поделиться, есть также решение, теперь сложно: должны быть открыты все порты, в том числе для подключения зоопарка и выборов лидера. Однако на этот раз все серверы могут работать с 8080 для администратора. Нам нужно только сопоставить 8080 с разными портами на хосте.

IP=$(hostname -I | awk '{print $1}')

ZOO_SERVERS_1="server.1=:2888:3888;2181 \
               server.2=$IP:2889:3889;2182 \
               server.3=$IP:2890:3890;2183"
ZOO_SERVERS_2="server.1=$IP:2888:3888;2181 \
               server.2=:2889:3889;2182 \
               server.3=$IP:2890:3890;2183"
ZOO_SERVERS_3="server.1=$IP:2888:3888;2181 \
               server.2=$IP:2889:3889;2182 \
               server.3=:2890:3890;2183"

podman pod create -n zkensemble --share pid,ipc,uts

podman run --pod zkensemble --name zk1 \
    -e ZOO_MY_ID=1 \
    -e ZOO_SERVERS=$ZOO_SERVERS_1 \
    -p 2181:2181,2888:2888,3888:3888,8080:8080 \
    -d zookeeper
podman run --pod zkensemble --name zk2 \
    -e ZOO_MY_ID=2 \
    -e ZOO_SERVERS=$ZOO_SERVERS_2 \
    -p 2182:2182,2889:2889,3889:3889,8081:8080 \
    -d zookeeper
podman run --pod zkensemble --name zk3 \
    -e ZOO_MY_ID=3 \
    -e ZOO_SERVERS=$ZOO_SERVERS_3 \
    -p 2183:2183,2890:2890,3890:3890,8082:8080 \
    -d zookeeper