首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes 的高级调度方法,收藏

Kubernetes 的高级调度方法,收藏

作者头像
用户11081884
发布2026-07-20 20:09:46
发布2026-07-20 20:09:46
370
举报

Kubernetes 集群中调度器(Scheduler)负责将 Pod 分配到合适的节点上运行。除了默认的调度策略外,Kubernetes 还提供了一系列高级调度机制,允许根据业务需求对 Pod 的部署位置进行精细化控制。本文将详细介绍这些高级调度方法的使用说明、适用场景,并提供相应的代码示例。

一、 节点选择器 (NodeSelector)

使用说明:

节点选择器是控制 Pod 调度位置的最直接方式。通过在 Podspec.nodeSelector 字段中指定键值对,Pod 只会被调度到拥有匹配标签的节点上。这是一种“硬性”要求,如果没有节点满足条件,Pod 将处于 Pending 状态。

场景:

适用于需要将 Pod 固定部署到具有特定硬件(如 GPU、SSD)、特定软件环境或特定网络区域的节点上的场景。

代码示例:

1、为节点添加标签:

代码语言:javascript
复制
kubectl label nodes node01 disktype=ssd zone=us-west

2、在 Pod 定义中使用 NodeSelector:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-ssd
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    disktype: ssd
    zone: us-west

Pod 将只会被调度到同时拥有 disktype=ssdzone=us-west 标签的节点。

二、 亲和性与反亲和性调度 (Affinity / Anti-Affinity)

亲和性调度提供了比 NodeSelector 更强大、更灵活的规则,包括“软性”偏好和“硬性”要求,并且可以基于节点或 Pod 的标签进行决策。

2.1 节点亲和性 (NodeAffinity)

使用说明:

节点亲和性允许你定义 Pod 对节点标签的偏好。它分为两类:

  • requiredDuringSchedulingIgnoredDuringExecution(硬亲和):必须满足的条件,否则 Pod 无法调度。
  • preferredDuringSchedulingIgnoredDuringExecution(软亲和):优先满足的条件,但不强制。调度器会尝试满足,但不保证。

场景:

  • 硬亲和:Pod 必须运行在特定硬件类型(如内存 > 32Gi)或特定可用区(zone)的节点上。
  • 软亲和:Pod 最好运行在 SSD 存储节点上,但如果资源不足,也可以调度到普通节点。

代码示例:

1、硬亲和性示例:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-hard-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
          - key: memory-size
            operator: Gt
            values:
            - "16"

此 Pod 必须调度到标签 disktype 值为 ssd memory-size 值大于 “16” 的节点上。

2、软亲和性示例:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx-soft-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 80
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
      - weight: 20
        preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - us-west

调度器会优先选择有 disktype=ssd 标签的节点(权重80),其次选择有 zone=us-west 标签的节点(权重20)。

2.2 Pod 亲和性与反亲和性 (PodAffinity / PodAntiAffinity)

使用说明:

Pod 亲和性/反亲和性定义了 Pod 之间部署位置的相互关系。

  • PodAffinity:倾向于将 Pod 部署在一起(例如,前端应用和它的缓存服务)。
  • PodAntiAffinity:倾向于将 Pod 分散部署(例如,同一个应用的不同副本,以实现高可用)。

规则通过 labelSelector 选择目标 Pod,并通过 topologyKey 定义“拓扑域”(即,在哪个范围内判定“在一起”或“不在一起”)。常见的 topologyKey 有:

  • kubernetes.io/hostname :节点级别。
  • topology.kubernetes.io/zone :可用区级别。
  • topology.kubernetes.io/region :地域级别。

场景:

  • PodAffinity:数据库和其客户端需要低延迟通信,应部署在同一可用区。
  • PodAntiAffinity:一个 Deployment 的多个副本应分散在不同节点或不同可用区,避免单点故障。

代码示例:

1、Pod 反亲和性(硬性)示例:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web
            topologyKey: kubernetes.io/hostname

此 Deployment 的 3 个 Pod 绝对不能被调度到同一个节点上( topologyKey: kubernetes.io/hostname ),确保了节点级别的高可用性。

2、Pod 亲和性(软性)示例:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: analytics-pod
spec:
  containers:
  - name: analytics
    image: analytics:latest
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - web
          topologyKey: topology.kubernetes.io/zone

此 analytics-pod 优先调度到与带有 app=web 标签的 Pod 同一个可用区的节点上。

三、 污点与容忍度 (Taints and Tolerations)

使用说明:

污点和容忍度提供了一种“节点排斥 Pod”的机制。

  • 污点 (Taint):定义在节点上。它像一个“告示牌”,标明此节点有特殊属性,并规定不能容忍此污点的 Pod 不得调度上来。
  • 容忍度 (Toleration):定义在Pod上。它表明 Pod 能够“忍受”哪些污点,从而可以被调度到拥有对应污点的节点上。

污点包含三个部分: key=value:effect 。

  • effect 定义了行为:
  • NoSchedule :新 Pod 若不容忍,则不能调度到此节点。不影响已存在的 Pod
  • PreferNoSchedule :调度器尽量避免将 Pod 调度到此节点,非强制。
  • NoExecute :不仅新 Pod 不能调度,已存在但不容忍此污点的 Pod 也会被驱逐

场景:

  • 专用节点:为特定用户组或特定服务(如机器学习训练)预留节点。
  • 有问题的节点:给即将维护或出现硬件问题的节点打上 NoExecute 污点,安全地驱逐其上的 Pod。
  • 边缘节点:将需要公网访问的 Pod 调度到特定的“边缘”节点。

代码示例:

1、为节点添加污点:

代码语言:javascript
复制
# 添加一个污点,键为 `special`,值为 `gpu`,效果为 `NoSchedule`
kubectl taint nodes node01 special=gpu:NoSchedule

2、在 Pod 中定义容忍度:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
  - name: cuda-app
    image: nvidia/cuda:latest
  tolerations:
  - key: "special"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

只有定义了此容忍度的 Pod 才能被调度到 node01 上。

3、删除污点:

代码语言:javascript
复制
kubectl taint nodes node01 special-

Kubernetes 的高级调度机制构成了一个强大而精细的控制平面,使部署能够满足复杂的业务需求:

  • NodeSelector 提供简单直接的节点绑定。
  • 亲和性/反亲和性 通过灵活的规则,实现了基于标签的“吸引”与“排斥”,优化了应用性能(亲和)与可用性(反亲和)。
  • 污点与容忍度 实现了节点的“隔离”与“专用化”,是保障集群稳定性和实现特殊任务调度的关键。

在实际生产环境中,这些策略常常组合使用。例如,一个高可用的 Web 服务可能同时使用 PodAntiAffinity 确保副本分散,使用 NodeAffinity 优先选择高性能节点,并通过容忍度允许自己运行在部分被标记为专用的节点上,从而在性能、可用性和资源利用之间取得最佳平衡。

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 节点选择器 (NodeSelector)
  • 二、 亲和性与反亲和性调度 (Affinity / Anti-Affinity)
    • 2.1 节点亲和性 (NodeAffinity)
    • 2.2 Pod 亲和性与反亲和性 (PodAffinity / PodAntiAffinity)
  • 三、 污点与容忍度 (Taints and Tolerations)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档