如何在 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 中只有一个容器,因为通常在每一层服务(网络、应用程序、缓存、数据库等)中您将有一种组件。
举个具体的例子吧。假设我们有以下垂直层叠:
- Web 前端容器; Grails 或 Spring MVC web/app 服务器
- 微服务容器; RESTful 核心业务逻辑所在的 Web 服务
- 消息代理(比如 RabbitMQ)容器
- 微服务缓存(一些服务有分布式 Hazelcast 缓存集群,位于它们和它们的 DB/backing 存储之间)容器
- MySQL 数据库集群容器
- MongoDB 集群容器
- 第 3 方 RESTful 云 API(比如 SalesForce 或 Stripe 或类似的东西)
这些是应用堆栈中相当典型的组件。如果我们违背 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 中的容器 运行 可以使用相同的端口。
所以我正在努力思考典型的 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 中只有一个容器,因为通常在每一层服务(网络、应用程序、缓存、数据库等)中您将有一种组件。
举个具体的例子吧。假设我们有以下垂直层叠:
- Web 前端容器; Grails 或 Spring MVC web/app 服务器
- 微服务容器; RESTful 核心业务逻辑所在的 Web 服务
- 消息代理(比如 RabbitMQ)容器
- 微服务缓存(一些服务有分布式 Hazelcast 缓存集群,位于它们和它们的 DB/backing 存储之间)容器
- MySQL 数据库集群容器
- MongoDB 集群容器
- 第 3 方 RESTful 云 API(比如 SalesForce 或 Stripe 或类似的东西)
这些是应用堆栈中相当典型的组件。如果我们违背 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 中的容器 运行 可以使用相同的端口。