Kubernetes 工作节点:许多小节点还是几个大节点?

Kubernetes 工作节点:许多小节点还是几个大节点?
创建 Kubernetes 集群时,可能会出现问题:要配置多少个工作节点以及什么类型? 对于本地集群来说,哪个更好:购买几台功能强大的服务器还是在数据中心使用十几台旧机器? 在云中使用八个单核实例还是两个四核实例更好?

这些问题的答案都在文章中。 Daniel Weibel,Learnk8s 教育项目的软件工程师和教师 在命令的翻译中 Mail.ru 的 Kubernetes aaS.

集群容量

一般来说,Kubernetes 集群可以被认为是一个大型的“超级节点”。 它的总算力是其所有组成节点算力的总和。

有多种方法可以实现您所需的集群容量目标。 例如,我们需要一个总容量为 8 个处理器核心和 32 GB RAM 的集群,因为一组应用程序需要如此多的资源。 然后,您可以安装两个 16 GB 内存的节点或四个 8 GB 内存的节点、两个四核处理器或四个双核处理器。

以下是创建集群的两种可能方法:

Kubernetes 工作节点:许多小节点还是几个大节点?
两种选项都会生成具有相同容量的集群,但底部配置有四个较小的节点,顶部配置有两个较大的节点。

哪个是最好的选择?

为了回答这个问题,让我们看看这两种选择的优点。 我们将它们总结在一个表格中。

几个大节点

许多小节点

更轻松的集群管理(如果是本地部署)

平滑的自动缩放

更便宜(如果是本地部署)

价格差别不大(在云端)

可以运行资源密集型应用程序

完全复制

