Skip to content

污点与容忍

污点(Taints)与容忍(Tolerations)是Kubernetes调度系统中的核心机制,用于实现节点与Pod之间的"选择性匹配",为生产环境提供了精细化的调度控制能力。

如果node节点有多个污点的话,在pod中需要全部设置。

污点(Taints)

污点是节点(Node)上的属性,用于排斥不符合条件的Pod被调度到该节点。

污点组成

每个污点包含三个部分:

  • key: 污点的标识符
  • value: 污点的值
  • effect: 污点的效果,决定如何排斥Pod

污点命名规范

  1. 标准化前缀

    使用 node-role.kubernetes.io/master作为键名,这是Kubernetes社区广泛认可的命名规范

  2. 语义化值

    • reserved:表示节点为系统保留资源
    • dedicated:表示专用节点(二选一)
  3. 效果选择

    NoSchedule(生产首选)比 NoExecute更温和,允许已有Pod继续运行

污点策略

策略说明
NoSchedule不容忍该污点的Pod不会被调度到该节点
PreferNoSchedule尽量避免调度不容忍的Pod,但不是强制的
NoExecute不容忍的Pod不会被调度到该节点,且已运行的Pod会被驱逐

污点操作命令

添加污点

bash
kubectl taint nodes <node-name> <key>=<value>:<effect>
# 示例:给master01添加dedicated专用污点
kubectl taint nodes k8s-master01 dedicated=master:NoSchedule

查看污点

bash
kubectl describe nodes <node-name> | grep Taints

删除污点

bash
kubectl taint nodes <node-name> <key>[:<effect>]-
# 示例:删除master01的dedicated污点
kubectl taint nodes k8s-master01 dedicated:NoSchedule-

容忍(Tolerations)

容忍是Pod上的配置,允许(但不强制)Pod被调度到带有特定污点的节点上。

容忍字段说明

字段说明可选值
key要匹配的污点键字符串
operator匹配操作符Exists(存在即可)或Equal(值相等)
value要匹配的污点值字符串
effect要匹配的污点效果NoSchedule, PreferNoSchedule, NoExecute
tolerationSeconds仅对NoExecute有效,指定被驱逐前的等待时间秒数

容忍配置

NoSchedule

yaml
apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: demo-pod
      image: nginx
      imagePullPolicy: IfNotPresent
  # pod 容忍
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "master"
    # 污点策略
    effect: "NoSchedule"

Exists

yaml
apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: demo-pod
      image: nginx
      imagePullPolicy: IfNotPresent
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "master"
    effect: "Exists"

带延迟的NoExecute容忍

yaml
apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: demo-pod
      image: nginx
      imagePullPolicy: IfNotPresent
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "master"
    effect: "NoExecute"
    tolerationSeconds: 3600  # 1小时后才被驱逐