Podman(1):如何在连接到 Podman 网络的 HOST 和 POD 之间路由请求无根

问题描述

让我用一个真实的例子来帮助回答这个问题。

使用 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

enter image description here

查看浏览器图像的左下角。将鼠标悬停在唯一可用的 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 附加相同的 Podpod network
  • 我不想发布额外的端口,因为一旦你深入到 mynet 中,它无论如何都会中断。更重要的是,这样做违背了 UI 的目的,后者将相互冲突的端口隔离开来。相反,我需要了解如何“传送”这些请求。
  • 最后,我很谦虚,因为我认为我很了解Podpodman(1)

提前致谢。

解决方法

答案

在与 GitHubpodman(1) 团队交谈时,上述场景(和类似场景)将始终存在问题,因为 rootless networking 没有权限配置 bridge networking可以允许所需的端口转发。

所以有两种选择:

  1. 执行上述相同的操作,但使用 rootful podman(1) (rootful containers)。基本上,使用 sudo(1) 运行。
  2. 使用 host 模式网络,将所有容器放入与 network namespace 相同的 HOST(基本上是裸机)——无论这些容器是否在 Pod 中启动{1}}。因此,将 Podhost 模式一起使用不再提供网络隔离,但它们仍然提供将其中的容器视为一个组的便利(例如 start 和 {{1} } 他们作为一个群体)。此外,stop 选项不再适用,因为一切都在 --publish(顶级)级别共存;所以 HOSTinner 端口的概念不存在。

可以在 here 中找到有关 outerrootless container/host 联网的不错的小教程。