Podman(1):如何在连接到 podman 网络的主机和 PODs 之间路由请求(无根)
Podman(1): How to route requests between the HOST and PODs attached to a podman network (rootless)
让我用一个真实的例子来帮助这个问题。
使用 rootless podman(1)
,我使用以下脚本在它自己的 Pod
中启动了一个微型 Spark
集群,效果很好:
#! /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
link 上(在 Worker id
下方),请注意 URL 解析为 192.168.10.2
,这是一个有效的 Pod IP-Address
属于上面创建的 podman network
。
但是,单击 URL 当然会挂起,因为无法从 HOST
访问 Pod IP-Address
。使用 docker(1)
(不是 podman(1)
),有一种网关机制可以在 guest containers
和 Host
之间路由请求。
podman(1)
是如何实现的?
其他几点帮助:
- 这是一个例子
Spark Pod
。还有附加的 Pod
s 附加相同的 pod network
:mynet
- 我不想发布额外的端口,因为一旦你深入
UI
,那无论如何都会中断。更重要的是,这样做违背了 Pod
s 的目的,后者将相互冲突的端口隔离开来。相反,我需要了解如何“网关”这些请求。
- 最后,我很谦虚,因为我认为我很了解
podman(1)
。 LoL
提前致谢。
答案:
在 GitHub 与 podman(1)
团队交谈时,上面的场景(和类似场景)总是会有问题,因为 rootless networking
没有配置 [=12= 的权限] 可以允许所需的端口转发。
所以有两种选择:
- 在上面做同样的事情,但是使用
rootful podman(1)
(rootful containers)
。基本上,运行 事情与 sudo(1)
。
- 使用
host
模式网络,将所有容器放入与 HOST
相同的 network namespace
(基本上是裸机裸体)——无论这些容器是否在内部启动一个Pod
。因此,使用 Pod
s 和 host
模式不再提供网络隔离,但它们仍然提供将其中的容器作为一个组处理的便利(例如 start
和 stop
他们作为一个群体)。此外,--publish
选项不再适用,因为所有内容都在 HOST
(顶层)共存;因此 inner
和 outer
端口的概念不存在。
可以找到 rootless container/host
与 podman(1)
联网的不错的小教程 here。
让我用一个真实的例子来帮助这个问题。
使用 rootless podman(1)
,我使用以下脚本在它自己的 Pod
中启动了一个微型 Spark
集群,效果很好:
#! /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
link 上(在 Worker id
下方),请注意 URL 解析为 192.168.10.2
,这是一个有效的 Pod IP-Address
属于上面创建的 podman network
。
但是,单击 URL 当然会挂起,因为无法从 HOST
访问 Pod IP-Address
。使用 docker(1)
(不是 podman(1)
),有一种网关机制可以在 guest containers
和 Host
之间路由请求。
podman(1)
是如何实现的?
其他几点帮助:
- 这是一个例子
Spark Pod
。还有附加的Pod
s 附加相同的pod network
:mynet
- 我不想发布额外的端口,因为一旦你深入
UI
,那无论如何都会中断。更重要的是,这样做违背了Pod
s 的目的,后者将相互冲突的端口隔离开来。相反,我需要了解如何“网关”这些请求。 - 最后,我很谦虚,因为我认为我很了解
podman(1)
。LoL
提前致谢。
答案:
在 GitHub 与 podman(1)
团队交谈时,上面的场景(和类似场景)总是会有问题,因为 rootless networking
没有配置 [=12= 的权限] 可以允许所需的端口转发。
所以有两种选择:
- 在上面做同样的事情,但是使用
rootful podman(1)
(rootful containers)
。基本上,运行 事情与sudo(1)
。 - 使用
host
模式网络,将所有容器放入与HOST
相同的network namespace
(基本上是裸机裸体)——无论这些容器是否在内部启动一个Pod
。因此,使用Pod
s 和host
模式不再提供网络隔离,但它们仍然提供将其中的容器作为一个组处理的便利(例如start
和stop
他们作为一个群体)。此外,--publish
选项不再适用,因为所有内容都在HOST
(顶层)共存;因此inner
和outer
端口的概念不存在。
可以找到 rootless container/host
与 podman(1)
联网的不错的小教程 here。