Kubernetes资源调度之污点与Pod容忍度

news2025/2/24 15:22:01

Kubernetes资源调度之污点与Pod容忍度

概述

污点是定义在节点之上的键值型属性数据,用于让节点有能力主动拒绝调度器将Pod调度运行到节点上,除非该Pod对象具有接纳节点污点的容忍度。容忍度(tolerations)则是定义在Pod对象上的键值型属性数据,用于配置该Pod可容忍的节点污点,否则该 Taints 节点不会被调度 Pod。

image-20220628160942866

我们知道,节点选择器(nodeSelector)和节点亲和性(nodeAffinity)两种调度方式都是通过在Pod对象上添加标签选择器来完成对特定类型节点标签的匹配,从而完成节点选择和绑定,节点亲和调度使得Pod对象被吸引到一类特定的节点,而污点的作用则相反,它为节点提供了排斥特定Pod对象的能力。

比如用户希望把 Master 节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 Pod,则污点就很有用了,Pod 不会再被调度到 taint 标记过的节点。我们使用 kubeadm 搭建的集群默认就给 master 节点添加了一个污点标记,所以我们看到我们平时的 Pod 都没有被调度到 master 上去:

[root@k8s-01 ~]#  kubectl describe node k8s-01
Name:               k8s-01
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master1
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
......
Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false
......

其中有一条关于 Taints 的信息:node-role.kubernetes.io/master:NoSchedule,就表示master 节点打了一个污点的标记,其中影响的参数是 NoSchedule,表示 Pod 不会被调度到标记为 taints 的节点,效用标识主要有以下3种类型。

  • NoSchedule:不能容忍此污点的Pod对象不可调度至当前节点,属于强制型约束关系,但添加污点对节点上现存的Pod对象不产生影响。

  • PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去;添加该类效用的污点同样对节点上现存的Pod对象不产生影响。

  • NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 Pod 没有对应容忍(Tolerate)设置,则会直接被逐出

定义删除污点

任何符合键值规范要求的字符串均可用于定义污点信息:可使用字母、数字、连接符、点号和下划线,且仅能以字母或数字开头,其中键名的长度上限为253个字符,值最长为63个字符。实践中,污点通常用于描述具体的部署规划,它们的键名形如node-type、node-role、node-project或node-geo等,而且一般还会在必要时带上域名以描述一些额外信息,例如node-type.ilinux.io等。kubectl taint命令可用于管理Node对象的污点信息,污点 taint 标记节点的命令如下:

[root@k8s-01 ~]# kubectl taint nodes k8s-02 test=node2:NoSchedule
node/k8s-02 tainted
[root@k8s-01 ~]#

删除污点,指定key和value,则具体删除这一个污点:

[root@k8s-01 ~]# kubectl taint nodes k8s-02 test=node2:NoSchedule-
node/k8s-02 untainted
[root@k8s-01 ~]#

如果只指定具体的key,则删除该key下的所有污点:

[root@k8s-01 ~]# kubectl taint nodes k8s-02 test=node2:NoSchedule
node/k8s-02 tainted
[root@k8s-01 ~]# kubectl taint nodes k8s-02 test=node3:NoExecute
node/k8s-02 tainted

image-20220628172936438

[root@k8s-01 ~]# kubectl taint nodes k8s-02 test-
node/k8s-02 untainted
[root@k8s-01 ~]#

image-20220628173113671

定义容忍度

Pod对象的容忍度通过其spec.tolerations字段添加,根据使用的操作符不同,主要有两种可用形式:一种是与污点信息完全匹配的等值关系;另一种是判断污点信息存在性的匹配方式,它们分别使用Equal和Exists操作符表示。下面容忍度的定义示例使用了Equal操作符,其中tolerationSeconds用于定义延迟驱逐当前Pod对象的时长。

查看官方说明:

[root@k8s-01 ~]# kubectl explain deploy.spec.template.spec.tolerations
KIND:     Deployment
VERSION:  apps/v1

RESOURCE: tolerations <[]Object>

DESCRIPTION:
     If specified, the pod's tolerations.

     The pod this Toleration is attached to tolerates any taint that matches the
     triple <key,value,effect> using the matching operator <operator>.

FIELDS:
   effect       <string>
     Effect indicates the taint effect to match. Empty means match all taint
     effects. When specified, allowed values are NoSchedule, PreferNoSchedule
     and NoExecute.

   key  <string>
     Key is the taint key that the toleration applies to. Empty means match all
     taint keys. If the key is empty, operator must be Exists; this combination
     means to match all values and all keys.

   operator     <string>
     Operator represents a key's relationship to the value. Valid operators are
     Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for
     value, so that a pod can tolerate all taints of a particular category.

   tolerationSeconds    <integer>
     TolerationSeconds represents the period of time the toleration (which must
     be of effect NoExecute, otherwise this field is ignored) tolerates the
     taint. By default, it is not set, which means tolerate the taint forever
     (do not evict). Zero and negative values will be treated as 0 (evict
     immediately) by the system.

   value        <string>
     Value is the taint value the toleration matches to. If the operator is
     Exists, the value should be empty, otherwise just a regular string.

