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