运行 pod 中同一图像的多个容器与 运行 多个 pods 与多个节点上的 运行
Running multiple containers of the same image in a pod versus running multiple pods versus running on multiple nodes
我在 OpenShift/Kubernetes 上 运行 有一个相当经典的网络应用程序,它由网页容器和数据库容器组成。我现在正在查看一些缩放选项,并试图了解这 3 种情况的区别:
- 运行 单个节点上单个 pod 内的数据库容器的单个实例旁边的多个 Web 容器实例
- 运行 多个 pods 具有 1 个 Web 容器实例,一个 pod 具有单个节点上的数据库容器实例(使用某种关联)
- 与 2 相同,但在多个节点上(使用一些反亲和性)
每种情况如何影响资源消耗和网络开销等事情,每种情况如何让您扩展?
是否有我没有考虑过但也可能有效的选项?
首先,您可以跳过场景 1,因为这不是 Kubernetes 的处理方式。通常,您 运行 每个 Pod 一个容器,除了可能 运行 与同一 Pod 中的主容器紧密耦合的 sidecar 容器。
场景 2 和 3 是使用 Kubernetes 做事的正确方法。您有一个单独的 Deployment for the web app and for the database (the database might run as a StatefulSet),每个都由可变数量的 Pods 组成。每个 Pod 包含一个对应应用程序的容器。这使您可以彼此独立地扩展两个层(Web 应用程序和数据库)。
各种Pods 运行是在同一个节点上还是在不同的节点上,在大多数情况下,你不会太担心。 Kubernetes 旨在自动动态地对节点进行 Pods 的分配,并且 Pod 运行 所在的节点对于该 Pod 中的应用程序 运行 和该 Pod 的客户端是透明的应用。 Kubernetes 还可以随时将 Pod 重新调度到不同的节点。
但是,您可以影响 Kubernetes 调度程序的决策(affinities and anti-affinities, node selector, taints and tolerations)。在这种情况下,通常您希望 Deployment 的 Pods 分布在多个节点上,以避免节点成为单点故障。将应用程序的所有 Pods 限制到单个节点并不常见,除非在非常特殊的用例中可能有必要这样做。
因此,总而言之,方案 3 是可行的方法,您通常可以免费(按概率)获得跨节点的 Pods 分布,但您可以使用 Pod anti-affinity 强制执行。
我在 OpenShift/Kubernetes 上 运行 有一个相当经典的网络应用程序,它由网页容器和数据库容器组成。我现在正在查看一些缩放选项,并试图了解这 3 种情况的区别:
- 运行 单个节点上单个 pod 内的数据库容器的单个实例旁边的多个 Web 容器实例
- 运行 多个 pods 具有 1 个 Web 容器实例,一个 pod 具有单个节点上的数据库容器实例(使用某种关联)
- 与 2 相同,但在多个节点上(使用一些反亲和性)
每种情况如何影响资源消耗和网络开销等事情,每种情况如何让您扩展? 是否有我没有考虑过但也可能有效的选项?
首先,您可以跳过场景 1,因为这不是 Kubernetes 的处理方式。通常,您 运行 每个 Pod 一个容器,除了可能 运行 与同一 Pod 中的主容器紧密耦合的 sidecar 容器。
场景 2 和 3 是使用 Kubernetes 做事的正确方法。您有一个单独的 Deployment for the web app and for the database (the database might run as a StatefulSet),每个都由可变数量的 Pods 组成。每个 Pod 包含一个对应应用程序的容器。这使您可以彼此独立地扩展两个层(Web 应用程序和数据库)。
各种Pods 运行是在同一个节点上还是在不同的节点上,在大多数情况下,你不会太担心。 Kubernetes 旨在自动动态地对节点进行 Pods 的分配,并且 Pod 运行 所在的节点对于该 Pod 中的应用程序 运行 和该 Pod 的客户端是透明的应用。 Kubernetes 还可以随时将 Pod 重新调度到不同的节点。
但是,您可以影响 Kubernetes 调度程序的决策(affinities and anti-affinities, node selector, taints and tolerations)。在这种情况下,通常您希望 Deployment 的 Pods 分布在多个节点上,以避免节点成为单点故障。将应用程序的所有 Pods 限制到单个节点并不常见,除非在非常特殊的用例中可能有必要这样做。
因此,总而言之,方案 3 是可行的方法,您通常可以免费(按概率)获得跨节点的 Pods 分布,但您可以使用 Pod anti-affinity 强制执行。