Kubernetes - 使用名称而非“localhost”在Pod内进行容器通信?

14

从kubernetes的文档

一个pod中的所有应用程序都使用相同的网络命名空间(相同的IP和端口空间),因此可以使用localhost“找到”彼此并进行通信。

是否可以使用一些容器特定的名称代替localhost

例如,使用docker-compose up时,您使用服务名称进行通信。[文档]

所以,如果我的docker-compose.yml文件是

version: '2'
services:
  web:
    build: .
    ports:
      - "8000:8000"
  srv:
    build: .
    ports:
      - "3000:3000"

那么我通过调用 http://srv:3000/,而不是http://localhost:3000,从web中访问srv

在Kubernetes中如何实现相同的行为? 是否有一种方法可以在Pod的yaml配置中指定要使用的名称?

3个回答

14

localhost是指网络环回设备的名称(IPv4通常为127.0.0.1,IPv6为::1)。这通常在您的/etc/hosts文件中指定。

一个Pod有自己的IP地址,因此每个容器都共享该IP地址。如果这些容器应该独立(即不需要共存),则它们应该各自位于自己的Pod中。然后,您可以为每个Pod定义一个服务,该服务允许从同一命名空间中的Pod或来自不同命名空间的Pod中的DNS查找为"$SERVICENAME"或"$SERVICENAME.$NAMESPACE"。


但是我无法手动更改 pod 的 /etc/hosts,因为主机可能会出现并消失。另外,由于容器彼此相关,我无法将它们作为服务。这里有什么解决办法吗? - Jatin

6
docker-compose 可以部署单个容器,将它们链接在一起,使它们知道彼此的名称和 IP。
在 Kubernetes 中,一个 Pod 是类似于这个概念的,但这不是它的目的,其目的并非为了容纳多个外部服务并将它们链接在一起。 Pod 是为必须在同一主机上运行且只相互交互的容器而设计的。容器通过 localhost 进行内部通信。
大多数 Pods 实际上只包含单个容器。 Pod 使用 Services 与外部进行通信。实际上,Pod 看起来就像只有一个容器。
在幕后,一个 Pod 至少包含两个容器: pause 容器管理 Pod 的 IP,然后是您附加的容器。这允许您的容器在崩溃、重启和重新链接到 Pod 时,IP 不会更改,从而允许管理容器崩溃而不涉及调度程序,并确保 Pod 在其生命周期内始终停留在单个节点上,因此重新启动很快。
如果每次容器崩溃后都要重新调度它们,则它们可能最终会在不同的主机上,路由必须进行更新等。

0
通常,运行在 Pod 内部的容器共享 Pod 的 IP 和端口空间。容器之间的通信默认通过 localhost 进行。要使用名称(如 DNS)在容器之间进行通信,这些容器应在独立的 POD 中运行,并将其公开为应用程序世界的服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接