如何组织容器"水平"在Kubernetes pods里面?

时间:2015-09-28 18:07:19

标签: architecture docker kubernetes

所以我试图围绕一个典型的Kubernetes吊舱看起来是什么样子。根据{{​​3}}, pod

  

" 一个pod(如在鲸鱼或豌豆荚中)对应于使用共享上下文运行的共同应用程序组。"

后来在同一篇文章中:

  

" Pods可用于托管垂直整合的应用程序堆栈,但其主要动机是支持共存...... "

好的,所以你可以组织一个pod作为整个垂直堆栈(从DB到web应用程序)。但显然,这通常不是它的组织方式,所以我认为通常是" 水平"组织是首选(为什么?? )。

但对我来说,横向分层/分层意味着你只在一个容器中有一个容器,因为通常在每个服务层(web,app,cache,db等)中你都会有一种类型的组件。

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

  • 网络前端容器; Grails或Spring MVC web / app服务器
  • 微服务容器;存在核心业务逻辑的RESTful Web服务
  • 消息代理(比如RabbitMQ)容器
  • 微服务缓存(某些服务已分布位于它们之间的Hazelcast缓存群集及其数据库/后备存储)容器
  • MySQL数据库集群容器
  • MongoDB集群容器
  • 第三方RESTful云API(比如SalesForce或Stripe或类似的东西)

这些是应用程序堆栈中相当典型的组件。如果我们反对Kubernetes'自己的建议,并创建"垂直对齐" pod,每个pod将由每层的一种类型的容器组成(web / app服务器,每个微服务,每个DB等)。

但是如何组织水平对齐的吊舱?什么容器会进入哪个容器?<​​/ strong>

1 个答案:

答案 0 :(得分:7)

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

关于您的示例,您可以将大多数容器放在单个容器中,并使用复制控制器根据需要水平扩展每个Pod(以及容器)的副本数。与复制控制器一起,您还需要服务来在副本之间进行负载平衡。可以使用pod /复制控制器/服务上的标签来组织垂直层,例如tier=message_broker

编辑:

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

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