k8s-高级调度(二)

目录

Taint(污点)与Toleration(容忍)

Taint(污点):节点的排斥标记

Toleration(容忍):Pod的适配声明

与节点亲和性的对比

警戒(cordon)和转移(drain)

[Cordon:节点隔离(阻止新 Pod 调度)](#Cordon:节点隔离(阻止新 Pod 调度))

[Drain:节点驱逐(安全迁移所有 Pod)](#Drain:节点驱逐(安全迁移所有 Pod))

[Cordon vs Drain:核心区别](#Cordon vs Drain:核心区别)

亲和性和非亲和性

[节点亲和性(Node Affinity)](#节点亲和性(Node Affinity))

[硬性要求(Required During Scheduling Ignored During Execution)](#硬性要求(Required During Scheduling Ignored During Execution))

[软性偏好(Preferred During Scheduling Ignored During Execution)](#软性偏好(Preferred During Scheduling Ignored During Execution))

[Pod 亲和性(Pod Affinity)](#Pod 亲和性(Pod Affinity))

[硬性要求(Required During Scheduling Ignored During Execution)](#硬性要求(Required During Scheduling Ignored During Execution))

[软性偏好(Preferred 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。

Toleration(容忍):Pod的适配声明

  • 作用:Toleration是Pod级别的属性,声明Pod可以容忍哪些节点的污点,从而允许调度到这些节点。
  • 匹配规则 :Toleration需与节点的Taint在KeyEffect 上完全一致,且满足以下条件之一:
    • Operator为Equal :Value必须相同(如key: "dedicated", operator: "Equal", value: "special", effect: "NoSchedule")。
    • Operator为Exists :忽略Value(如key: "dedicated", operator: "Exists",表示容忍所有以dedicated为Key的污点)。
    • 空Key和Exists :匹配所有污点(如operator: "Exists",表示容忍所有污点)。
  • 特殊参数
    • tolerationSeconds :仅对NoExecute有效,指定Pod在节点被标记污点后继续运行的时间(超时后驱逐)。

与节点亲和性的对比

  • 污点/容忍:通过"排斥"机制控制调度,节点设置污点,Pod声明容忍。
  • 节点亲和性:通过"吸引"机制控制调度,Pod声明偏好或硬性要求,节点无需额外标记。

警戒(cordon)和转移(drain)

在 Kubernetes 中,CordonDrain 是用于节点管理的两个核心命令,分别通过"隔离"和"驱逐"机制控制 Pod 的调度与迁移,确保节点维护或故障处理时的服务连续性。

Cordon:节点隔离(阻止新 Pod 调度)

  • 作用 :将节点标记为 不可调度(SchedulingDisabled) ,阻止新 Pod 被分配到该节点,但已运行的 Pod 不受影响
  • 典型场景
    • 节点维护:升级内核、更换硬件等操作前,避免新工作负载干扰。
    • 故障排查:节点异常但未完全宕机时,隔离新 Pod 以专注问题修复。
    • 资源优化:临时将节点从调度池中移除,平衡集群负载。

Drain:节点驱逐(安全迁移所有 Pod)

  • 作用主动驱逐节点上的所有 Pod,并将节点标记为不可调度,确保负载平稳迁移至其他节点。
  • 典型场景
    • 节点下线:替换故障节点或退役旧硬件。
    • 批量维护:同时操作多个节点(如滚动升级集群)。
    • 资源回收:释放节点资源以重新分配。
  • 关键特性
    • Pod 驱逐策略
      • 默认忽略 DaemonSet 管理的 Pod(如日志收集器),因其与节点强绑定。
      • 可通过 --force 强制驱逐所有 Pod(慎用,可能导致数据丢失)。
    • 优雅终止
      • 尊重 Pod 的 terminationGracePeriodSeconds,允许进程完成清理。
      • 若 Pod 定义了 PodDisruptionBudget(PDB),Kubernetes 会检查驱逐是否违反最小可用副本数限制。
    • 数据安全
      • --delete-emptydir-data:强制删除使用 emptyDir 卷的 Pod(数据会丢失)。
      • 对于持久化卷(PV),需确保数据可跨节点访问(如云盘或分布式存储)。

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 的排斥,适用于高可用、资源隔离等场景。
  • 灵活组合:结合硬性/软性规则、拓扑键和权重,可构建复杂的调度策略,满足多样化业务需求。
相关推荐
x,,xx1113 小时前
近期学习总结
运维·docker·容器
i小溪3 小时前
如何通过docker容器反查容器和宿主机的挂载目录?
docker·容器
Spring-wind4 小时前
【docker】将本地镜像打包部署到服务器上
服务器·docker·容器
老兵发新帖4 小时前
Traefik 中实现流量治理3种方式和场景选择
云原生
David爱编程7 小时前
Kubernetes ConfigMap 与 Secret 完全解读:配置管理的正确打开方式
云原生·容器·kubernetes
IT成长日记11 小时前
【Docker基础】Dockerfile多阶段构建:Multi-stage Builds详解
运维·docker·容器·multi-stage·builds
BUTCHER517 小时前
Docker镜像使用
java·docker·容器
一只 Lemon17 小时前
K8s存储系统(通俗易懂版)
云原生·容器·kubernetes
澜兮子18 小时前
k8s-高级调度(一)
云原生·容器·kubernetes