k8s-高级调度(二)
目录
Taint(污点)与Toleration(容忍)
Taint(污点):节点的排斥标记
Toleration(容忍):Pod的适配声明
与节点亲和性的对比
警戒(cordon)和转移(drain)
Cordon:节点隔离(阻止新 Pod 调度)
Drain:节点驱逐(安全迁移所有 Pod)
Cordon vs Drain:核心区别
亲和性和非亲和性
节点亲和性(Node Affinity)
硬性要求(Required During Scheduling Ignored During Execution)
软性偏好(Preferred During Scheduling Ignored During Execution)
Pod 亲和性(Pod Affinity)
硬性要求(Required During Scheduling Ignored During Execution)
软性偏好(Preferred During Scheduling Ignored During Execution)
亲和性规则的核心操作符
亲和性与非亲和性的关系
关键对比与注意事项
Taint(污点)与Toleration(容忍)
在Kubernetes(K8s)中,Taint(污点)和Toleration(容忍)是用于控制Pod调度到节点的核心机制,二者协同工作以实现灵活的节点资源分配。
Taint(污点):节点的排斥标记
- 作用:Taint是节点级别的属性,用于标记节点的特殊限制或要求,阻止不符合条件的Pod被调度到该节点。
- 组成:每个Taint由三部分构成:
- Key(键):标识污点的唯一名称(如
dedicated=special
中的dedicated
)。 - Value(值):可选的附加标识(如
special
),与Key共同构成唯一标识。 - Effect(效果):定义污点对Pod的排斥行为,支持以下三种类型:
- NoSchedule:禁止Pod调度到该节点(除非Pod有匹配的Toleration)。
- PreferNoSchedule:尽量避免调度,但无其他可用节点时仍可调度。
- NoExecute:不仅禁止新Pod调度,还会驱逐节点上已存在的、无匹配Toleration的Pod。
- Key(键):标识污点的唯一名称(如
Toleration(容忍):Pod的适配声明
- 作用:Toleration是Pod级别的属性,声明Pod可以容忍哪些节点的污点,从而允许调度到这些节点。
- 匹配规则:Toleration需与节点的Taint在Key和Effect上完全一致,且满足以下条件之一:
- Operator为Equal:Value必须相同(如
key: "dedicated", operator: "Equal", value: "special", effect: "NoSchedule"
)。 - Operator为Exists:忽略Value(如
key: "dedicated", operator: "Exists"
,表示容忍所有以dedicated
为Key的污点)。 - 空Key和Exists:匹配所有污点(如
operator: "Exists"
,表示容忍所有污点)。
- Operator为Equal:Value必须相同(如
- 特殊参数:
- tolerationSeconds:仅对
NoExecute
有效,指定Pod在节点被标记污点后继续运行的时间(超时后驱逐)。
- tolerationSeconds:仅对
与节点亲和性的对比
- 污点/容忍:通过“排斥”机制控制调度,节点设置污点,Pod声明容忍。
- 节点亲和性:通过“吸引”机制控制调度,Pod声明偏好或硬性要求,节点无需额外标记。
警戒(cordon)和转移(drain)
在 Kubernetes 中,Cordon 和 Drain 是用于节点管理的两个核心命令,分别通过“隔离”和“驱逐”机制控制 Pod 的调度与迁移,确保节点维护或故障处理时的服务连续性。
Cordon:节点隔离(阻止新 Pod 调度)
- 作用:将节点标记为 不可调度(SchedulingDisabled),阻止新 Pod 被分配到该节点,但已运行的 Pod 不受影响。
- 典型场景:
- 节点维护:升级内核、更换硬件等操作前,避免新工作负载干扰。
- 故障排查:节点异常但未完全宕机时,隔离新 Pod 以专注问题修复。
- 资源优化:临时将节点从调度池中移除,平衡集群负载。
Drain:节点驱逐(安全迁移所有 Pod)
- 作用:主动驱逐节点上的所有 Pod,并将节点标记为不可调度,确保负载平稳迁移至其他节点。
- 典型场景:
- 节点下线:替换故障节点或退役旧硬件。
- 批量维护:同时操作多个节点(如滚动升级集群)。
- 资源回收:释放节点资源以重新分配。
- 关键特性:
- Pod 驱逐策略:
- 默认忽略 DaemonSet 管理的 Pod(如日志收集器),因其与节点强绑定。
- 可通过
--force
强制驱逐所有 Pod(慎用,可能导致数据丢失)。
- 优雅终止:
- 尊重 Pod 的
terminationGracePeriodSeconds
,允许进程完成清理。 - 若 Pod 定义了 PodDisruptionBudget(PDB),Kubernetes 会检查驱逐是否违反最小可用副本数限制。
- 尊重 Pod 的
- 数据安全:
--delete-emptydir-data
:强制删除使用emptyDir
卷的 Pod(数据会丢失)。- 对于持久化卷(PV),需确保数据可跨节点访问(如云盘或分布式存储)。
- Pod 驱逐策略:
Cordon vs Drain:核心区别
特性 | Cordon | Drain |
---|---|---|
作用对象 | 节点调度状态 | 节点上的 Pod |
已运行 Pod | 不影响 | 主动驱逐 |
典型场景 | 临时隔离节点 | 节点下线或长期维护 |
数据安全 | 无影响 | 需处理 emptyDir 或本地存储 |
命令组合 | 常单独使用 | 通常与 cordon 隐式配合(drain 会自动标记节点为不可调度) |
亲和性和非亲和性
在 Kubernetes 中,亲和性(Affinity) 主要分为 节点亲和性(Node Affinity) 和 Pod 亲和性(Pod Affinity) 两大类,每类又包含 硬性要求(Required) 和 软性偏好(Preferred) 两种规则。
节点亲和性(Node Affinity)
作用:控制 Pod 调度到满足特定节点标签条件的节点。
硬性要求(Required During Scheduling Ignored During Execution)
- 规则:Pod 必须调度到满足条件的节点,否则调度失败。
- 适用场景:
- 节点必须具备特定硬件(如 GPU、SSD)。
- 节点必须运行特定软件(如特定内核版本)。
- 节点必须属于特定环境(如生产环境、测试环境)。
软性偏好(Preferred During Scheduling Ignored During Execution)
- 规则:调度器优先选择满足条件的节点,但不强制。
- 适用场景:
- 优先使用高性能节点,但允许回退到普通节点。
- 优先选择负载较低的节点。
- 优先选择与当前节点标签匹配的节点(如相同区域)。
Pod 亲和性(Pod Affinity)
作用:控制 Pod 调度到与已运行的特定 Pod 共存(或靠近)的节点。
硬性要求(Required During Scheduling Ignored During Execution)
- 规则:Pod 必须与满足条件的 Pod 运行在同一拓扑域(如节点、可用区)。
- 关键参数:
topologyKey
:定义拓扑域的范围(如kubernetes.io/hostname
表示节点级,topology.kubernetes.io/zone
表示可用区级)。
- 适用场景:
- 确保相关服务(如 Web 和缓存)共存以减少网络延迟。
- 确保数据库副本分散在不同节点以避免单点故障。
软性偏好(Preferred During Scheduling Ignored During Execution)
- 规则:调度器优先将 Pod 与满足条件的 Pod 共存,但不强制。
- 适用场景:
- 优先将 Pod 调度到与目标 Pod 相同的节点或可用区,但允许分散。
- 优化数据本地性(如计算任务靠近数据存储节点)。
亲和性规则的核心操作符
在定义亲和性条件时,可通过以下操作符匹配节点或 Pod 的标签:
In
:标签值在指定列表中。NotIn
:标签值不在指定列表中。Exists
:标签键存在(忽略值)。DoesNotExist
:标签键不存在。Gt
(仅节点亲和性):标签值为数字且大于指定值。Lt
(仅节点亲和性):标签值为数字且小于指定值。
亲和性与非亲和性的关系
- 亲和性(Affinity):通过标签匹配实现 Pod 与节点或其他 Pod 的吸引。
- 非亲和性(Anti-Affinity):通过标签匹配实现 Pod 与节点或其他 Pod 的排斥。
- 例如:Pod 非亲和性可确保同一服务的副本不运行在同一节点,提高高可用性。
关键对比与注意事项
分类 | 类型 | 规则类型 | 核心作用 |
---|---|---|---|
节点亲和性 | 硬性要求 | RequiredDuringScheduling | 强制匹配节点标签 |
软性偏好 | PreferredDuringScheduling | 优先匹配节点标签 | |
Pod 亲和性 | 硬性要求 | RequiredDuringScheduling | 强制共存于指定拓扑域 |
软性偏好 | PreferredDuringScheduling | 优先共存于指定拓扑域 |
特性 | 亲和性(Affinity) | 非亲和性(Anti-Affinity) |
---|---|---|
目的 | 吸引 Pod 共存或选择特定节点 | 排斥 Pod 共存或避开特定节点 |
类型 | 节点亲和性、Pod 亲和性 | 节点非亲和性、Pod 非亲和性 |
硬性/软性 | 支持 Required 和 Preferred | 支持 Required 和 Preferred |
拓扑域(TopologyKey) | 用于 Pod 亲和性定义共存范围 | 用于 Pod 非亲和性定义隔离范围 |
性能影响 | 复杂规则可能增加调度延迟 | 同上 |
- 亲和性:通过标签匹配实现 Pod 与节点或其他 Pod 的吸引,适用于性能优化、共存等场景。
- 非亲和性:通过标签匹配实现 Pod 与节点或其他 Pod 的排斥,适用于高可用、资源隔离等场景。
- 灵活组合:结合硬性/软性规则、拓扑键和权重,可构建复杂的调度策略,满足多样化业务需求。