当容器配置资源请求后,调度器会根据该请求值选择能够满足的节点。如果没有节点能满足,则Pod将无法被调度,并且处于“Pending”状态。因此,Kubernetes中存在一种资源管理机制,这个机制有以下作用。
调度决策:帮助调度器在集群中选择合适的节点,以满足Pod的资源需求。
均衡负载:根据资源请求来平衡节点上的资源使用,减少某些节点资源过载而其他节点资源空闲的情况。
资源规划:有助于规划和优化集群的资源分配,提高整体资源利用率。
例如:在Kubernetes集群中已创建了6个Pod,其中3个Pod资源请求为500 Mi内存和0.6核CPU,另外3个Pod资源请求为1 Gi内存和1核CPU。这些Pod节点分布如图3-7所示。
图3-7 Pod节点分布1
在这种情况下,创建一个资源请求为1 Gi内存和1核CPU的Pod,调度器会将该Pod分配给Node1节点,如图3-8所示。这是因为Node2节点总资源请求为3 Gi内存和3.2核CPU,其中CPU无法满足该Pod的需求。
需要了解的是,调度器还会考虑其他因素,如节点资源利用率、污点、亲和性规则等,以做出最终的调度决策,而资源请求只是影响决策的因素之一。
图3-8 Pod节点分布2
如果再创建一个Pod,资源请求为2 Gi内存和1核CPU,那么Pod会被调度到哪个节点上呢?
答案是该Pod无法被调度。因为这两个节点只能满足CPU的需求,不能满足内存的需求。此时,通过“kubectl describe pod <Pod名称>”命令查看事件,你将看到“Insufficient memory”的提示。
需要注意的是,资源请求并不会直接占用节点资源,而是用于调度和分配。这样可以避免将Pod调度到资源不足的节点上,确保Pod在运行时能够正常获取所需的计算资源。