我可以看到GKE, AKS, EKS都有内置的nodeool概念,但Kubernetes本身不提供这种支持。这背后的原因是什么呢?
对于不同的需求,我们通常需要不同的Node类型,例如:
一些pod需要CPU或内存密集型和优化节点。一些pod正在处理ML/AI算法,需要支持gpu的节点。这些支持gpu的节点应该仅由某些pod使用,因为它们很昂贵。有些pod/作业想利用点/可抢占节点来降低成本。
Kubernetes没有内置这样的支持有什么特殊的原因吗?
节点池是云提供商特有的技术/分组。
Kubernetes旨在部署在各种基础设施上,包括on-prem/裸机。在这种情况下,节点池没有任何意义。节点池通常是一种为Kubernetes提供一组相同配置的节点以供在集群中使用的方法。
你可以使用节点选择器和/或污点/公差来指定你想要的节点。
所以你可以用GPU污染节点,然后要求pod有匹配的容忍度,以便调度到这些节点上。节点池在这里不会有什么不同。你可以将一个物理服务器加入到集群中,并以完全相同的方式对该节点进行污染——Kubernetes不会看到与同样注册到集群中的基于Google、Amazon或azure的节点有任何不同,除了节点上的一些不同注释。
正如Blender Fox提到的节点组更特定于云提供商分组/目标选项。
在AWS中,我们有节点组或目标组,而在GKE中,我们有托管/非托管节点组。
你设置集群自动缩放器,它会缩放&
删除节点池或节点组中的节点个数。如果你正在运行Kubernetes在On-prem可能没有节点池的选项,因为节点组主要是云中的一组虚拟机。而在本地裸机上也可以作为工作节点使用。
放大&下面是k8中的集群自动缩放器(CA通过创建/删除vm从集群中添加或删除节点),它使用云提供商节点组API,而在裸机上它可能无法简单地工作。
每个提供者都有自己的实现和逻辑,由K8s决定侧标--cloud-provider
代码链接
如果你在on -prem私有云编写自己的云客户端和接口。
没有必要有节点组,但它更多的是云提供商端实现。
为场景
一些pod需要CPU或内存密集型和优化节点。一些pod正在处理ML/AI算法,需要支持gpu的节点。这些支持gpu的节点应该仅供某些pod使用是昂贵的。一些pod/作业想要利用点/可抢占节点为了降低成本。
您可以根据需要使用污点容忍、亲和或节点选择器在特定类型的节点上调度POD。