目录

一、Pod 调度核心概述

二、基础调度方式

1. nodeSelector:基于标签的简单调度

2. nodeName:直接指定节点调度

三、进阶调度:节点亲和性(Affinity)

1. requiredDuringSchedulingIgnoredDuringExecution(强制亲和)

2. preferredDuringSchedulingIgnoredDuringExecution(优先亲和)

四、污点与容忍度(Taint & Toleration)

容忍度配置示例

五、问答题


一、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 的强制约束,但支持更复杂的表达式(如 InNotIn 等)

示例配置

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。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