当前位置: 首页 > news >正文

Kubernetes Taint(污点) 和 Toleration(容忍)

1621349160463

Author:rab


目录

    • 前言
    • 一、Taint(污点)
      • 1.1 概述
      • 1.2 查看节点 Taint
      • 1.3 标记节点 Taint
      • 1.4 删除节点 Taint
    • 二、Toleration(容忍)


前言

Kubernetes 中的污点(Taint)和容忍(Toleration)是用于调度和管理容器工作负载的重要概念,特别是在多节点集群中。它们允许你指定哪些节点可以承载哪些 Pod,并控制 Pod 在哪些节点上可以运行。

说白了,污点就是故意给某个节点服务器上设置个污点参数,那么你就能让生成 Pod 的时候使用相应的参数去避开有污点参数的 Node 服务器。而容忍则是当资源不够用的时候,即使这个 Node 服务器上有污点,那么只要 Pod 的 yaml 配置文件中写了容忍参数,最终 Pod 还是会容忍的生成在该污点服务器上,Master 节点是默认为 NoSchedule。

一、Taint(污点)

1.1 概述

污点是一种属性,它被赋予一个 Kubernetes 节点,表示该节点有一些特定的限制或条件。节点上的污点可以阻止不具备相应容忍的 Pod 在上面运行。污点可以用于标记节点,以确保只有满足某些条件的 Pod 能够被调度到该节点上。例如,你可以为某个节点设置一个污点,要求只有具备特定标签或硬件要求的 Pod 才能在该节点上运行。

污点的一般格式如下:

key=value:effect
  • key 是污点的名称。
  • value 是与污点相关的值,通常为空字符串,表示没有特定值要求。
  • effect 可以是 NoSchedulePreferNoScheduleNoExecute
    • NoSchedule 表示禁止 Pod 被调度到有该污点的节点上(这是 K8s 集群 Master 节点默认的污点效果);
    • PreferNoSchedule 表示不鼓励调度到有该污点的节点,但如果没有其他选择,仍然可以调度;
    • NoExecute 表示已经在节点上运行的 Pod 在后续不满足污点条件时将被驱逐。

1.2 查看节点 Taint

1、首先获取节点信息

kubectl get node

image-20231031114317817

2、查看某个节点 Taint(污点)

比如我们查看 master 节点的污点情况。

kubectl describe node k8s-master# 重点关注Taints即可,如图,默认情况下master节点有污点,且为node-role.kubernetes.io/master:NoSchedule
# 这个污点的目的是防止普通的工作负载 Pod 被调度到主节点上
# 以确保主节点仅用于集群管理任务和控制面组件(如etcd、kube-scheduler、kube-controller-manager等)的运行

image-20231031114431884

我们再来看看 worker 节点的污点情况。

kubectl describe node k8s-work1# 我们会发现,默认情况下,worker节点是没有污点的(<none>)

image-20231031114647173

1.3 标记节点 Taint

1、首先给节点打标签

比如将 k8s-work1 节点标签为 GPU 的节点

kubectl label nodes k8s-work1 hardware-type=GPU

查看节点标签

kubectl get node --show-labels

image-20231031131922526

2、添加 GPU 污点

接下来,为带有 GPU 资源的节点添加 GPU 污点,以确保只有具有 GPU 容忍的 Pod 被调度到这个节点上。创建一个 GPU 污点的 YAML 文件如下:

vim nodeTaint.yml
apiVersion: v1
kind: Node
metadata:name: k8s-work1
spec:taints:- key: hardware-typevalue: GPUeffect: NoSchedule# 说明
# key:即节点标签的key
# value:即节点标签的value
# effect:污点效果(NoSchedule或PreferNoSchedule或NoExecute)

或通过命令添加污点也是一样的。

kubectl taint nodes k8s-work1 hardware-type=GPU:NoSchedule

3、创建 GPU 容忍的 Pod

现在,我们可以创建一个需要 GPU 资源的 Pod,并为它添加 GPU 容忍。

vim nodeTaintPod.yml
apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: nginximage: nginxtolerations:- key: hardware-typeoperator: Equalvalue: GPUeffect: NoSchedule

这个 YAML 文件定义了一个名为 gpu-pod 的 Pod,它包含一个容器,该容器需要 GPU 资源。然后在 tolerations 部分指定了 GPU 容忍,以匹配节点上的 GPU 污点。

创建 Pod:

kubectl apply -f nodeTaintPod.yml

现在,只有具有 GPU 容忍的 Pod 才能被调度到带有 GPU 污点的节点上,以确保 GPU 资源得到合理的分配。其他普通的 Pod 不会被调度到这个节点上。

验证:

kubectl get pod -owide