[root@k8s-01 ~]#

operator 的默认值是 Equal

一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果,并且:

  • 如果 operatorExists (此时容忍度不能指定 value),如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key 、value 和 effect 都匹配,即这个容忍度能容忍任意 taint。
  • 如果 operatorEqual ,则它们的 value 应该相等
  • 空的 effect 匹配所有的 effect
apiVersion: apps/v1
kind: Deployment
metadata:
  name: taint
  labels:
    app: taint
spec:
  replicas: 20
  selector:
    matchLabels:
      app: taint
  template:
    metadata:
      labels:
        app: taint
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
      tolerations:
      - key: "test"
        operator: "Exists"
        effect: "NoSchedule"

由于node2节点被标记为了污点,所以我们这里要想 Pod 能够调度到改节点去,就需要增加容忍的声明:

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

然后创建上面的资源,查看结果:

image-20220628175401381

如果将key改成test2,则没有pod运行在02节点

image-20220628175428113

k8s内置污点

当某种条件为真时,节点控制器会自动给节点添加一个污点。当前内置的污点包括:

  • node.kubernetes.io/not-ready:节点未准备好。这相当于节点状态 Ready 的值为 "False"。
  • node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状态 Ready 的值为 "Unknown"。
  • node.kubernetes.io/memory-pressure:节点存在内存压力。
  • node.kubernetes.io/disk-pressure:节点存在磁盘压力。
  • node.kubernetes.io/pid-pressure: 节点的 PID 压力。
  • node.kubernetes.io/network-unavailable:节点网络不可用。
  • node.kubernetes.io/unschedulable: 节点不可调度。
  • node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个 "外部" 云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。

不过,Kubernetes的核心组件通常都要容忍此类的污点,以确保相应的DaemonSet控制器能够无视此类污点在节点上部署相应的关键Pod对象,例如kube-proxy或kube-flannel等。

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

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

相关文章

WAVE SUMMIT+2022明日开场,六大看点不容错过!

在2022年最后一个乐章奏响之前&#xff0c;WAVE SUMMIT第八届峰会将率先拉开帷幕。11月30日&#xff0c;由深度学习技术及应用国家工程研究中心主办、百度飞桨承办的WAVE SUMMIT2022深度学习开发者峰会将以网上直播的方式呈现。明日14点&#xff0c;冬日AI盛会WAVE SUMMIT2022将…

.Net 7 Native AOT 单文件 无依赖 跨平台

2022.11.18 Native AOT 正式发布&#xff0c;不再是 实验性项目。 .Net 7 Console App & WebApi 使用PublishAOT true&#xff0c;直接编译 成exe&#xff0c;无rutime依赖&#xff0c;智能裁剪&#xff0c;体积小&#xff0c;启动快。 环境&#xff1a; 1.更新VS2022 …

安科瑞智能余压监控系统余压控制器ARPM-C 监控余压值/接收报警信息

1、概述 ARPM-C型余压控制器&#xff0c;可监控所连接余压探测器的余压值&#xff0c;接收余压探测器的报警信息&#xff0c;并向余压监控器反馈现场工作状态&#xff0c;当余压过高报警时联动风阀执行器调节泄压阀&#xff0c;能够持续调节泄压阀的开启角度。 2、产品型号 …

Java JUC并发容器之BlockingQueue的多种实现详解

Java JUC并发容器之BlockingQueue的多种实现详解 文章目录Java JUC并发容器之BlockingQueue的多种实现详解BlockingQueueArrayBlockingQueueLinkedBlockingQueueLinkedBlockingQueue和ArrayBlockingQueue的差异PriorityBlockingQueueDelayQueueSynchronousQueueBlockingQueue …

首次公开,GitHub点击破百万的分布式高可用算法小册被我扒下来了

想成为分布式高手&#xff1f;那就先把协议和算法烂熟于心吧&#xff01;这就不得不提到著名的——《分布式高可用算法》&#xff01; 目前网上还没有开源版本&#xff0c;今天我就当一次“互联网雷锋” &#xff0c;免费获取方式我放在文末了 作者介绍 江峰&#xff0c;教授…

用R对Twitter用户的编程语言语义分析

Twitter是一个流行的社交网络&#xff0c;这里有大量的数据等着我们分析。Twitter R包是对twitter数据进行文本挖掘的好工具。最近我们被客户要求撰写关于Twitter的研究报告&#xff0c;包括一些图形和统计输出。本文是关于如何使用Twitter R包获取twitter数据并将其导入R&…

linux /usr/lib/共享库为何几乎都有链接(像是快捷方式)?

linux 共享库为什么要建立那么多link QT建立的共享库&#xff0c;输出的时候会有三个链接文件&#xff0c;有疑惑为什么要这么多文件呢&#xff1f;是什么规则考虑的&#xff1f; 可能这么做有好处&#xff0c;就是可以随时切换库的版本吧。 Linux下软链接的使用技巧 - 腾讯云…

