【问题标题】:2 containers using the same port in Kubernetes pod2 个容器在 Kubernetes pod 中使用相同的端口
【发布时间】:2020-03-01 23:07:08
【问题描述】:

我有以下相同的问题: Dual nginx in one Kubernetes pod

在我的 Kubernetes Deployment 模板中,我有 2 个使用相同端口 80 的容器。 我知道Pod 中的容器实际上位于同一个网络命名空间下,这使得使用localhost127.0.0.1 可以访问Pod 中的另一个容器。 这意味着容器不能使用相同的端口。

docker rundocker-compose 的帮助下很容易实现这一点,第一个容器使用8001:80,第二个容器使用8002:80

在 Kubernetes Pod 中是否有类似或更好的解决方案?无需将这 2 个容器分成不同的 Pod。

【问题讨论】:

  • 您很少希望在一个 pod 中运行多个容器。如果它们是使用标准端口的不同服务器,那就更是如此。将它们分成两个单独的 pod。
  • 你了解 docker-compose 我建议你使用一个名为 komposer 的应用程序。它会将您的 docker-compose 文件转换为 k8s.yaml 设置。在您的情况下,它将是您需要创建的服务定义,将 pod 端口映射到容器端口。
  • k8s 无法设置 p 端口转发 docker-compose 所做的。您是否有在同一个 pod 中运行两个网络服务器的用例?为什么不在不同的 pod 中运行它们?如果您需要将两个容器放在同一个 pod 中,请考虑更改容器服务侦听的端口。
  • 嗨,@PatrickW 我没有一个非常确定的用例,因为我对 Kubernetes 和集群的概念还很陌生。我对集群的初步规划是将系统的所有容器放入一个 pod。这样我就可以根据需要复制这个 pod。但根据我现在得到的所有反馈,似乎我走错了方向。我将审查我的结构并尝试使用你们提供的建议。谢谢大家! =)

标签: docker kubernetes


【解决方案1】:

基本上我完全同意 @David's@Patric's cmets,但我决定在其中添加更多内容,将其扩展为答案。

我遇到了同样的问题:Dual nginx in one Kubernetes pod

并且在提到的线程中已经有一个很好的答案来解决这个问题。从技术角度来看,它为您的特定用例提供了现成的解决方案,但它并不质疑这个想法本身。

借助 docker run 或 docker-compose,第一个容器使用 8001:80 和 8002:80 用于第二个容器。

Kubernetes 中也很容易实现。只需将两个容器放在不同的Pods 中,您就不必使用 nginx 配置来使其侦听不同于80 的端口。请注意,您提到的这两个 docker 容器不共享一个网络命名空间,这就是为什么它们都可以侦听端口 80,这些端口映射到主机系统上的不同端口(@98​​7654327@ 和 8002)。 Kubernetes Pods 并非如此。阅读有关微服务架构的更多信息,尤其是它是如何在 k8s 上实现的,您会注意到将几个容器放在一个 Pod 中确实很少见,而且绝对是不应该应用于像你这样的情况。应该有充分的理由将 2 个或更多容器放在一个 Pod 中。通常第二个容器对主容器有一些补充功能。

3 design patterns for multi-container Pods, commonly used in Kubernetes:边车、大使和适配器。很多时候,它们都被简称为sidecar 容器

请注意,在上述所有用例中,两个或多个容器在一个 Pod 中耦合在一起具有完全不同的功能。即使您在单个 Pod 中放置了多个容器(这是最常见的),实际上它也永远不会是相同类型的容器(例如在您的情况下侦听不同端口的两个 nginx 服务器)。它们应该是互补的,并且应该有充分的理由将它们放在一起,为什么它们应该同时启动和关闭并共享相同的网络命名空间。 Sidecar 容器中运行着一个监控代理,它对主容器具有补充功能,例如nginx 网络服务器。您可以在this 文章中阅读有关容器设计模式的更多信息。

我没有一个非常确定的用例,因为我仍然 Kubernetes 和集群的概念非常新。

因此,如果您对这种架构没有特别的理由,绝对不要这样做。

我对集群的初步规划是将系统的所有容器 进入一个豆荚。这样我就可以根据需要复制这个 pod。

您不需要单个Pod 来复制它。您的集群中可以有很多 replicaSets(通常由 Deployments 管理),它们中的每一个都负责运行某种 Pod 的声明数量的副本。

但是根据我现在收到的所有反馈,我好像要去 方向错了。

是的,这绝对是错误的方向,但实际上已经说过了。我只想强调为什么这个方向是错误的。这种方法完全违背了 微服务架构 的理念,而这正是 Kubernetes 的设计目的。将所有基础设施放在一个巨大的 Pod 中并将所有容器紧密绑定在一起是没有意义的。请记住,Pod Kubernetes 中最小的可部署单元,当其中一个容器崩溃时,整个Pod 都会崩溃。您无法手动重启 Pod 中的一个容器。

我将检查我的结构并尝试使用 建议大家提供。谢谢大家! =)

这是个好主意:)

【讨论】:

  • 谢谢! @马里奥。你的回答确实让我很开心,因为你详细解释了所有这些,我从中受益。我现在对 Kubernetes 有了更好的了解。我将继续从中探索更多。再来一次。谢谢! =) 衷心感谢。 ??‍♂️
【解决方案2】:

我相信您需要为 pod 中的每个容器指定不同的 Container Port。 Kubernetes 允许您在 pod 定义文件中使用此参数指定每个容器公开的端口。然后,您可以创建指向相同 pod 但不同端口的服务。

【讨论】:

  • 如果你可以改变你的容器暴露的端口呢?
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2019-12-31
  • 2017-07-05
  • 1970-01-01
  • 2018-08-05
  • 2020-02-13
相关资源
最近更新 更多