【问题标题】:Kubernetes - container communication within a pod using names instead of 'localhost'?Kubernetes - 使用名称而不是“localhost”在 Pod 内进行容器通信?
【发布时间】:2016-11-17 22:28:01
【问题描述】:

来自 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"

然后我通过调用http://srv:3000/,从web 内部访问srv不是 http://localhost:3000

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

【问题讨论】:

    标签: docker kubernetes docker-compose


    【解决方案1】:

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

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

    【讨论】:

    • 但我无法手动更改 Pod 的 /etc/hosts,因为主机可以进出。此外,由于容器属于一起,我不能让它们成为服务。这里有什么办法吗?
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      一般情况下,在 pod 内运行的容器会共享 pod 的 IP 和端口空间。默认情况下,容器之间的通信将通过 localhost 进行。要使用名称(如 DNS)在容器之间进行通信,容器应在独立的 POD 中运行,并将其作为服务公开给应用程序世界的其余部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 2021-07-27
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 2020-05-14
        相关资源
        最近更新 更多