По причинам тестирования, я хотел бы, как обычный пользователь, создать целый ансамбль смотрителей зоопарка в отсеке, где все отдельные смотрители зоопарка могут разговаривать друг с другом.
Насколько я могу судить, либо все контейнеры в модуле используют одно и то же сетевое пространство имен, поэтому они могут использовать localhost для общения друг с другом,или у каждого из них есть свои собственные, и они не могут разговаривать друг с другом вообще.
Чтобы быть точным, с podman вы можете использовать эту команду для создания модуля в сети, а пространства имен uts не используются совместно. (Если вы не разделяете сетевое пространство имен, вы также должны разрешить машинам иметь разные имена хостов.)
podman pod create -n zensemble --share cgroup,ipc
Есть ли какая-то золотая середина, когда все контейнеры в модуле находятся в подсети и могут общаться с ними
podman не поддерживает параметр командной строки Docker - ссылка
.
Ответ, который я получил на канале #podman
на Freenode, заключается в том, что это невозможно сделать так, как я пытаюсь это сделать. Что мне придется заставить каждого zookeeper прослушивать другой порт, и все они могут использовать 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
Конечно, если вы не хотите, чтобы сеть
расшаривалась, тоже есть решение, теперь уже сложное: нужно открыть все порты, в том числе и для zookeeper. взаимосвязи и выборы лидеров. Однако на этот раз все серверы могут работать с 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