目录
硬性要求(Required During Scheduling Ignored During Execution)
软性偏好(Preferred During Scheduling Ignored During Execution)
硬性要求(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 的排斥,适用于高可用、资源隔离等场景。
- 灵活组合:结合硬性/软性规则、拓扑键和权重,可构建复杂的调度策略,满足多样化业务需求。