我读过k8s的资源管理,但事情对我来说仍然不是很清楚。假设我们有2个k8s节点,每个节点有22 mb内存。假设Pod A请求10mb,限制15mb(但假设实际使用量为5mb)。所以这个pod被安排在节点1上。所以node1有22 mb内存,5 mb被Pod A使用,但如果Pod A需要更多内存,另外17mb可用。Pod B有请求10和限制15(与Pod A基本相同),所以这个Pod被安排在节点2上
所以两个节点在22mb中都有5mb的使用。如果Pod C有5mb的请求和10mb的限制,这个Pod会被调度到任何节点上吗?如果是,会发生什么,Pod C需要10m内存,另一个Pod需要15mb内存?
如果Pod C有13mb的请求和15mb的限制会发生什么?在这种情况下,13(pod C的请求)+ 10(pod A的请求)会是23(大于22)吗?
k8s是否尝试确保所有pod的请求
回复帖子中的问题:
假设Pod A请求10mb,限制15mb(但假设实际使用量为5mb)。所以这个pod被安排在节点1上。所以node1有22 mb内存,5是由Pod A使用的,但如果Pod A需要更多内存,另一个17mb可用。Pod B有请求10和限制15(与Pod A基本相同),所以这个Pod被安排在节点2上
这不是一个真正的问题,但我认为这部分需要一些关于Pods
如何被调度到节点上的观点。负责告诉Kubernetes应该在哪里调度Pod
的组件是:kube-scheduler
。它可以考虑到你所说的情况:
Pod A, req:10M, limit: 15M
->Node 1, mem: 22MB
Pod B req:10M, limit: 15M
->Node 2, mem: 22MB
引用官方文档:
kube-scheduler中的节点选择
kube-scheduler
在两步操作中为pod选择一个节点:
- 得分
过滤步骤找到可以调度Pod的节点集。例如,PodFitsResources过滤器检查候选节点是否有足够的可用资源来满足Pod的特定资源请求。在此步骤之后,节点列表包含任何合适的节点;通常,会有不止一个。如果列表为空,则该Pod(尚)不可调度。
在评分步骤中,调度程序对剩余节点进行排序,以选择最合适的Pod位置。调度程序根据活动评分规则为过滤后幸存的每个节点分配一个分数。
最后,kube-scheduler将Pod分配给最高级别的Node。如果有多个具有相同分数的节点,kube-scheduler将随机选择其中一个。
,Kubernetes。io: Docs:概念:调度退出:Kube调度器:实现
所以两个节点在22mb中都有5mb的使用。如果Pod C有5mb的请求和10mb的限制,这个Pod会被调度到任何节点上吗?如果是,会发生什么,Pod C需要10m内存,另一个Pod需要15mb内存?
在这个特殊的例子中,我将更关注请求部分而不是实际用法。假设没有其他因素会拒绝调度,那么Pod C
应该在kube-scheduler
选择的一个节点上生成。为什么呢?:
resource.limits
将不拒绝Pod
的调度(限制可以高于内存)resource.requests
将拒绝Pod
的调度(请求不能高于内存)
我建议您查看以下文章以获得更多参考:
- Sysdig.com: Blog: Kubernetes限制请求
-
cloudd.google.com: Blog: Products: Containers Kubernetes: Kubernetes最佳实践:(这是
GKE
的博客,但它应该给出了基本的想法,参见部分:" Kubernetes pods的生命周期")部分)
如果Pod C有13mb的请求和15mb的限制会发生什么?在这种情况下,13(pod C的请求)+ 10(pod A的请求)会是23(大于22)吗?
在这个例子中,Pod
将不会按请求的总和排期;内存(假设没有Pod
优先级)。Pod
将处于Pending
状态。
额外的资源:
- Kubernetes。io: Docs:概念:调度退出:Kube调度器:下一步是什么
- Youtube.com:深入了解最新的Kubernetes调度功能-来自CNCF[云原生计算基金会]会议