image-20231031134514676

这是一个简单的示例,演示了如何使用污点和容忍来满足特定的硬件要求。你可以根据自己的需求创建不同类型的污点和容忍来管理 Pod 的调度。

那如何将 gpu-pod 驱逐出该节点呢?包括在 work1 节点上的所有 Pod

答案:我们只需要将 work1 节点打上 NoExecute 污点即可。

此时,但凡不能容忍的 Pod 都会脱离该节点,并在其他 work 节点新起 Pod。

kubectl taint nodes k8s-work1 hardware-type=GPU:NoExecute# 如下图,原本work1节点上的Pod已经全部转移到work2节点上了

image-20231031142639966

1.4 删除节点 Taint

删除方法很简单,就是在添加污点指令的末尾加个-号即可:

kubectl taint nodes k8s-work1 hardware-type=GPU:NoExecute-

image-20231031143229732

此时该节点的污点已经被删除,那之前原本在该节点上的运行的 Pod 会恢复回来吗?答案是:不会,但是可以正常的运行其他普通 Pod 了。

二、Toleration(容忍)

容忍其实在上面我们已经提到了,这里在简单说一下。

Toleration 配置方式:

1、方式一

...
tolerations:
- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"
...

2、方式二

...
tolerations:
- key: "key"operator: "Exists"effect: "NoSchedule"

注意以下两种情况:

如果一个 Toleration 的 key 为空且 operator 为 Exists,表示这个 Toleration 与任意的 key、value 和 effect 都匹配,即这个Toleration 能容忍任意的 Taint:

...
tolerations:
- operator: "Exists"
...

如果一个 Toleration 的 effect 为空,则 key 与之相同的相匹配的 Taint 的 effect 可以是任意值:

...
tolerations:
- key: "key"operator: "Exists"
...

说明:

Kubernetes 会自动给 Pod 添加一个 key 为 node.kubernetes.io/not-ready 的 Toleration 并配置 tolerationSeconds=300,同样也会给 Pod 添加一个 key 为 node.kubernetes.io/unreachable 的 Toleration 并配置 tolerationSeconds=300,除非用户自定义 key,否则会采用这个默认设置。

如果一个使用了很多本地状态的应用程序在网络断开时,仍然希望停留在当前节点上运行一段时间,愿意等待网络恢复以避免被驱逐。在这种情况下,Pod 的 Toleration 可以这样配置:

...
tolerations:
- key: "node.alpha.kubernetes.io/unreachable"operator: "Exists"effect: "NoExecute"tolerationSeconds: 6000
...

此时,这个 Pod 就不会像普通 Pod 那样立即被驱逐,而是再等上 6000 秒才被删除(驱逐)。

—END

相关文章:

Kubernetes Taint(污点) 和 Toleration(容忍)

Author&#xff1a;rab 目录 前言一、Taint&#xff08;污点&#xff09;1.1 概述1.2 查看节点 Taint1.3 标记节点 Taint1.4 删除节点 Taint 二、Toleration&#xff08;容忍&#xff09; 前言 Kubernetes 中的污点&#xff08;Taint&#xff09;和容忍&#xff08;Toleration…...

使用cv::FileStorage时出错 Can‘t open file: yaml‘ in read mode

1. 使用说明 在做的一个c工程项目&#xff0c;想加一个配置文件&#xff0c;我发现主要有两种主流的方式&#xff0c; &#xff08;1&#xff09;opencv有cv::FileStorage这样的一个函数可以使用。 &#xff08;2&#xff09;也可以使用cpp-yaml GitHub - jbeder/yaml-cpp: …...

代码之困:那些让你苦笑不得的bug

在编写代码的过程中&#xff0c;我们常常会遇到各种各样的bug。有的时候&#xff0c;我们花费了大量的时间和精力去寻找问题的根源&#xff0c;但却找不到任何线索。然而&#xff0c;令人哭笑不得的是&#xff0c;有时候这些问题的解决方案却是如此简单&#xff0c;以至于我们不…...

【C语言初学者周冲刺计划】2.2用选择法对10个整数从小到大排序

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行结果: 4总结&#xff1a; 1解题思路&#xff1a; 首先利用一维数组和循环语句输入10个整数&#xff0c;然后利用双循环的嵌套进行比较大小&#xff0c;最后输出结果&#xff1b; 2代码如下&#xff1a; #include&…...

c++系列——智能指针

1.智能指针的使用及原理 1.1 RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用对象生命周期来控制程序资源&#xff08;如内 存、文件句柄、网络连接、互斥量等等&#xff09;的简单技术。 在对象构造时获取资源&#xff0c;接着控制对资…...

力扣日记10.30-【栈与队列篇】滑动窗口最大值

