Kubernetes - 单集群或多集群
Posted
技术标签:
【中文标题】Kubernetes - 单集群或多集群【英文标题】:Kubernetes - Single Cluster or Multiple Clusters 【发布时间】:2019-07-11 04:49:28 【问题描述】:我正在将一些应用程序从 AWS ECS 迁移到 Azure AKS,并且作为我在 Kubernetes 中的第一个生产部署,我想确保它从一开始就正确设置。
被迁移的应用程序都在不同程度上使用资源,其中一些更占用内存,而另一些则占用更多 CPU,并且都以不同的规模运行。
经过一些研究,我不确定哪个是运行单个大型集群并将它们全部运行在自己的命名空间中的最佳方法,或者使用联合运行每个应用程序的单个集群。
我应该注意,我需要监控每个应用程序的资源使用情况以进行成本管理(除其他外),并且大多数应用程序之间需要通信。
我可以设置这两种布局,而且我确信两者都可以,但我不确定每种方法的优缺点,是否应该完全避免使用一种方法,或者是否应该考虑其他选择?
【问题讨论】:
这是一个巨大的架构讨论,但我的 2 美分。我建议使用具有多个命名空间的 1 个集群。您曾经的集群可能有不同类型的节点(一些具有很少的 cpu/ram 和一些高性能节点)。然后,您可以使用NodeSelector
、taints
、tolerations
将需要高性能的应用程序与提供高性能的节点联系起来。全部由一个 API 服务器管理。
很遗憾,您还不能在 AKS 中执行此操作,所有节点都必须是相同规格的 VM。
【参考方案1】:
正如您所说,应用程序之间需要通信,我建议您使用一个集群。应用程序隔离可以通过将每个应用程序部署在单独的命名空间中来实现。您可以在命名空间级别收集指标,并可以在命名空间级别设置资源配额。这样您就可以在应用程序级别采取行动
【讨论】:
【参考方案2】:因为您正处于 kubernetes 之旅的开始阶段,所以我会为您拥有的每个阶段(或至少单独的开发和产品)使用单独的集群。你可以很容易地关闭你的集群(我在资源匮乏的情况下做了几次)。也没有正确设置那些网络策略,您可能会发现来自不同阶段/命名空间(如测试和沙盒)的服务相互通信。或者应该部署 dev 以更改其他命名空间中的某些内容的管道。 为什么要冒生产受到开发工作影响的风险?
即使您不必自己升级控制平面,aks 仍然有它的版本和标志,最好在转移到单独集群上的生产之前对其进行测试。
所以我最初的决定是设置一些硬边界:不同的集群。稍后,一旦您对 aks 和 kubernetes 有了更多了解,您就可以重新审视您的决定。
【讨论】:
【参考方案3】:单个集群(带有命名空间和RBAC)更易于设置和管理。单个 k8s 集群确实支持high load。
如果你真的想要多个集群,你也可以尝试istio multi-cluster(istio service mesh 用于多个集群)。
【讨论】:
【参考方案4】:取决于...请注意 AKS 仍然不支持多个节点池(在短期路线图中),因此您需要在单池 VM 类型中运行这些工作负载。此外,在考虑多个集群时,请考虑多租户需求和单个集群的爆炸半径。我通常会看到用户部署多个集群,即使存在一些管理开销,但良好的 SCM 和配置管理实践可以帮助解决这个开销。
【讨论】:
只是添加注意它现在支持多个节点池。把这个留给任何发现这个问题的人。以上是关于Kubernetes - 单集群或多集群的主要内容,如果未能解决你的问题,请参考以下文章
是否有用于 Azure AKS(Azure kubernetes 服务)集群的 API 网关
K8S------Kubernetes单Master集群二进制搭建