Kubernetes - 使用名称而不是“localhost”在pod中进行容器通信?

时间:2016-07-14 20:32:41

标签: docker kubernetes docker-compose

来自kubernetes docs

  

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

是否可以使用某些特定于容器的名称而不是locahost

例如,使用docker-compose up,您可以使用服务名称进行通信。 [docs]

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

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

然后我通过拨打srv web

http://srv:3000/内访问http://localhost:3000

如何在kubernetes中实现相同的行为?有什么方法可以指定在pods的yaml配置中使用什么名称?

2 个答案:

答案 0 :(得分:13)

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

pod拥有自己的IP,因此每个容器内部共享该IP。如果这些容器应该是独立的(即不需要并置),它们应该都在自己的容器中。然后,您可以为每个允许DNS查找定义service作为" $ SERVICENAME"来自同一命名空间中的pod,或者" $ SERVICENAME。$ NAMESPACE"来自不同命名空间中的pod。

答案 1 :(得分:4)

docker-compose部署单个容器,将它们链接在一起,以便彼此了解彼此的名称和IP。

Kubernetes中的Pod类似,但这不是Pod用于保存多个外部服务并将它们链接在一起的目的。

Pod适用于必须在同一主机上运行的容器,并且仅在它们之间进行交互。容器通过localhost在内部进行通信。

大多数Pods实际上是一个容器。

Pod使用Services与外界进行通信。从本质上讲,Pod看起来好像只是一个容器。

在引擎盖下,Pod至少有2个容器:pause容器管理Pod的IP,然后管理您附加的容器。这允许您的容器崩溃,重新启动并在Pod中重新链接而不更改IP,允许在不涉及调度程序的情况下管理容器崩溃,并确保Pod在其生命周期内保持在单个节点上,因此重新启动很快。 p>

如果我们在每次崩溃时重新安排的容器,它们可能最终会在不同的主机上运行,​​路由必须更新等...