K8S 之 Taints(污点)与 Tolerations(容忍)

👨‍🎓博主简介

🏅CSDN博客专家

🏅云计算领域优质创作者

🏅华为云开发者社区专家博主

🏅阿里云开发者社区专家博主

💊交流社区: 运维交流社区 欢迎大家的加入!

🐋 希望大家多多支持,我们一起进步!😄

🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 一、核心概念
    • [1.1 什么是 Taints(污点)](#1.1 什么是 Taints(污点))
    • [1.2 什么是 Tolerations(容忍)](#1.2 什么是 Tolerations(容忍))
    • [1.3 两者的关系](#1.3 两者的关系)
  • 二、污点详解
    • [2.1 污点语法格式](#2.1 污点语法格式)
    • [2.2 三种 Effect 效果](#2.2 三种 Effect 效果)
    • [2.3 常用命令](#2.3 常用命令)
    • [2.4 生产场景示例(自定义标识)](#2.4 生产场景示例(自定义标识))
  • 三、容忍详解
    • [3.1 容忍语法结构](#3.1 容忍语法结构)
    • [3.2 两种 Operator 匹配模式](#3.2 两种 Operator 匹配模式)
    • [3.3 特殊用法](#3.3 特殊用法)
  • 四、实例:开启污点,容忍启用与不启用的区别展示
    • [4.1 开启污点,不添加容忍](#4.1 开启污点,不添加容忍)
    • [4.2 开启污点,添加容忍](#4.2 开启污点,添加容忍)
  • 五、生产建议

一、核心概念

1.1 什么是 Taints(污点)

污点 是节点的"禁止调度"标签,专门用来阻止 Pod 部署到该节点上。

  • 如何判断节点有没有污点
bash 复制代码
kubectl describe node <master-node> | grep Taints

返回:
<none> 节点无污点,任何 Pod 都可调度;
node-role.kubernetes.io/master:NoSchedulenode-role.kubernetes.io/control-plane:NoSchedule 有污点,Pod 需添加对应 容忍:tolerations 或 去除污点:taints Pod才能进行调度;

  • 去除污点
bash 复制代码
# 去除 master 污点(K8s 1.23 及以下)
kubectl taint node <master-node-name> node-role.kubernetes.io/master:NoSchedule-

# 去除 control-plane 污点(K8s 1.24+)
kubectl taint node <master-node-name> node-role.kubernetes.io/control-plane:NoSchedule-
  • 恢复污点
bash 复制代码
# 重新添加 Master 污点(K8s 1.23 及以下)
kubectl taint node <master-node> node-role.kubernetes.io/master:NoSchedule

# 或 control-plane 污点(K8s 1.24+)
kubectl taint node <master-node> node-role.kubernetes.io/control-plane:NoSchedule

作用

  • 保护特定节点(如 Master)不被业务 Pod 占用
  • 标记故障节点,阻止新 Pod 调度
  • 实现专用节点(如 GPU、SSD 节点)的独占使用

1.2 什么是 Tolerations(容忍)

容忍 是 Pod 的"通行证",让 Pod 能够突破节点限制,部署到被禁止调度的节点上。

yaml 复制代码
# Pod 配置示例
spec:
tolerations: 	# 两种可同时存在
  # K8s 1.20- 推荐使用 control-plane 标签
  - key: node-role.kubernetes.io/master
    effect: NoSchedule
    operator: Exists
  # K8s 1.20+ 推荐使用 control-plane 标签
  - key: node-role.kubernetes.io/control-plane
    effect: NoSchedule
    operator: Exists

作用

  • 允许监控组件部署到 Master 节点
  • 允许特定应用使用专用硬件节点
  • 实现故障节点的临时应急调度

1.3 两者的关系

特性 Taint(污点) Toleration(容忍)
作用对象 节点 Pod
功能 排斥 Pod 突破排斥
设置方式 kubectl taint YAML spec.tolerations
类比 "禁止入内"的门禁 "特殊通行证"

核心逻辑 :污点是节点的"拒绝策略",容忍是 Pod 的"豁免凭证"。两者独立存在,但必须配对匹配 才能实现精准调度控制。
注意事项:如果污点不存在,则不需要写容忍。

二、污点详解

2.1 污点语法格式

bash 复制代码
kubectl taint node <node-name> <key>=<value>:<effect>
字段 说明 示例
key 污点标识 node-role.kubernetes.io/master
value 可选值 默认:true
effect 排斥效果 NoSchedule / PreferNoSchedule / NoExecute

2.2 三种 Effect 效果

Effect 含义 使用场景
NoSchedule 不调度新 Pod 保护 Master 节点
PreferNoSchedule 尽量不调度(软限制) 资源紧张时的偏好设置
NoExecute 不调度 + 驱逐已有 Pod 节点故障、维护下线

2.3 常用命令

  • 标准三件套:添加、查看、删除
bash 复制代码
# 1. 添加污点
kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule

# 2. 查看污点
kubectl describe node k8s-master | grep Taints
# 2.1 查看多个污点:-A数值可调节
kubectl describe node k8s-master | grep -A2 Taints

# 3. 去除污点(key:effect-)
kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-

2.4 生产场景示例(自定义标识)

bash 复制代码
# 场景1:标记 GPU 专用节点
kubectl taint node gpu-node-1 hardware=gpu:NoSchedule

# 场景2:标记节点维护中(驱逐所有 Pod)
kubectl taint node node-2 maintenance=true:NoExecute

三、容忍详解

3.1 容忍语法结构

注意:写容忍前,需查看污点值来确认容忍的内容kubectl describe node k8s-master | grep Taints

yaml 复制代码
spec:
  tolerations:
    - key: "master"              # 污点标识(必填,必须和污点key一致)
      value: "gpu"               # 污点值(operator=Equal 时必填)
      effect: "NoSchedule"       # 污点效果(operator=Equal 时必填必填,需和污点效果一致)
      operator: "Equal"          # 操作符:Equal / Exists(必填)
      # tolerationSeconds: 3600    # 容忍多久后被驱逐(仅 NoExecute)

3.2 两种 Operator 匹配模式

Operator 逻辑 适用场景
Equal key + value + effect 全匹配 精确匹配特定污点
Exists 只要 key 存在即匹配(无视 value) 兼容多版本、通用匹配

3.3 特殊用法

yaml 复制代码
# 1. 仅匹配 key,无视 effect(但建议都写上)
tolerations:
  - key: "node-role.kubernetes.io/master"
    operator: "Exists"

# 3. 设置容忍时间(NoExecute 效果下,多久后被强制驱逐)
tolerations:
  - key: "maintenance"
    value: "true"
    effect: "NoExecute"
    operator: "Equal"
    tolerationSeconds: 3600   # 1小时后自动驱逐

四、实例:开启污点,容忍启用与不启用的区别展示

使用DaemonSet方式部署Nginx服务,并展示有污点的情况下,启用容忍与不启用的区别;

  • 查看是否有污点
bash 复制代码
kubectl describe node k8s-master | grep Taints

存在污点。

4.1 开启污点,不添加容忍

  • nginx-daemonset.yaml
yaml 复制代码
apiVersion: v1
kind: Namespace
metadata: 
  name: nginx
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  namespace: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
        resources:         
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
  • 运行启动nginx服务
bash 复制代码
kubectl apply -f nginx-daemonset.yaml
  • 查看pod及运行所在节点
bash 复制代码
kubectl get pods -n nginx -o wide

可以看到并没有再k8s-master节点上跑,因为此节点开启了NoSchedule污点,所以不会再此节点上创建pod;

4.2 开启污点,添加容忍

  • nginx-daemonset.yaml
yaml 复制代码
apiVersion: v1
kind: Namespace
metadata: 
  name: nginx
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  namespace: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      tolerations:           # ← 添加容忍度,可以添加多个容忍
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
          operator: Exists
        - key: node-role.kubernetes.io/control-plane
          effect: NoSchedule
          operator: Exists
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80
        resources:         
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
  • 先删除刚刚创建的pod
bash 复制代码
kubectl delete -f nginx-daemonset.yaml
  • 运行启动nginx服务
bash 复制代码
kubectl apply -f nginx-daemonset.yaml
  • 查看pod及运行所在节点
bash 复制代码
kubectl get pods -n nginx -o wide

可以看到k8s-master节点上也跑起来了,共3个节点都跑起来了;

五、生产建议

  1. Master 节点保持污点,仅在必要 DaemonSet(监控、日志)中添加容忍
  2. 专用节点采用 "标签+污点" 双机制:标签用于定向调度,污点用于隔离保护
  3. NoExecute 慎用 ,设置 tolerationSeconds 避免业务长时间挂起
  4. 版本兼容 :K8s 1.24+ 使用 control-plane 替代 master,建议两者同时容忍
相关推荐
Sinclair10 分钟前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
AI攻城狮13 分钟前
RAG Chunking 为什么这么难?5 大挑战 + 最佳实践指南
人工智能·云原生·aigc
叶落阁主20 分钟前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
可观测性用观测云1 天前
云原生网关 Ingress-Nginx 链路追踪实战:OpenTelemetry 采集与观测云集成方案
nginx·kubernetes
甲鱼9291 天前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
哈里谢顿2 天前
Kubernetes Operator核心概念、实现原理和实战开发
云原生
阿里云云原生2 天前
你的 OpenClaw 真的在受控运行吗?
云原生
阿里云云原生2 天前
5 分钟零代码改造,让 Go 应用自动获得全链路可观测能力
云原生·go
Shanyoufusu122 天前
RKE2 单节点集群安装 Rancher+ 私有镜像仓库搭建 完整教程
云原生
阿里云云原生2 天前
Dify 官方上架 Higress 插件,轻松接入 AI 网关访问模型服务
云原生