使用 Podman 沟通不同 pods
Communicate different pods using Podman
我正在使用 podman-compose 部署多个 Pods。为此,每个 pod 在我以无根模式执行的 podman-compose.yaml 文件中都有自己的定义(因此 Pod 中的所有容器共存于同一个 host/IP 中)。但是,我想让一个 Pod 中的容器能够访问另一个 pod 中的容器公开的服务。
我知道 Kubernetes 具有让 pods 在它们之间进行通信的服务对象。但是我不想用K8S...
所以我的问题是:是否有任何 'equivalent' 或解决方法可以用来在 pods 之间实现这种通信?不仅在 Podman 生态系统中,而且在 Linux 的生态系统中。
理想情况下,我想使用 DNS 让容器解析其他 pods 中其他容器的 IP。我应该使用我的机器(所有 pods 都是 运行)DNS 来代理 pods 之间的请求吗?更重要的是,这是一个好习惯吗?
抱歉,如果答案很明显,我是 IT 界的新手。
总之先谢谢大家了!
So my question is: Is there any 'equivalent' or workaround I could use to reach such a communication between pods? Not only in the Podman ecosystem, but in the Linux's one.
Kubernetes Service
对象没有类似物。在 podman(和 docker)中,服务发现是 name-based:容器可以通过名称引用其他容器,并且对它们可以访问哪些端口没有限制。所以如果你有:
version: "3"
services:
app1:
image: docker.io/alpinelinux/darkhttpd:latest
app2:
image: docker.io/alpinelinux/darkhttpd:latest
然后运行ning在app1
容器中的应用程序可以访问app2
容器中的服务。也就是说,如果你podman exec
变成app1
,你可以运行:
wget -O- http://app2:8080
这是默认行为;没有什么特别需要设置的
向上。
最后,我在 containers organization the Podman's dnsname plugin 中找到了可以使用其 DNS 网关进行 pod 到 pod 解析的方法。
创建网络并让所有 pods 在启动时使用该网络。然后,如果您使用 --name 来命名 pods,则可以将该名称用作其他人的 DNS 条目。
例如
podman 网络创建 $NETWORK_NAME
podman pod create --name $POD1 --network $NETWORK_NAME
podman pod create --name $POD2 --network $NETWORK_NAME
podman 运行 -it --detach --pod $POD1 --name $CONTAINER1 --$NETWORK_NAME image_name
podman 运行 -it --detach --pod $POD2 --name $CONTAINER2 --$NETWORK_NAME image_name
现在如果你从 CONTAINER2 卷曲,你可以使用
curl http://$POD1 它将解析为该 POD 的 IP(网络上创建的私有 ip)。
如果您不想使用 pods,只需删除 podman 运行 的所有 pod create 和 --pod 标志,而是使用 $CONTAINER1 或 $CONTAINER2 与中的其他容器通信同一个网络。
有了这个,您不需要公开大量端口,也不需要让您的容器与主机通信并返回到公开的端口。只需通过 pod / 容器名称引用它们。
我正在使用 podman-compose 部署多个 Pods。为此,每个 pod 在我以无根模式执行的 podman-compose.yaml 文件中都有自己的定义(因此 Pod 中的所有容器共存于同一个 host/IP 中)。但是,我想让一个 Pod 中的容器能够访问另一个 pod 中的容器公开的服务。
我知道 Kubernetes 具有让 pods 在它们之间进行通信的服务对象。但是我不想用K8S...
所以我的问题是:是否有任何 'equivalent' 或解决方法可以用来在 pods 之间实现这种通信?不仅在 Podman 生态系统中,而且在 Linux 的生态系统中。
理想情况下,我想使用 DNS 让容器解析其他 pods 中其他容器的 IP。我应该使用我的机器(所有 pods 都是 运行)DNS 来代理 pods 之间的请求吗?更重要的是,这是一个好习惯吗?
抱歉,如果答案很明显,我是 IT 界的新手。
总之先谢谢大家了!
So my question is: Is there any 'equivalent' or workaround I could use to reach such a communication between pods? Not only in the Podman ecosystem, but in the Linux's one.
Kubernetes Service
对象没有类似物。在 podman(和 docker)中,服务发现是 name-based:容器可以通过名称引用其他容器,并且对它们可以访问哪些端口没有限制。所以如果你有:
version: "3"
services:
app1:
image: docker.io/alpinelinux/darkhttpd:latest
app2:
image: docker.io/alpinelinux/darkhttpd:latest
然后运行ning在app1
容器中的应用程序可以访问app2
容器中的服务。也就是说,如果你podman exec
变成app1
,你可以运行:
wget -O- http://app2:8080
这是默认行为;没有什么特别需要设置的 向上。
最后,我在 containers organization the Podman's dnsname plugin 中找到了可以使用其 DNS 网关进行 pod 到 pod 解析的方法。
创建网络并让所有 pods 在启动时使用该网络。然后,如果您使用 --name 来命名 pods,则可以将该名称用作其他人的 DNS 条目。
例如
podman 网络创建 $NETWORK_NAME
podman pod create --name $POD1 --network $NETWORK_NAME
podman pod create --name $POD2 --network $NETWORK_NAME
podman 运行 -it --detach --pod $POD1 --name $CONTAINER1 --$NETWORK_NAME image_name
podman 运行 -it --detach --pod $POD2 --name $CONTAINER2 --$NETWORK_NAME image_name
现在如果你从 CONTAINER2 卷曲,你可以使用 curl http://$POD1 它将解析为该 POD 的 IP(网络上创建的私有 ip)。
如果您不想使用 pods,只需删除 podman 运行 的所有 pod create 和 --pod 标志,而是使用 $CONTAINER1 或 $CONTAINER2 与中的其他容器通信同一个网络。
有了这个,您不需要公开大量端口,也不需要让您的容器与主机通信并返回到公开的端口。只需通过 pod / 容器名称引用它们。