调度与亲和性
理解调度器的工作原理
掌握节点选择、亲和性、污点容忍
能根据业务配置调度策略
核心讲解
kube-scheduler 负责把 Pod 调度到合适的节点,综合资源、策略、亲和性等决策。
(1)基础调度规则
资源过滤:CPU、内存、端口、存储
节点选择:nodeSelector 指定标签节点
打分排序:资源剩余、亲和性、均衡分布等多维度打分,选最高的
(2)节点选择 nodeSelector
最简单的调度方式,Pod 只能调度到有对应标签的节点。
给节点打标签:
kubectl label nodes 节点名 键=值Pod 配置 nodeSelector
(3)亲和性 Affinity
更灵活的调度规则,硬亲和、软亲和。
节点亲和:Pod 倾向调度到某类节点
Pod 亲和:Pod 倾向和某些 Pod 放一起
Pod 反亲和:Pod 不要和某些 Pod 放一起
(4)污点与容忍 Taint/Toleration
节点打污点,普通 Pod 调度不上去,只有加了容忍的 Pod 才能调度上去。
场景:专用节点、GPU 节点、特定业务节点
操作示例
# 给节点打标签
kubectl label nodes node01 disk=ssd
kubectl label nodes node02 env=test
# 查看节点标签
kubectl get nodes --show-labels
# nodeSelector 示例
spec:
nodeSelector:
disk: ssd
containers:
- name: nginx
image: nginx
# 节点亲和性示例
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disk
operator: In
values: ["ssd"]
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: env
operator: In
values: ["test"]
containers:
- name: nginx
image: nginx
# 给节点打污点
kubectl taint nodes node01 key=value:NoSchedule
# Pod 加容忍
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
常见误区
调度就是随机放:有复杂的调度算法,资源、亲和、平衡综合考虑
亲和性一定能调度过去:硬亲和必须满足,软亲和尽量满足,满足不了也能调度
污点就是不让用:只是普通 Pod 不能用,加了容忍就可以,用来做专属节点
标签只能打节点:节点、Pod、命名空间都可以打标签,用来做选择和匹配
课后练习
给节点打标签,用 nodeSelector 把 Pod 调度到指定节点
配置节点软亲和,优先调度到 SSD 节点
给节点打污点,给 Pod 加容忍验证调度
思考:节点亲和和 Pod 反亲和分别适合什么场景?

