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

news2024/11/23 11:44:07

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-type
    value: GPU
    effect: 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: nginx
    image: nginx
  tolerations:
  - key: hardware-type
    operator: Equal
    value: GPU
    effect: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

highcharts 3D环形饼图

1.下载安装highcharts npm install highcharts --save2.在页面引入 import highcharts from highcharts3.在main.js引入 import highcharts from highcharts import highcharts3d from highcharts/highcharts-3d highcharts3d(highcharts)4.html部分代码 <div class"…

时间复杂度为 O(nlogn) 的排序算法

归并排序 归并排序遵循 分治 的思想&#xff1a;将原问题分解为几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题&#xff0c;然后合并这些子问题的解来建立原问题的解&#xff0c;归并排序的步骤如下&#xff1a; 划分&#xff1a;分解待排序的 n 个元素…

v-bind动态改变样式

通过v-bind切换样式&#xff0c;:class"{ active:true}"为true展示样式&#xff0c;false不展示。也可以由:style"{ width:percent %}"动态控制宽度。 注意后面是JS对象&#xff0c;所以后面的值不可以包含-&#xff0c;比如background-color会解析出错&a…

报修软件在企业管理中有哪些作用?有什么好用的设备质量管理软件?

在当今的信息化时代&#xff0c;企业需要不断加速自身的信息化建设&#xff0c;以适应日益激烈的市场竞争。在这个过程中&#xff0c;“的修”报修软件的引入对于企业设备报修与维护的管理显得尤为重要。本文将详细介绍报修软件的重要性以及其如何帮助企业实现更高效、更智能的…

毕业论文问卷分析思路

很多同学会通过收集问卷的方式获取论文研究需要的数据&#xff0c;但是收集到的问卷应该如何分析呢&#xff1f;问卷一般可以分为两类&#xff1a;非量表类与量表类问卷。不同类型的问卷有不同的分析思路&#xff0c;今天和大家探讨一下拿到一份问卷后&#xff0c;一般的分析思…

Day 15 python学习笔记

__str__ 用print打印对象时&#xff0c;会自动调用 class Test:def __init__(self,name):self.name name# 用print打印对象时&#xff0c;会自动调用def __str__(self):return f"姓名name的值是{self.name}"a Test("zhangsan") print(a)结果&#xff1…

40+专家齐聚共谋数据未来,StarRocks Summit 2023 议程公布!更多精彩议题等你探索...

数字经济时代&#xff0c;什么才是企业的核心竞争力&#xff1f; 答案是数据。 在过去的一年里&#xff0c;越来越多的企业率先行动起来&#xff0c;加入这场数智化的进程中&#xff0c;探寻最佳的底层数据架构模式和极致的数据分析方案。 作为数据进化的亲历者&#xff0c;Sta…

软考_软件设计师

算法&#xff1a; 1、直接插入排序 详解&#xff1a;https://blog.csdn.net/qq_44616044/article/details/115708056 void insertSort(int data[],int n){int i,j,temp;for(i1;i<n;i){if(data[i]<data[i-1]){temp data[i];data[i] data[i-1];for(ji-1;j>0&&am…

OPPO Find N3,解码“新商务场景”

2023行至尾声&#xff0c;这一年消费电子市场的整体表现&#xff0c;很难被评价为乐观。智能手机等大宗产品的需求疲软&#xff0c;技术越来越同质化&#xff0c;产品越来越成熟&#xff0c;出货量下行。国际数据公司&#xff08;IDC&#xff09;手机季度跟踪报告显示&#xff…

App测试基本流程以及注意事项

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。 1.3测试资源 测试任务开始前&#xff0c;检查…

弱覆盖栅格图层制作

栅格边界生成及图层制作 栅格边界polygon生成 提取的弱覆盖栅格数据中包含了栅格中心经度和栅格中心维度&#xff0c;我们根据栅格中心经纬度生成对应的栅格边界POLYGON&#xff08;20米*40米&#xff09; 计算公式&#xff1a;polygon(栅格中心经度-0.00017 栅格中心纬度0.00…

大数据之LibrA数据库系统告警处理(ALM-12004 OLdap资源异常)

告警解释 当Manager中的Ldap资源异常时&#xff0c;系统产生此告警。 当Manager中的Ldap资源恢复&#xff0c;且告警处理完成时&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 Ldap资源异常&#xff0c;Manager和组件WebUI认证服务不可用&#xff0c;无法对Web上层…

Syntax Error: TypeError: this.getOptions is not a function的解决(Vue)

报错信息&#xff1a; TypeError: this.getOptions is not a function 这个是在运行项目是遇到的问题 这个报错是类型错误&#xff0c;this.getOptions 不是一个函数 。这个错误一般就是less-loader库里的错误。 主要是less-loader版本太高&#xff0c;不兼容this.getOptions…

WPF自定义控件库之Window窗口

在WPF开发中&#xff0c;默认控件的样式常常无法满足实际的应用需求&#xff0c;我们通常都会采用引入第三方控件库的方式来美化UI&#xff0c;使得应用软件的设计风格更加统一。常用的WPF的UI控件库主要有以下几种&#xff0c;如&#xff1a;Modern UI for WPF&#xff0c;Mat…

IDEA配置类、方法注释模板

一、打开 IDEA 的 Settings&#xff0c;点击 Editor–>File and Code Templates&#xff0c;点击右边 File 选项卡下面的 Class&#xff0c;在其中添加图中红框内的内容&#xff1a; /** * author li-kun * date ${YEAR}年${MONTH}月${DAY}日 ${TIME} */当你创建一个新的类…

考试成绩这样分发

老师们&#xff0c;还在为每次繁琐的成绩查询而头痛&#xff1f;今天我就要给大家带来一个超级实用的教程&#xff0c;让你轻松解决这个问题&#xff01; 我来介绍一下这个神秘的“成绩查询页面”。别以为它很复杂&#xff0c;其实它就是一个简单的网页&#xff0c;上面会有每个…

深入探索 C++ 多态 ① - 虚函数调用链路

前言 最近翻阅侯捷先生的两本书&#xff1a;&#xff08;翻译&#xff09;《深度探索 C 对象模型》 和 《C 虚拟与多态》&#xff0c;获益良多。 要理解多态的工作原理&#xff0c;得理解这几个知识点的关系&#xff1a;虚函数、虚函数表、虚函数指针、以及对象的 内存布局。…

【骑行贝丘渔场】一场与海的邂逅,一段难忘的旅程

在这个渐凉的秋日&#xff0c;我们校长骑行队一行人骑着自行车&#xff0c;从大观公园门口出发&#xff0c;开始了一段别开生面的海滩之旅。沿途穿越草海隧道湿地公园、迎海路、海埂公园西门&#xff08;第二集合点&#xff09;、宝丰湿地公园、斗南湿地公园、蓝光城&#xff0…

代理模式代理模式

目录 1、使用场景 2、静态代理 3、动态代理 JDK动态代理 CGlib 动态代理实现 1、使用场景 使用代理模式主要有两个目的&#xff1a;一是保护目标对象&#xff0c;二是增强目标对象。 2、静态代理 NO.1 抽象接口&#xff1a;定义视频播放器接口Player public interface P…

大数据之路-日志采集

数据采集作为大数据体系中的第一环节&#xff0c;对如何全面、高性能、规范完成海量数据的采集&#xff0c;并将其传输到大数据平台。 1.浏览器的页面日志采集 1.1 页面浏览日志采集流程 页面浏览日志是最基础的互联网日志&#xff0c;其中页面浏览量&#xff08;PageView&am…