Kubernetes:一个Pod,在多个节点上运行多个容器

3

请帮我创建一个用于Kubernetes的YAML配置文件,以应对如下情况:一个pod包含3个容器(例如),这些容器需要部署在Google GCE集群的3个节点上。

|P|      |Cont1| ----> |Node1|
|O| ---> |Cont2| ----> |Node2| <----> GCE cluster
|D|      |Cont3| ----> |Node3|

谢谢


正如文档中所述:Pod 中的容器会自动地在集群中的同一台物理或虚拟机上进行协作和调度。这意味着 Pod 中的容器始终位于同一节点上。如果您想要进行水平扩展,可以将容器放入不同的 Pod 中。 - Dries De Rydt
看起来很奇怪,我不能在更多的集群节点上部署一些容器,考虑到这样做我无法轻松地扩展Web服务器电池,利用集群的弹性和Kubernetes实用程序在一个操作中执行某些操作... - suikoy
总的来说,组件不需要等比例缩放。你的数据库可以处理一定的负载,但也许你的网页本身需要更多的扩展来处理相同数量的用户。在这种情况下,能够分别进行扩展是非常有益的。如果你把它们放在同一个 pod 中,它们总是必须水平地按照完全相同的程度进行扩展。为什么要把它们捆绑在一起呢? - Dries De Rydt
事实上,我的想法是为数据库和Web服务器分别创建一个Pod。但我之所以这样考虑开发,是因为我相信我可以使用集群将所有Web服务器作为单个服务进行管理。另一方面,如果一个具有多个容器的Pod只能部署在一个节点上,那么拥有节点集群的意义是什么?考虑到集群节点具有相同的硬件特性,在同一节点上有多个容器意味着给一个容器增加负担,而让另一容器处于空载状态。现在我真的不明白拥有集群+Kubernetes的用处了... - suikoy
假设您的节点有两个运行Web服务的Pod。您的集群将在两个服务器之间平衡负载,现在您可以处理更多的流量。较小的节点通常比拥有一个大型单体结构更便宜。此外,如果您正在运行两个Web服务器并且其中一个崩溃,您仍然可以从备份中提供流量。Kubernetes还将重新启动停机的服务。您应该研究可用性和水平扩展等术语。它还可以让您更有效地使用硬件。如果您有两个小型服务,则它们可以适合一个节点,并且您可以节省成本。 - Dries De Rydt
可以使用云网络服务(AWS或GCE)仅使用虚拟机来完成这些事情。我知道我也可以使用集群和Kubernetes开发多层架构,但我并没有看到这种解决方案的巨大优势。此外,增加一个抽象级别(节点->Pod->代码)可能会使配置比虚拟机方法(节点->代码)更加复杂。 - suikoy
2个回答

1

来自Kubernetes概念,

Kubernetes集群中的Pod可以用两种主要方式使用:运行单个容器的Pod。这种“一个Pod一个容器”的模型是最常见的Kubernetes用例;在这种情况下,您可以将Pod视为单个容器的包装器,而Kubernetes管理Pod而不是直接管理容器。运行多个需要协同工作的容器的Pod。一个Pod可能封装了由多个紧密耦合且需要共享资源的共同定位容器组成的应用程序。这些共同定位的容器可能形成一个单一的服务单元——一个容器向公众提供来自共享卷的文件,而另一个“边车”容器则刷新或更新这些文件。Pod将这些容器和存储资源一起包装成一个可管理的单个实体。

简而言之,为了真正从微服务架构中受益,与通常部署在虚拟机中的单块架构相比,您应该将每个容器放置在单个 Pod 中。但是,在某些情况下,您需要考虑共同定位容器。即,如《组合容器模式》(Patterns for Composite Containers)文章所述,一些组合容器应用程序包括:
- Sidecar 容器

扩展和增强“主”容器

- Ambassador 容器

代理本地连接到世界

- Adapter 容器

标准化和规范化输出

一旦定义并运行部署,调度程序将负责选择最适合您的 Pod 的位置,除非您通过在部署的 YAML 中定义标签来手动分配节点(不建议除非您知道自己在做什么)。手动分配节点

0

您可以将多个容器分配给单个 Pod。您可以将 Pod 分配给特定的节点池。但我不确定是否可以将多个容器分配给在单个 Pod 中运行的多个节点。

在这里,您可以将每个容器分配给不同的 Pod(3 个容器 -> 3 个 Pod),然后通过将此代码添加到部署的 .yaml 文件中,将每个 Pod 分配给不同的节点池。

nodeSelector:
   nodeclass: pool1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接