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 containersHost 之间路由请求。

podman(1) 是如何实现的?

其他几点帮助:

提前致谢。

答案:

GitHubpodman(1) 团队交谈时,上面的场景(和类似场景)总是会有问题,因为 rootless networking 没有配置 [=12= 的权限] 可以允许所需的端口转发。

所以有两种选择:

  1. 在上面做同样的事情,但是使用 rootful podman(1)rootful containers)。基本上,运行 事情与 sudo(1)
  2. 使用 host 模式网络,将所有容器放入与 HOST 相同的 network namespace(基本上是裸机裸体)——无论这些容器是否在内部启动一个Pod。因此,使用 Pods 和 host 模式不再提供网络隔离,但它们仍然提供将其中的容器作为一个组处理的便利(例如 startstop 他们作为一个群体)。此外,--publish 选项不再适用,因为所有内容都在 HOST(顶层)共存;因此 innerouter 端口的概念不存在。

可以找到 rootless container/hostpodman(1) 联网的不错的小教程 here