【Kubernetes】(十三) Pod 调度
目录
1. requiredDuringSchedulingIgnoredDuringExecution(强制亲和)
2. preferredDuringSchedulingIgnoredDuringExecution(优先亲和)
一、Pod 调度核心概述
Kubernetes 调度器的核心职责,是为 Pod 选择合适的节点运行。为了满足业务的差异化调度需求,K8s 提供了多层级、灵活的调度控制能力,从简单的节点指定,到亲和性 / 污点的精细化控制,覆盖了绝大多数生产场景。
二、基础调度方式
1. nodeSelector:基于标签的简单调度
nodeSelector 是最基础的调度方式,通过节点标签匹配,将 Pod 强制调度到符合标签要求的节点。
操作步骤:
给目标节点打标签:kubectl label nodes cka-worker2 name=yinling
在 Pod 配置中添加 nodeSelector 字段,指定匹配标签
示例配置:
apiVersion: v1
kind: Pod
metadata:
name: nstest
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
name: yinling
特点:简单直观,仅支持完全匹配,灵活性低,适合简单场景。
2. nodeName:直接指定节点调度
nodeName 是最直接的调度方式,直接指定 Pod 运行的节点名称,绕过调度器的预选 / 优选流程。
示例配置:
apiVersion: v1
kind: Pod
metadata:
name: nntest
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeName: cka-worker1
特点:强制调度,不做任何校验,仅适合调试或特殊场景,生产不推荐。
三、进阶调度:节点亲和性(Affinity)
节点亲和性(nodeAffinity)是 nodeSelector 的增强版,支持更灵活的匹配规则,分为两种类型:
1. requiredDuringSchedulingIgnoredDuringExecution(强制亲和)
作用:必须满足匹配规则,否则 Pod 无法调度,等价于 nodeSelector 的强制约束,但支持更复杂的表达式(如 In、NotIn 等)
示例配置:
apiVersion: v1
kind: Pod
metadata:
name: require
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
2. preferredDuringSchedulingIgnoredDuringExecution(优先亲和)
作用:优先调度到符合规则的节点,若没有符合条件的节点,仍可调度到其他节点,支持 weight 权重配置
示例配置:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
四、污点与容忍度(Taint & Toleration)
污点(Taint)作用于节点,用于排斥 Pod;容忍度(Toleration)作用于Pod,用于让 Pod 容忍节点的污点,实现 “反调度” 控制。
- 核心逻辑:节点添加污点后,只有配置了对应容忍度的 Pod 才能被调度到该节点
- Master 节点默认污点:
node-role.kubernetes.io/control-plane:NoSchedule,因此普通 Pod 不会调度到 Master 节点
容忍度配置示例
apiVersion: v1
kind: Pod
metadata:
name: tolerationsmust
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
nodeSelector:
node-role.kubernetes.io/control-plane: ""
说明:仅配置容忍度不代表必须调度到 Master 节点,需配合 nodeSelector 强制调度。
五、问答题
Q:简述 nodeSelector 的作用与使用方式。
A: nodeSelector 是基础调度方式,通过给节点打标签,在 Pod 配置中指定匹配的标签,将 Pod 强制调度到符合标签要求的节点。使用时先通过 kubectl label nodes 给节点打标签,再在 Pod 的 spec.nodeSelector 字段配置匹配规则。
Q:简述 nodeName 的作用与特点。
A: nodeName 用于直接指定 Pod 运行的节点名称,绕过调度器流程,强制 Pod 调度到指定节点。特点是简单直接,但不做校验,仅适合调试场景,生产环境不推荐使用。
Q:节点亲和性(Affinity)的两种类型分别是什么?有什么区别?
A: 节点亲和性分为两种:
requiredDuringSchedulingIgnoredDuringExecution:强制亲和,必须满足匹配规则,否则 Pod 无法调度;
preferredDuringSchedulingIgnoredDuringExecution:优先亲和,优先调度到符合规则的节点,无符合节点时仍可调度到其他节点,支持权重配置。
Q:什么是污点(Taint)和容忍度(Toleration)?它们的作用是什么?
A: 污点(Taint)作用于节点,用于排斥 Pod,只有配置了对应容忍度的 Pod 才能被调度到该节点;容忍度(Toleration)作用于 Pod,用于让 Pod 容忍节点的污点。二者配合使用,可实现节点的反调度控制,例如 Master 节点默认添加污点,避免普通 Pod 调度到 Master。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)