出于测试的原因,作为普通用户,我想在一个 pod 中创建一个完整的 zookeeper 集合,以便所有单独的 zookeeper 可以相互通信。
据我所知,要么 pod 中的所有容器共享相同的网络命名空间,因此它们可以使用 localhost 相互通信,要么它们各自都有自己的网络命名空间,根本无法相互通信。
具体来说,使用 podman,您可以使用此命令在网络中创建一个 pod,并且 uts 命名空间不共享。(如果您不共享网络命名空间,您还应该允许机器拥有不同的主机名。)
podman pod create -n zensemble --share cgroup,ipc
是否存在某种令人满意的中间立场,即 pod 中的所有容器都在一个子网上,并且可以通过这种方式相互通信?
podman 不支持 Docker 的--link
命令行选项。
答案1
我在 Freenode 频道上得到的答案#podman
是,按照我尝试的方式无法做到这一点。我必须让每个 zookeeper 监听不同的端口,然后它们才能localhost
互相通信。
在我的环境中,这种方法可能可行,但由于 Zookeeper 使用三个端口,其中只有一个是公开的,因此情况比较复杂。其他端口用于领导者选举和其他节点间通信。
答案2
我遇到了同样的问题。由于新的 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
被共享,还有一个解决方案,现在复杂的:需要暴露所有端口,包括用于 zookeeper 互连和 Leader 选举的端口。不过这次所有服务器都可以使用 adminserver 的 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