如何在 Kubernetes pods 中组织容器 "horizontally"?

How to organize containers "horizontally" inside Kubernetes pods?

所以我正在努力思考典型的 Kubernetes pod 究竟是什么样子。根据 their docs,一个 pod:

"A pod (as in a pod of whales or pea pod) corresponds to a colocated group of applications running with a shared context."

在同一篇文章的后面:

"Pods can be used to host vertically integrated application stacks, but their primary motivation is to support co-located..."

好的,因此您可以将单个 pod 组织为整个垂直堆栈(从数据库到 Web 应用程序)。但显然这不是通常的组织方式,所以我假设通常首选“水平”组织(为什么??)。

但对我来说,水平 layering/stratification 意味着您将在一个 pod 中只有一个容器,因为通常在每一层服务(网络、应用程序、缓存、数据库等)中您将有一种组件。

举个具体的例子吧。假设我们有以下垂直层叠:

这些是应用堆栈中相当典型的组件。如果我们违背 Kubernetes 自己的建议,并创建 "vertically-aligned" pods,每个 pod 将由每个层的一种容器组成(web/app 服务器、每个微服务、每个数据库等.).

但是如何组织水平对齐的 pod? pods?

将放入哪些容器

Pod是Kubernetes中的基本调度单元。一个 pod 中只有一个容器 运行 是常见的情况,因为大多数容器都可以独立调度(即它们不需要位于同一台机器上)。

关于您的示例,您可以将大多数容器放在单独的 pods 中,并使用 Replication Controller 水平扩展每个 Pod 的副本数量(因此容器)根据需要。除了复制控制器,您还需要一个 Service 来在副本之间进行负载平衡。可以使用 pods/replication controllers/services 上的标签组织垂直层,例如 tier=message_broker.

编辑:

将整个堆栈放在一个 pod 中不是一个好主意的原因是它限制了您的灵活性:

  • 它迫使您的整个堆栈在一台机器上进行调度,如果机器缺少一些必要的资源,这可能会使调度变得更加困难。
  • 单个组件无法独立扩展(例如,如果您需要更多前端副本来处理流量,但您的数据库仅用于少量查询)
  • 所有容器都需要就使用哪些端口达成一致。每个 pod 都有一个唯一的 IP,因此单独 pods 中的容器 运行 可以使用相同的端口。