资源的使用效率更高(系统守护进程的开销更少
更高的集群容错能力

请注意,我们只讨论工作节点。 选择主节点的数量和大小是一个完全不同的话题。

因此,让我们更详细地讨论表中的每一点。

第一个选择:几个大节点

最极端的选择是一个工作节点承担整个集群的容量。 在上面的示例中,这将是一个具有 16 个 CPU 核心和 16 GB RAM 的单个工作节点。

优点

加号 1. 更轻松的管理
管理几台机器比管理整个机群更容易。 推出更新和修复的速度更快,同步也更容易。 从绝对数量来看,失败的数量也较少。

请注意,上述所有内容都适用于您的硬件、服务器,而不适用于云实例。

在云中情况有所不同。 在那里,管理由云服务提供商负责。 因此,管理云中的十个节点与管理一个节点没有太大区别。

云中 Pod 之间的流量路由和负载分配 自动执行:来自互联网的流量被发送到主负载均衡器,主负载均衡器将流量转发到其中一个节点的端口(NodePort 服务在每个集群节点中将端口设置在 30000-32767 范围内)。 kube-proxy 设置的规则将流量从节点重定向到 pod。 以下是两个节点上 XNUMX 个 Pod 的情况:

Kubernetes 工作节点:许多小节点还是几个大节点?
优点#2:每个节点的成本更低
动力强劲的汽车价格更高,但价格上涨不一定是线性的。 换句话说,一台具有 10 GB 内存的十核服务器通常比十台具有相同内存量的单核服务器便宜。

但请注意,此规则通常不适用于云服务。 在所有主要云提供商当前的定价方案中,价格随着容量线性增加。

因此,在云中,您通常无法节省购买功能更强大的服务器的费用。

优点#3:您可以运行资源密集型应用程序
某些应用程序需要集群中功能强大的服务器。 例如,如果机器学习系统需要 8 GB 内存,则您将无法在 1 GB 节点上运行它,而只能在至少一个大型工作节点上运行。

缺点

缺点 1. 每个节点有很多 pod
如果相同的任务在更少的节点上执行,那么每个节点自然会有更多的 Pod。

这可能是个问题。

原因是每个模块都会给容器运行时(例如 Docker)以及 kubelet 和 cAdvisor 带来一些开销。

例如,kubelet 定期探测节点上的所有容器的生存能力 - 容器越多,kubelet 要做的工作就越多。

CAdvisor 收集节点上所有容器的资源使用统计信息,kubelet 定期查询此信息并通过 API 提供。 同样,更多的容器意味着 cAdvisor 和 kubelet 需要做更多的工作。

如果模块数量增加,则会降低系统速度,甚至损害其可靠性。

Kubernetes 工作节点:许多小节点还是几个大节点?
在 Kubernetes 存储库中一些 抱怨节点会在 Ready/NotReady 状态之间跳转,因为定期 kubelet 检查节点上的所有容器需要很长时间。
为此,Kubernetes 建议每个节点放置的 Pod 数量不要超过 110 个。 根据节点的性能,您可以在每个节点运行更多的 pod,但很难预测是否会出现问题或一切都会正常工作。 值得提前测试这项工作。

缺点 2. 复制限制
节点太少限制了应用程序复制的有效范围。 例如,如果您有一个具有五个副本但只有两个节点的高可用性应用程序,则该应用程序的有效复制程度会减少到两个。

XNUMX 个副本只能分布在两个节点上,如果其中一个副本出现故障,则会立即删除多个副本。

如果您有五个或更多节点,则每个副本将在单独的节点上运行,一个节点发生故障最多将删除一个副本。

因此,高可用性要求可能需要集群中一定的最小节点数。

缺点三:失败会带来更严重的后果
当节点数量较少时,每次故障都会产生更严重的后果。 例如,如果您只有两个节点,其中一个节点发生故障,则一半的模块会立即消失。

当然,Kubernetes 会将工作负载从故障节点迁移到其他节点。 但如果数量很少,则可能没有足够的可用容量。 因此,在您启动故障节点之前,某些应用程序将不可用。

因此,节点越多,硬件故障的影响就越小。

缺点 #4:更多自动缩放步骤
Kubernetes 有一个针对云基础设施的集群自动伸缩系统,它允许您根据当前的需求自动添加或删除节点。 对于较大的节点,自动缩放变得更加突然和笨拙。 例如,在两个节点上,添加一个额外的节点将立即使集群容量增加 50%。 即使您不需要这些资源,您也必须付费。

因此,如果您计划使用自动集群扩展,则节点越小,您获得的扩展就越灵活且更具成本效益。

现在让我们看看大量小节点的优点和缺点。

第二种选择:许多小节点

这种方法的优点本质上源于具有多个大节点的相反选项的缺点。

优点

优点#1:故障影响较小
节点越多,每个节点上的 pod 就越少。 例如,如果每 XNUMX 个节点有 XNUMX 个模块,则每个节点平均有 XNUMX 个模块。

这样,如果其中一个节点发生故障,您只会损失 10% 的工作负载。 很可能只有少数副本会受到影响,整个应用程序将保持运行。

此外,其余节点可能有足够的可用资源来处理故障节点的工作负载,因此 Kubernetes 可以自由地重新调度 Pod,并且您的应用程序将相对快速地恢复到功能状态。

优点#2:良好的复制性
如果有足够的节点,Kubernetes调度程序可以为所有副本分配不同的节点。 这样,如果一个节点发生故障,只有一个副本会受到影响,并且应用程序将保持可用。

缺点

缺点一、难以控制
大量节点更难以管理。 例如,每个 Kubernetes 节点必须与所有其他节点通信,即连接数量呈二次方增长,并且需要跟踪所有这些连接。

Kubernetes Controller Manager 中的节点控制器定期遍历集群中的所有节点以检查运行状况 - 节点越多,控制器上的负载就越大。

etcd 数据库上的负载也在增长 - 每个 kubelet 和 kube-proxy 调用 守望者 对于 etcd(通过 API),etcd 应向其广播对象更新。

一般来说,每个工作节点都会对主节点的系统组件施加额外的负载。

Kubernetes 工作节点:许多小节点还是几个大节点?
Kubernetes 官方支持集群 节点数量最多5000个。 然而实际上已经有500个节点 可能会导致不小的问题.

为了管理大量的工作节点,应该选择更强大的主节点。 例如,kube-up 自动安装 主节点的正确 VM 大小取决于工作节点的数量。 也就是说,工作节点越多,主节点的生产力就应该越高。

为了解决这些具体问题,有一些特殊的发展,例如 虚拟Kubelet。 该系统允许您绕过限制并构建具有大量工作节点的集群。

缺点#2:管理费用更高。
在每个工作节点上,Kubernetes 运行一组系统守护进程 - 其中包括容器运行时(例如 Docker)、kube-proxy 和 kubelet,其中包括 cAdvisor。 它们一起消耗一定量的固定资源。

如果你有很多小节点,这个开销在每个节点上所占的比例就更大。 例如,假设单个节点上的所有系统守护程序总共使用 0,1 个 CPU 核心和 0,1 GB 内存。 如果您有一个具有 10 GB 内存的十核节点,则守护进程将消耗集群容量的 1%。 另一方面,在 1 个具有 10 GB 内存的单核节点上,守护进程将占用集群容量的 XNUMX%。

因此,节点越少,基础设施的使用效率就越高。

缺点三:资源利用效率低下
在小型节点上,剩余的资源块可能太小而无法分配任何工作负载,因此它们保持未使用状态。

例如,每个 Pod 需要 0,75 GB 内存。 如果您有 1 个节点,每个节点有 0,25GB 内存,则可以运行 XNUMX 个 Pod,每个节点还有 XNUMXGB 的未使用内存。

这意味着整个集群有25%的内存被浪费了。

在具有 10 GB 内存的大型节点上,您可以运行其中 13 个模块 - 并且只会有一个 0,25 GB 的未使用片段。

在这种情况下,只有 2,5% 的内存被浪费。

因此,在较大的节点上可以更优化地使用资源。

几个大节点还是许多小节点?

那么,哪个更好:集群中的几个大节点还是许多小节点? 一如既往,没有明确的答案。 很大程度上取决于应用程序的类型。

例如,如果应用程序需要 10 GB 内存,那么更大的节点是显而易见的选择。 如果应用程序需要十倍复制来实现高可用性,则几乎不值得冒险将副本放置在两个节点上 - 集群中必须至少有十个节点。

在中间情况下,根据每个选项的优点和缺点做出选择。 也许某些论点比其他论点更适合您的情况。

并且根本没有必要使所有节点的大小相同。 没有什么可以阻止您首先尝试相同大小的节点,然后向其中添加不同大小的节点,将它们组合在一个集群中。 Kubernetes 集群中的工作节点可以是完全异构的。 所以你可以尝试结合这两种方法的优点。

没有单一的配方,每种情况都有其细微差别,只有生产才能证明真相。

云平台团队准备的翻译 Mail.ru 云解决方案.

有关 Kubernetes 的更多信息: 25 个用于管理和部署集群的有用工具.

来源: habr.com

添加评论