Pod调度
先筛选"能运行的节点",再选择"最合适的节点"
一、Pod调度核心流程
K8s调度器主要分为两个阶段:
- 节点筛选(Filter)
- 节点评分(Score)
二、流程图

三、节点筛选(Filter阶段):
调度器会从所有节点中筛选出"可用节点",主要依据以下条件:
- 节点选择(nodeSelecor/nodeAffinity)
根据标签筛选节点,如:
nodeSelector:
xx: yy
指定节点名运行,如
nodeName:K8s-master
根据标签亲和性(硬约束)筛选节点,如:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values: ["ssd"]
- 污点与容忍(Taints & Tolerations)
如果节点有污点,Pod必须有对应容忍才能调度
tolereations:
effect: NoSchedule
key: xx
value: yy
operator: Equal
- 资源检查(requests)
判断节点是否有足够CPU/内存资源满足Pod的requests要求
resources:
requests:
memory: 500Mi
四、节点评分(Score阶段):
在筛选出的节点中,调度器会根据策略进行打分,如:
- 资源利用率(空闲优先)
- Pod分布均衡
- Affinity(preferred)软约束
- Node负载情况
最终选择最优节点。
五、requests和limits区别
- requests:调度依据
- limits:运行限制
六、资源限制对调度影响
- 当requests设过高时,Pod可能无法调度(Pending状态)

-
当limits设置过低时,容器可能被限制性能甚至被杀掉
apiVersion: v1
kind: Pod
metadata:
name: mem-test
spec:
containers:
- name: mem-test
image: python:3.9
command: ["python", "-c"]
args:
- |
a = []
while True:
a.append(' ' * 10**7)
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
