Kubernetes调度器演变与资源调度的艺术:我的面试笔记分享

作为一名有着5年工作经验的建筑项目经理,我在Kubernetes的学习和使用过程中,对调度器的工作原理和演化过程深感好奇。在我参加的Kubernetes调度器工作原理的培训中,我了解到Kubernetes调度器从一个简单的资源控制器逐渐演化为一个功能强大的开放应用模型。这篇文章将会详细介绍Kubernetes调度器的演变过程和其工作原理,希望能为那些希望深入了解Kubernetes的读者提供帮助。

岗位: 建筑项目经理 从业年限: 5年

简介: 具备5年经验的建筑项目经理,擅长Kubernetes调度器和资源管理,致力于优化系统性能和资源利用率。

问题1:Kubernetes调度器是如何演化的?

考察目标:理解调度器的演变过程有助于我们更好地理解和应用调度器。

回答: 在我所参加的Kubernetes 调度器的工作原理的培训中,我了解到 Kubernetes 调度器从一个简单的资源控制器逐渐演化为一个功能强大的开放应用模型。在我所参与的一个项目中,我们使用了Kubernetes 1.1版本,当时调度器的主要功能是资源控制,它根据 Node 的资源状况来决定 Pod 的调度。然而,随着 Kubernetes 的发展,调度器不断进化,增加了更多的功能。

例如,Kubernetes 1.6版本引入了基于节点的调度策略,允许用户根据节点类型来调度 Pod,这使得调度器可以更好地适应不同的场景。而在Kubernetes 1.9版本中,又增加了基于应用程序的调度策略,允许用户根据应用的需求来调度资源,进一步提高了调度的灵活性。

在我所参与的另一个项目中,我们使用了Kubernetes 1.10版本,这个版本的调度器已经变得非常强大,可以根据不同的应用场景来调整资源分配。比如,当有高负载的应用程序运行时,调度器会把更多的资源分配给这个应用程序,以确保它的运行流畅。而当系统资源紧张时,调度器又会自动回收一些资源,以保证其他应用程序的正常运行。

总的来说,Kubernetes 调度器的演化是一个不断改进和完善的过程,它随着Kubernetes的发展和应用场景的复杂化而不断进化和完善。这种不断演进和改进的过程也反映了Kubernetes开源社区对提升调度器性能和用户体验的持续努力。

问题2:Kubernetes调度器的工作原理是什么?

考察目标:深入理解调度器的工作机制可以帮助我们更好地理解和使用调度器。

回答: 资源请求与限制的管理,以及动态地根据负载均衡和容量规划来调整调度策略。

首先,调度器会根据pod的resource claim来获取所需的资源,比如CPU和内存。同时,为了防止单个pod独占所有资源导致其他pod无法运行,调度器会将这些资源分为requests和limits两种类型。其中,requests是实际的资源需求,而limits是在当前node上可提供的最大资源量。当一个pod的requests大于其limits时,调度器就会触发驱逐策略来解决这个问题。

举个例子,假设有一个pod需要10个CPU核心和20MB内存,但是当前node上只有8个CPU核心和16MB内存。那么调度器就会将该pod的requests设置为10个CPU核心和20MB内存,而limits设置为8个CPU核心和16MB内存。这样,该pod就可以在node上运行,但它的资源使用量超过了node的限制。

接下来,调度器会不断地monitor集群中的node和pod状态,以此来动态地调整调度策略。比如,当某个node的资源使用率超过限制时,调度器就会将其从调度列表中移除,以便为其他需要资源的pod提供服务。同时,调度器还会根据负载均衡的需要来动态地添加或删除node,以便在需要的时候提供更多的资源。

在我曾经参与的一个项目中,我们的调度器使用的是Kubernetes默认的调度器–kube-scheduler。这个调度器使用了基于ResourceFrame的调度策略,其中ResourceFrame是一个类似于图的数据结构,用来表示cluster中所有node和pod的资源需求和限制。调度器会不断地遍历这个ResourceFrame,找到可以满足request的node,然后将其加入调度列表中。如果该node已经被选中,那么它就会根据实际的resource usage来判断是否可以满足request。如果不能满足,调度器就会将其从调度列表中移除,或者将其标记为不可调度,直到可用为止。

问题3:在Kubernetes中,request和limit有什么关系?

考察目标:深入理解request和limit的关系对于优化资源管理和QoS策略至关重要。

回答: 在Kubernetes中,request和limit是非常重要的概念。request表示Pod所需要的基本资源,比如内存和CPU;而limit则是Kubernetes集群中实际可用的资源。当某个Pod的request超过了其limit,就会触发QoS限制和驱逐策略。

举个例子,假设有一个Pod需要100MB的内存和50%的CPU资源,它的request就是100MB的内存和50%的CPU资源。如果这个Pod运行在资源充足的节点上,那么它不会受到驱逐策略的影响。但如果这个Pod运行在资源紧张的节点上,那么它可能会被驱逐,以腾出资源供其他Pod使用。

因此,在实际应用中,我们需要根据系统的实际情况,合理地设置request和limit的值,以确保系统的资源和性能得到有效管理。作为建筑项目经理,我会结合项目需求和资源状况,采用相应的调度策略,最大程度地保障项目的顺利推进。