Nodejs -- Express的安装和定义get、post方法

文章目录Express的基本使用1 安装2 基本使用3 监听GET请求4 监听POST请求5 把内容响应给客户端6 获取URL中携带的查询参数7 获取URL中的动态参数Express的基本使用 1 安装 在项目所处的目录中&#xff0c;运行如下的终端命令&#xff0c;即可将express安装到项目中使用&#…

【问题思考】二重积分积分限上的x和积分内部的x有什么区别?【几何直观】

问题 在做这个积分的时候&#xff0c;产生了一个疑问&#xff0c;就是这个积分中&#xff0c;第一次积分能将x视为常数已经成为一个下意识的动作了&#xff0c;然而&#xff0c;是否能够真的将积分中的x看作常数&#xff1f;而这个积分限上也有一个x&#xff0c;这个积分限上的…

【java|golang】1758. 生成交替二进制字符串的最少操作数

给你一个仅由字符 ‘0’ 和 ‘1’ 组成的字符串 s 。一步操作中&#xff0c;你可以将任一 ‘0’ 变成 ‘1’ &#xff0c;或者将 ‘1’ 变成 ‘0’ 。 交替字符串 定义为&#xff1a;如果字符串中不存在相邻两个字符相等的情况&#xff0c;那么该字符串就是交替字符串。例如&a…

云边缘网关TG453

5G云边缘网关TG453&#xff0c;广泛应用于工控物联网等场景&#xff0c;具备组网、数据采集、协议解析、无线通信、远程控制能力。全网通5G网络&#xff0c;同时支持边缘计算&#xff0c;满足大接入量数据处理和及时反馈的低延时任务应用。 5G云边缘网关TG453功能 部署在本地现…

Java学习之继承练习题

目录 第一题 代码 输出流程分析 运行结果 考察知识点 第二题 代码 流程分析 运行结果 第三题 题目要求 我的代码 代码改进 第一题 代码 package com.hspedu.extends_.exercise;public class ExtendsExercise01 {public static void main(String[] args) {B b new …

Mybatis Plus 多租户id使用

本文就不多逼逼&#xff0c;直接进入正题。 什么是多租户 多租户技术&#xff08;Multi-TenancyTechnology&#xff09;又称多重租赁技术&#xff0c;简称SaaS&#xff0c;是一种软件架构技术&#xff0c;是实现如何在多用户环境下 &#xff08;此处的多用户一般是面向企业用…

SpringCloud服务配置介绍Nacos实现管理配置

目录 一、服务配置中心介绍 二、Nacos config入门 三、Nacos config深入 四、Nacos的几个概念 一、服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的…

uniapp 智能安装(自动升级)插件 Ba-SmartUpgrade

简介&#xff08;下载地址&#xff09; Ba-SmartUpgrade 是一款用于智能安装&#xff08;自动升级&#xff09;的插件&#xff0c;无需用户的任何操作就可以自动安装程序。 说明 在app升级更新&#xff0c;覆盖安装时&#xff0c;系统会弹出授权提示弹窗&#xff0c;需要用户…

两种PDF密码都忘记了,怎么办?

PDF文件的两种密码&#xff1a;打开密码、编辑限制 两种密码加密PDF文件后的效果是不一样的&#xff1a; 设置了打开密码的PDF文件&#xff0c;是在打开文件的时候需要输入密码&#xff0c;输入了正确的PDF密码&#xff0c;进入到文件之后&#xff0c;就一些都正常了&#xf…

Pr:编辑字幕

对于添加好的字幕&#xff0c;可在文本面板中的“字幕”选项卡、时间轴面板或节目面板上进行编辑。需要时&#xff0c;可在基本图形面板中改变字幕的样式。“字幕”选项卡中显示了当前活动字幕轨道上的各个字幕分段的编号、时间码范围、文本内容等。单击左下角的“ABC”按钮可改…

Word文档的两种密码忘记了,怎么办?

Word文档的密码也有两种&#xff1a;一种是打开密码&#xff0c;一种是编辑限制 两种密码加密后的效果也是不一样的&#xff1a; 设置了打开密码的Word文档&#xff0c;是在打开文件的时候需要输入密码&#xff0c;保护文件内容不被其他人看到。当我们输入了正确的Word密码&a…

【元胞自动机】元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】

⛄一、元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 何顿 康威设计了一个电脑游戏 “生命游戏” 后, 元胞自动机才吸引了科学家们的注意. 1983 年…

第一个maven项目(idea)

配置Maven 确保idea与你要使用的maven版本不冲突&#xff0c;否则使用idea内置即可。 手工创建Java项目 在test目录下&#xff0c;新建resources&#xff0c;如果不是测试资源根&#xff0c;右键将目录标记为&#xff1a; 原型创建Java项目 原型创建Web项目 插件 配置tomcat插…