力扣日记&#xff1a;【栈与队列篇】滑动窗口最大值 日期&#xff1a;2023.10.30 参考&#xff1a;代码随想录、力扣 239. 滑动窗口最大值 题目描述 难度&#xff1a;困难 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只…...

docker与宿主机共享内存通信

docker与宿主机共享内存通信 docker中的进程要与宿主机使用共享内存通信&#xff0c;需要在启动容器的时候指定“–ipchost”选项。然后再编写相应的共享内存的程序&#xff0c;一个跑在宿主机上&#xff0c;另一个跑在docker上面。 宿主机程序准备 shm_data.h #ifndef _SH…...

A股风格因子看板 (2023.10 第13期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第13期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…...

ORB-SLAM3算法2之EuRoc、TUM和KITTI开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例2.1 纯单目的示例2.2 纯单目的轨迹评估2.3 纯双目的示例2.4 纯双目的轨迹评估2.5 单目和IMU的示例2.6 单目和IMU的轨迹评估2.7 双目和IMU的示例2.8 双目和IMU的轨迹评估2.9 前四种的评估结果对比3 …...

【蓝桥杯选拔赛真题07】C++小球自由落体 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++小球自由落体 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

期中考成绩一键私发

作为一名教师&#xff0c;期中考试后最繁忙的事情之一就是发布成绩。每个学生都希望尽快知道自己的成绩&#xff0c;而作为老师&#xff0c;我们需要一种更高效、更方便的方式来完成这项任务。今天&#xff0c;我就来给大家介绍一种成绩查询系统&#xff0c;让我们一起告别繁琐…...

idea中Run/Debug Python项目报错 Argument for @NotNull parameter ‘module‘ of ...

idea中Run/Debug Python项目报错 Argument for NotNull parameter module of ... idea中运行Python项目main.py时报错&#xff1a; Error running main: Argument for NotNull parameter module of com/intellij/openapi/roots/ModuleRootManager.getInstance must not be nu…...

计算机网络第3章-TCP协议(2)

TCP拥塞控制 TCP拥塞控制的三种方式&#xff1a; 慢启动、拥塞避免、快速恢复 慢启动 当一条TCP连接开始时&#xff0c;cwnd的值是一个很小的MSS值&#xff0c;这使得初始发送速率大约为MSS/RTT。 在慢启动状态&#xff0c;cwnd的值以1个MSS开始并且每当传输的报文段首次被…...

SQL注入——二次注入漏洞

文章目录 SQL注入——二次注入漏洞1. 二次注入原理2. 二次注入需要具备的两个条件3. 二次注入实例4. 总结 SQL注入——二次注入漏洞 1. 二次注入原理 在第一次插入恶意数据的时候&#xff0c;只是对其中的特殊字符进行了转义&#xff0c;在写入数据库的时候还是原来的字符&am…...

【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…...

【vue3】子传父-事件总线-mitt(子组件派发事件,父组件接收事件和传递的参数)

安装库&#xff1a;cnpm install mitt 封装 eventbus.ts&#xff1a; src->utils->eventbus.ts //eventbus.tsimport mitt from mittconst emitter mitt()export default emitter使用 B2.vue&#xff1a; //B2.vue <template><div class"aa">…...

【杂记】java 大集合进行拆分

日常中需要对一个大的集合进行拆分成多个小集合&#xff0c;其主要思路为&#xff1a; 设置需要拆分多少个小集合 A大集合里面有多少条数据 B计算出每个集合里面有多个条数据 CB/A计算出看是否存在余数 DB%A采用集合(List.subList())的方法对大集合进行拆分,循环A变进行集合拆…...

select...for update 锁表了?

在MySQL中&#xff0c;事务A中使用select...for update where id1锁住了&#xff0c;某一条数据&#xff0c;事务还没提交&#xff0c;此时&#xff0c;事务B中去用select ... where id1查询那条数据&#xff0c;会阻塞等待吗&#xff1f; select...for update在MySQL中&#…...

使用ControlNet生成视频(Pose2Pose)

目录 ControlNet 介绍 ControlNet 14种模型分别是用来做什么的 ControlNet 运行环境搭建 用到的相关模型地址 ControlNet 介绍 ControlNet 是一种用于控制扩散模型的神经网络结构&#xff0c;可以通过添加额外的条件来实现对图像生成的控制。它通过将神经网络块的权重复制到…...

基于Docker使用Minikube

1. 查看并操控Minikube状态信息 Minikube相当于docker中的一个container&#xff0c;可以在Docker Desktop中看到并操控Minikube container的相关状态&#xff1a; 通过以下命令查看当前docker中的container&#xff1a; % docker ps CONTAINER ID IMAGE …...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...