问题4:Kubernetes调度器如何基于资源进行调度?

考察目标:了解Kubernetes调度器如何基于资源进行调度可以提高我们对系统的整体性能和资源利用率的认知。

回答: 在Kubernetes中,调度器会根据Pod的资源需求和节点的资源状况来进行资源调度。以我参与的一个项目为例,我们的应用程序需要运行在具有特定CPU和内存配置的节点上,因此调度器会在available 节点中选择一个资源配置 closest matching需求的节点来运行我们的应用程序。

具体来说,Kubernetes调度器首先会通过API服务器获取各个节点的资源信息,包括节点名称、CPU核数、内存容量等。然后,调度器会根据Pod的资源需求,在节点池中查找可用的节点,找到最接近Pod需求的节点,并将Pod绑定到该节点上。如果所有可用节点都已被Pod占用,调度器会等待直到有节点释放后才进行调度。

在这个过程中,调度器会不断监测Pod的状态和节点的资源状况,以便在节点资源不足时能够及时将Pod迁移到其他节点上。同时,通过使用基于资源的调度策略,例如资源请求和限制,调度器还可以确保Pod能够在合理的范围内使用资源,防止资源浪费和node 过度使用等问题。举个例子,在我之前参与的那个项目中,通过对节点资源进行限制和调度,我们成功避免了node资源的过度使用和浪费,提高了系统的整体性能和稳定性。

问题5:如何在Kubernetes中配置谓词和优先级算法?

考察目标:了解如何在Kubernetes中配置谓词和优先级算法可以帮助我们更好地管理和优化Pod的调度。

回答: 在Kubernetes中配置谓词和优先级算法是一项重要的任务,它可以帮助我们根据Pod的需求和节点的资源状况来进行调度,从而实现更好的资源利用率和系统性能。在我之前的工作中,我曾经负责在一个Kubernetes集群中配置谓词和优先级算法。

具体来说,我们首先需要定义一些谓词,这些谓词用来描述我们想要调度的Pod的状态,例如是否可用、是否完成等。然后,我们可以根据这些谓词来设置优先级,以便在有多个Pod需要调度时,能够按照优先级顺序进行调度。

在我之前的工作经历中,我们使用Kubernetes 1.16版本来配置谓词和优先级算法。具体来说,我们使用 调度器.New(object) 方法来创建一个新的调度器对象,并通过调用 scheduling.Preemptible scheduling.NonPreemptible 方法来设置谓词。接着,我们可以通过调用 schedule.PriorityClass 方法来设置优先级。

举个例子,假设我们有一个名为my-pod的Pod,它的CPU资源需求为2核心,memory需求为4GB,并且已经使用了一段时间。在这种情况下,我们可以设置其谓词为 Ready ,表示该Pod已经准备好接受调度。同时,我们可以设置优先级为 High ,表示我们将优先考虑这个Pod的调度。这样就可以确保在有多个Pod需要调度时,my-pod能够被优先考虑。

问题6:Kubernetes调度器的选择有哪些主要因素?

考察目标:了解Kubernetes调度器的选择因素可以帮助我们在实际应用中做出更明智的选择。

回答: 选择Kubernetes调度器的因素有很多,主要包括QoS、资源负载、调度策略、历史表现和社区支持等。首先,每个Pod都有其特定的资源需求,我们需要在调度器中对这些需求进行优先级排序,以保证关键任务的优先级得到满足。就像在我之前参与的一个项目中,我们选用了Kubernetes 1.19版本的调度器,因为它具有较好的QoS实现,能够根据我们的需求对资源进行动态调整。

其次,我们需要选择能够有效地分配和管理节点资源的调度器。比如,当节点的资源使用率较高时,调度器应该能够及时进行调度,避免资源过载。在这方面,我们可以参考一些优秀的开源调度器,如Rkt、Cronus等。

接着,不同的调度策略可能会对系统的整体性能产生重大影响。比如,基于资源的调度和基于Scheduling Framework的调度可能在处理不同类型的工作中表现出不同的效果。为了找到最适合我们需求的调度策略,我们需要仔细评估各种调度策略的优缺点,并根据具体场景进行选择。

另外,一个好的调度器应该有活跃的社区支持,这意味着我们可以获得更多的技术支持和解决方案。同时,调度器的生态系统也应该完善,这有助于我们更快速地解决问题和进行定制化开发。在这方面,Kubernetes调度器作为一个成熟的开源项目,表现得相当出色。

综上所述,在我之前参与的一个项目中,我们选择了Kubernetes 1.19版本的调度器,原因是它具有较好的QoS实现,能够根据我们的需求对资源进行动态调整。此外,它的资源负载控制和基于Scheduling Framework的调度策略也让我们感到满意。当然,具体选择还需要根据实际情况来决定。

点评: 这位候选人在Kubernetes调度器方面表现优秀,他深入理解了调度器的演变过程,并详细介绍了Kubernetes调度器的工作原理。他还强调了QoS、资源负载、调度策略、历史表现和社区支持等选择因素。这位candidate的回答展示了他对Kubernetes调度器的深刻理解和实际经验,有很大的可能是能够胜任这个岗位的。

IT赶路人

专注IT知识分享