在 ROOTLESS podman 设置中,如何在不同 pod 中的容器之间进行通信

NYC*_*yes 9 containers redhat-containers podman podman-compose

我阅读了我能找到的所有内容,但关于这种情况的文档很少或不清楚podman。我有以下(人为的)ROOTLESS podman设置:

  • pod-1 名称:pod1

    容器名称pod1

    • p1c1 -- 这也是它hostname在内部分配的pod1
    • p1c2 -- 这也是它hostname在内部分配的pod1
    • p1c3 -- 这也是它hostname在内部分配的pod1
  • pod-2 名称:pod2

    容器名称pod2

    • p2c1 -- 这也是它hostname在内部分配的pod2
    • p2c2 -- 这也是它hostname在内部分配的pod2
    • p2c3 -- 这也是它hostname在内部分配的pod2

我将某些容器放在不同的pods位置,以避免出现这种情况port conflict,并将容器作为组进行管理。

问题

给出上面的拓扑,我如何在p1c1和 之间进行通信p2c1?换句话说,我应该逐步podman(1)发出哪些命令来收集和的addressing information必要信息,然后使用该信息来配置其中的应用程序,以便它们可以相互通信?pod1:p1c1pod2:p2c1

先感谢您!

编辑:对于搜索者,可以在此处找到更多信息。

lar*_*sks 9

Podman 没有像 Swarm 或 Kubernetes 中的“服务”概念那样提供 Pod 之间的服务发现。您的选择归结为:

  1. 在同一网络命名空间中运行两个 Pod,或者
  2. 通过将服务发布到主机端口来公开服务,然后通过主机访问它们

对于第一个解决方案,我们首先创建一个网络:

podman network create shared
Run Code Online (Sandbox Code Playgroud)

然后创建连接到shared网络的两个 Pod:

podman pod create --name pod1 --network shared
podman pod create --name pod2 --network shared
Run Code Online (Sandbox Code Playgroud)

当两个 Pod 运行在同一网络上时,容器可以通过名称引用另一个 Pod。p1c1例如,如果您在端口 80 上运行 Web 服务 ,则p2c1可以curl http://pod1.

对于第二个选项,您可以执行以下操作:

podman pod create --name pod1 -p 1234:1234 ...
podman pod create --name pod2 ...
Run Code Online (Sandbox Code Playgroud)

现在,如果p1c1有一个服务正在侦听端口,您可以从at1234访问该服务。p2c1<some_host_address>:1234


如果我正确解释选项 1,如果 p1c1 和 p2c1 中的应用程序都使用端口 8080;那么如果我使用以下内容发布,那么任何地方(无论是在 Pod 内还是外部主机内)都不会发生任何冲突:8080:8080 for app in p1c1 and 8081:8080 for app in p2c1? 这个解释正确吗?

这是正确的。每个 Pod 都使用自己的网络命名空间(实际上是它自己的 IP 地址)运行,因此不同 Pod 中的服务可以侦听同一端口。

Pod 运行后可以重新分配网络(不是端口)吗?原因:我正在使用 podman-compose(1),它会在 pod 中为您创建内容,但事后我可能需要更改内容(例如网络分配)。这可以做到吗?

一般来说,您无法更改 Pod 或容器的配置;您只能删除它并创建一个新的。假设对该 格式podman-compose有相对完整的支持 docker-compose.yaml,您应该能够在docker-compose.yaml文件中正确设置网络(您可以手动创建网络,然后external在撰写文件中将其引用为网络)。

是相关 Docker 文档的链接。我自己还没有用 podman 尝试过这个。