问题描述
让我用一个真实的例子来帮助回答这个问题。
使用 rootless podman(1)
,我使用以下脚本在它自己的 Spark
中启动一个小 Pod
集群,效果很好:
#! /usr/bin/bash
podman network create --subnet 192.168.10.0/24 --gateway 192.168.10.1 mynet
podman pod create \
--name=spark \
--network=mynet \
--share net \
--publish 7077:7077 \
--publish 8080:8080
podman run \
--detach \
--pod=spark \
--name=master01 \
--hostname spark \
--restart always \
--env SPARK_MODE=master \
--env SPARK_RPC_AUTHENTICATION_ENABLED=no \
--env SPARK_RPC_ENCRYPTION_ENABLED=no \
--env SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no \
--env SPARK_SSL_ENABLED=no \
--add-host spark:127.0.0.1 \
--add-host worker01:127.0.0.1 \
docker.io/bitnami/spark:latest
podman run \
--detach \
--pod=spark \
--name=worker01 \
--hostname worker01 \
--restart always \
--env SPARK_MODE=worker \
--env SPARK_MASTER_URL=spark://spark:7077 \
--env SPARK_WORKER_MEMORY=4G \
--env SPARK_WORKER_CORES=8 \
--env SPARK_RPC_AUTHENTICATION_ENABLED=no \
--env SPARK_RPC_ENCRYPTION_ENABLED=no \
--env SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no \
--env SPARK_SSL_ENABLED=no \
--add-host spark:127.0.0.1 \
--add-host worker01:127.0.0.1 \
docker.io/bitnami/spark:latest
以下是 SparkUI
的图片。
(Note
:这个问题使用 Spark
作为辅助,但它本身不是关于 Spark
。
查看浏览器图像的左下角。将鼠标悬停在唯一可用的 Spark worker
链接上(在 Worker id
下方),注意 URL 解析为 192.168.10.2
,这是一个有效的 Pod IP-Address
落入 {{1} } 上面创建。
但是,点击该 URL 当然会挂起,因为 podman network
无法从 Pod IP-Address
访问。使用 HOST
(不是 docker(1)
)有一个网关机制可以在 podman(1)
和 guest containers
之间路由请求。
这是如何通过 Host
实现的?
其他几点可以提供帮助:
- 这是一个示例
podman(1)
。还有附加的Spark Pod
附加相同的Pod
:pod network
- 我不想发布额外的端口,因为一旦你深入到
mynet
中,它无论如何都会中断。更重要的是,这样做违背了UI
的目的,后者将相互冲突的端口隔离开来。相反,我需要了解如何“传送”这些请求。 - 最后,我很谦虚,因为我认为我很了解
Pod
。podman(1)
提前致谢。
解决方法
答案:
在与 GitHub 的 podman(1)
团队交谈时,上述场景(和类似场景)将始终存在问题,因为 rootless networking
没有权限配置 bridge networking
可以允许所需的端口转发。
所以有两种选择:
- 执行上述相同的操作,但使用
rootful podman(1)
(rootful containers)
。基本上,使用sudo(1)
运行。 - 使用
host
模式网络,将所有容器放入与network namespace
相同的HOST
(基本上是裸机)——无论这些容器是否在Pod
中启动{1}}。因此,将Pod
与host
模式一起使用不再提供网络隔离,但它们仍然提供将其中的容器视为一个组的便利(例如start
和 {{1} } 他们作为一个群体)。此外,stop
选项不再适用,因为一切都在--publish
(顶级)级别共存;所以HOST
和inner
端口的概念不存在。
可以在 here 中找到有关 outer
与 rootless container/host
联网的不错的小教程。