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

K8S 之 Taints(污点)与 Tolerations(容忍)
👨‍🎓博主简介

🏅ZEEKLOG博客专家
🏅云计算领域优质创作者
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗

文章目录

一、核心概念

1.1 什么是 Taints(污点)

污点是节点的"禁止调度"标签,专门用来阻止 Pod 部署到该节点上。
  • 如何判断节点有没有污点
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才能进行调度;
  • 去除污点
# 去除 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- 
  • 恢复污点
# 重新添加 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 能够突破节点限制,部署到被禁止调度的节点上。
# 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 taintYAML spec.tolerations
类比"禁止入内"的门禁“特殊通行证”
核心逻辑:污点是节点的"拒绝策略",容忍是 Pod 的"豁免凭证"。两者独立存在,但必须配对匹配才能实现精准调度控制。
注意事项:如果污点不存在,则不需要写容忍。

二、污点详解

2.1 污点语法格式

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 常用命令

  • 标准三件套:添加、查看、删除
# 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 生产场景示例(自定义标识)

# 场景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
spec:tolerations:-key:"master"# 污点标识(必填,必须和污点key一致)value:"gpu"# 污点值(operator=Equal 时必填)effect:"NoSchedule"# 污点效果(operator=Equal 时必填必填,需和污点效果一致)operator:"Equal"# 操作符:Equal / Exists(必填)# tolerationSeconds: 3600 # 容忍多久后被驱逐(仅 NoExecute)

3.2 两种 Operator 匹配模式

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

3.3 特殊用法

# 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服务,并展示有污点的情况下,启用容忍与不启用的区别;
  • 查看是否有污点
kubectl describe node k8s-master |grep Taints 

存在污点。

4.1 开启污点,不添加容忍

  • nginx-daemonset.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:truecontainers:-name: nginx image: nginx:1.24.0 ports:-containerPort:80resources:requests:cpu:"100m"memory:"128Mi"limits:cpu:"500m"memory:"256Mi"
  • 运行启动nginx服务
kubectl apply -f nginx-daemonset.yaml 
  • 查看pod及运行所在节点
kubectl get pods -n nginx -o wide 

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

4.2 开启污点,添加容忍

  • nginx-daemonset.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:truetolerations:# ← 添加容忍度,可以添加多个容忍-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:80resources:requests:cpu:"100m"memory:"128Mi"limits:cpu:"500m"memory:"256Mi"
  • 先删除刚刚创建的pod
kubectl delete -f nginx-daemonset.yaml 
  • 运行启动nginx服务
kubectl apply -f nginx-daemonset.yaml 
  • 查看pod及运行所在节点
kubectl get pods -n nginx -o wide 

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

五、生产建议

  1. Master 节点保持污点,仅在必要 DaemonSet(监控、日志)中添加容忍
  2. 专用节点采用 “标签+污点” 双机制:标签用于定向调度,污点用于隔离保护
  3. NoExecute 慎用,设置 tolerationSeconds 避免业务长时间挂起
  4. 版本兼容:K8s 1.24+ 使用 control-plane 替代 master,建议两者同时容忍

Read more

EnvPilot:一款基于 Rust 的跨平台环境变量神器,一键搞定 Windows/Linux 环境配置!

EnvPilot:一款基于 Rust 的跨平台环境变量神器,一键搞定 Windows/Linux 环境配置!

文章目录 * 1. 项目介绍🎯 * 1.1. 什么是 EnvPilot? * 1.2. 为什么选择 EnvPilot? * 2. 核心优势:四大痛点全部解决!💪 * ✅ 痛点一:添加不生效?已修复! * ✅ 痛点二:删除删不掉?已修复! * ✅ 痛点三:PATH 清理失效?已修复! * ✅ 痛点四:误操作无法恢复?已解决! * 3. 支持的开发环境🛠️ * 4. 详细使用教程📖 * 4.1. Windows 平台使用教程 * 1️⃣ 下载安装 * 2️⃣ 配置环境变量 * 3️⃣ 清除环境变量 * 4.2. Linux 平台使用教程 * 1️⃣ 从源码编译 * 2️⃣ 配置环境变量 * 3️

By Ne0inhk
Flutter for OpenHarmony:convert 高效的二进制编码解码器,轻松处理 Hex、JSON、Base64(数据格式转换) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:convert 高效的二进制编码解码器,轻松处理 Hex、JSON、Base64(数据格式转换) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在数据传输、加密解密、文件读写等底层操作中,二进制数据的转换是家常便饭。Flutter (Dart) 核心库虽然内置了 dart:convert (JSON/UTF8),但在处理十六进制 (Hex) 字符串、非常规 Base64 变体或其他编码时略显力不从心。 convert 是 Dart 官方维护的一个增强转换库,它提供了大量实用的 Codec, Converter, Sink 实现,填补了标准库在常见编码格式上的空白,尤其在处理自定义协议报文时极为便利。 一、概念介绍/原理解析 1.1 核心概念 * Codec (编解码器): 包含 Encoder 和 Decoder,如 hex 对象即为一个 Codec。

By Ne0inhk
[鸿蒙2025领航者闯关] 从零到英雄:我的鸿蒙开发技术成长与社区贡献之旅

[鸿蒙2025领航者闯关] 从零到英雄:我的鸿蒙开发技术成长与社区贡献之旅

引言 2025年,鸿蒙生态正以前所未有的速度蓬勃发展,成为万物互联时代不可或缺的操作系统底座。作为一名开发者,我有幸在这一年踏上鸿蒙开发的征程,从零基础成长为一名能够独立开发鸿蒙应用的“领航者”。在这篇技术分享文章中,我将围绕“技术实现-踩坑复盘-未来规划”三大核心模块,详细记录我在2025年度鸿蒙开发中的成长与实践。文章将结合真实的项目经历,深入剖析技术实现过程中的关键点与挑战,并分享我对鸿蒙生态的贡献与参与,展现技术能力与社区影响力的结合。 目录 一、技术实现过程:从概念到落地的鸿蒙应用开发 1.1 项目背景与技术选型 1.2 环境搭建与开发基础 1.3 核心功能实现:跨设备协同与数据同步 1.3.1 多设备数据同步 1.3.2 跨设备任务调度 1.4 UI开发与多端适配 1.5 代码片段展示:关键功能实现 1.5.1 跨设备数据同步代码示例

By Ne0inhk
网络(TCP)

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样初始化的: listen(): accept(): 理解accecpt的返回值: 饭店拉客例子 connect tcp服务器和udp类似的部分代码 把套接字设置为监听状态(listen) 测试 查看端口号和IP地址(netstat -naup) accept代码实现 成功返回一个文件描述符 sockfd是真正的服务者,sockfd_是"拉客的" 。 测试: 现在没有创建客户端,如何测试服务器呢 telnet  tcp和udp都不能绑定自己云服务器的公网IP tcp中使用的网络转主机函数 inet_ntop inet_aton  inet_pton 服务测试代码read write 写一个客户端 tcp客户端要绑定,

By Ne0inhk