17、Kubernetes核心技术 - 污点(Taints)和污点容忍(Tolerations)

目录

一、概述

二、污点和污点容忍示例

2.1、NoSchedule

2.2、NoExecute

三、污点和污点容忍应用场景

四、k8s内置的一些污点


一、概述

上一篇文章介绍了节点亲和性,它主要实现的是将Pod强制或者尽可能调度到满足某些条件的node节点上【通过在Pod上添加属性,来确定Pod是否要调度到指定的节点上,k8s中的污点,它的行为刚好与节点亲和性相反,污点可以将节点和 Pod 达到互斥的效果,让Pod不被调度到存在污点的那些节点上【在Node节点上添加污点属性(Taints),来避免Pod被分配到不合适的节点上】;k8s中的污点容忍,则可以让 Pod 调度到带有污点的节点上。

  • taints(污点)

污点是定义在节点上的键值型属性数据,用于让节点拒绝将Pod 调度运行于其上,除非 Pod 有接纳节点污点的容忍度;

  • tolerations (污点容忍)

污点容忍是定义在 Pod 上的键值型属性数据,用于配置可容忍的污点,且调度器将 Pod 调度至其能容忍该节点污点的节点上或没有污点的节点上;

在k8s中,我们可以给节点添加一些污点,以便在该节点上不能调度任何 Pod,除非Pod明确定义了Tolerations,Tolerations 应用于 Pod,并允许(但不要求)Pod 调度到具有匹配污点的节点上。

可以使用命令 kubectl taint 给节点增加一个污点。比如:

kubectl taint node <node_name> key=value[effect]   示例:
# 给节点 master 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能够被分配到这个节点。
kubectl taint node master key1=value1:NoSchedule       # 设置value值

effect可选值有三个:

  • NoSchedule:表示 Pod 将不会被调度到具有该污点的节点上,注意,已经正在运行中的Pod不受影响
  • PreferNoSchedule:表示 Pod 将尽量避免调度到具有该污点的节点上,注意,已经正在运行中的Pod不受影响
  • NoExecute:表示 Pod 将不会被调度到具有该污点的节点上,同时将节点上已经存在的 Pod 进行驱逐,注意,已经正在运行中的Pod也会受影响,因节点污点变动或Pod容忍度变动而不再满足匹配规则时,Pod对象将被驱逐

可以对单个节点应用多个污点,对单个 Pod 应用多个容忍度。

二、污点和污点容忍示例

2.1、NoSchedule

NoSchedule表示 Pod 将不会被调度到具有该污点的节点上,注意,已经正在运行中的Pod不受影响。

假设当前k8s集群有两个node节点,node01和controlplane。我们先给node01节点添加一个NoSchedule类型的污点。

NoSchedule:表示 Pod 将不会被调度到具有该污点的节点上

#给节点添加污点
$ kubectl taint nodes node01 a=b:NoSchedule
node/node01 tainted#查看某个节点的污点
$ kubectl describe node node01 | grep Taints
Taints:             a=b:NoSchedule$ kubectl describe node controlplane | grep Taints
Taints:             <none>

然后我们创建一个三个副本的nginx的Pod:

vim taint-demo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx

创建三个副本的Pod:

$ kubectl apply -f taint-demo.yaml 
deployment.apps/nginx created$ kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
nginx-748c667d99-5t842   1/1     Running   0          13s   192.168.0.8   controlplane   <none>           <none>
nginx-748c667d99-dptjw   1/1     Running   0          13s   192.168.0.6   controlplane   <none>           <none>
nginx-748c667d99-gvt5s   1/1     Running   0          13s   192.168.0.7   controlplane   <none>           <none>

 我们看到,当前三个Pod都被调度到了controlplane这个节点,因为我们给node01节点设置了一个【a=b:NoSchedule】的污点,并且我们的Pod也没有配置污点容忍,所以Pod不能被调度到node01节点。

如果说我们希望Pod能调度到node01上,我们可以给Pod添加污点容忍,需要修改一下Pod的资源清单,添加tolerations污点容忍的配置:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxtolerations:  # 污点容忍- key: "a"operator: "Equal"		# operator的默认值为Equal。(如果键相同且值相同,则容忍匹配污点)value: "b"effect: "NoSchedule"

如上配置表示Pod能够容忍节点中存在【a=b:NoSchedule】这个污点,说明Pod有资格被调度到存在这个污点的node上,但是,这并不能保证这个 Pod 一定被调度到该节点,因为我们没有指定任何node affinity或者nodeSelector。修改完成后重新应用Pod 清单文件:  

$ vim taint-demo.yaml 
$ kubectl apply -f taint-demo.yaml 
deployment.apps/nginx configured$ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
nginx-6bfd64d99c-4g9v9   1/1     Running   0          6s    192.168.0.9   controlplane   <none>           <none>
nginx-6bfd64d99c-lf8qv   1/1     Running   0          12s   192.168.1.3   node01         <none>           <none>
nginx-6bfd64d99c-ttscz   1/1     Running   0          4s    192.168.1.4   node01         <none>           <none>

我们看到,当给node01添加了污点容忍后,Pod也能够正常被调度到node01上了。

若要移除上述命令所添加的污点,可以执行:

#删除污点  kubectl taint node <node名称> key:[effect]-
$ kubectl taint nodes node01 a=b:NoSchedule- 
node/node01 untainted$ kubectl describe node node01 | grep Taints
Taints:             <none>

2.2、NoExecute

NoExecute表示 Pod 将不会被调度到具有该污点的节点上,同时将节点上已经存在的 Pod 进行驱逐。

vim noexecute-taint-demo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx
$ kubectl apply -f noexecute-taint-demo.yaml 
deployment.apps/nginx created$ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
nginx-748c667d99-2s88m   1/1     Running   0          9s    192.168.1.4   node01         <none>           <none>
nginx-748c667d99-lgndm   1/1     Running   0          9s    192.168.1.3   node01         <none>           <none>
nginx-748c667d99-tj4tc   1/1     Running   0          9s    192.168.0.6   controlplane   <none>           <none>$ kubectl describe node node01 | grep Taints
Taints:             <none>
$ kubectl describe node controlplane | grep Taints
Taints:             <none>

可以看到,Pod被分别调度到两个节点上。接下来,我们给node01节点添加一个NoExecute类型的污点:

$ kubectl taint nodes node01 c=d:NoExecute
node/node01 tainted$ kubectl describe node node01 | grep Taints
Taints:             c=d:NoExecute

然后我们再查看Pod详情:

$ kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES
nginx-748c667d99-tj4tc   1/1     Running   0          2m58s   192.168.0.6   controlplane   <none>           <none>
nginx-748c667d99-tt5db   1/1     Running   0          34s     192.168.0.7   controlplane   <none>           <none>
nginx-748c667d99-v687w   1/1     Running   0          34s     192.168.0.8   controlplane   <none>           <none>

可以看到,之前调度到node01的两个Pod,已经被驱逐了,然后重新被调度到controlplane节点上。

实际上任何不容忍NoExecute污点的Pod都将被立即驱逐,而能够容忍污点的Pod 将永远不会被驱逐。但是可以指定一个可选tolerationSeconds字段,该字段指示在添加污点后Pod 将保持绑定到节点的时间。例如:

tolerations:
- key: "c"operator: "Equal"value: "d"effect: "NoExecute"tolerationSeconds: 3600  # 表示当 Pod 被驱逐时,还可以在节点上继续运行的时间(仅可以和NoExecute配合使用)

如果这个Pod 正在运行并且有一个匹配的污点被添加到该节点,那么该Pod将保持绑定到该节点 3600 秒,然后被驱逐。如果在该时间之前移除了污点,则Pod不会被驱逐。

三、污点和污点容忍应用场景

  • 1、专用节点:当想将一组节点专用于专有工作负载或特定用户时,您可以向这些节点添加一个污点,然后向它们的Pod 添加相应的容忍度。
  • 2、具有特殊硬件的节点:对于具有专用硬件的节点,我们只希望具有这些要求的Pod 在这些节点上运行。污染将帮助我们并为使用特殊硬件的Pod 添加相应的容忍度。
  • 3、基于污点的驱逐:当节点存在问题时,每个Pod可配置的驱逐行为。

四、k8s内置的一些污点

Kubernetes自1.6版本起支持使用污点自动标识问题节点,它通过节点控制器在特定条件下自动为节点添加污点信息实现。目前,内建使用的此类污点包含如下几个。

  • node.kubernetes.io/not-ready:节点进入NotReady状态时被自动添加的污点;
  • node.alpha.kubernetes.io/unreachable:节点进入NotReachable状态时被自动添加的污点;
  • node.kubernetes.io/out-of-disk:节点进入OutOfDisk状态时被自动添加的污点;
  • node.kubernetes.io/memory-pressure:节点内存资源面临压力;
  • node.kubernetes.io/disk-pressure:节点磁盘资源面临压力;
  • node.kubernetes.io/network-unavailable:节点网络不可用;

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

我们可以通过kubectl describe pod xx查看污点容忍信息,例如下面是kube-proxy的一些污点容忍配置: 

Tolerations:                 op=Existsnode.kubernetes.io/disk-pressure:NoSchedule op=Existsnode.kubernetes.io/memory-pressure:NoSchedule op=Existsnode.kubernetes.io/network-unavailable:NoSchedule op=Existsnode.kubernetes.io/not-ready:NoExecute op=Existsnode.kubernetes.io/pid-pressure:NoSchedule op=Existsnode.kubernetes.io/unreachable:NoExecute op=Existsnode.kubernetes.io/unschedulable:NoSchedule op=Exists

参考:污点和容忍度 | Kubernetes  

 

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

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

相关文章

利用Fastcgi+PHP-FPM非授权访问实现代码执行

目录 Fastcgi Record Fastcgi Type PHP-FPM&#xff08;FastCGI进程管理器&#xff09; Nginx&#xff08;IIS7&#xff09;解析漏洞 security.limit_extensions配置 漏洞演示 今天要和大家分享的是利用Fastcgi和PHP_FPM实现未授权访问实现代码执行&#xff0c;首先我们需…

mybatis-PageInterceptor-获取count值

文章目录 前言思路拦截器代码mybatis配置文件配置PageCountThreadLocalUtil 工具类代码注意后言 前言 我们反参是 VO 对象&#xff0c;通过转换后&#xff0c;并不能获取到Count&#xff0c;此时的Count值是 List 的长度&#xff0c;可自行跟下DBUG 就清楚了… 思路 通过继承…

单调栈 (Monotone-Stack) 及经典问题

单调栈 单调栈&#xff1a;不从头部出的单调队列 总结 单调队列&#xff1a;擅长维护区间【最大/最小】值&#xff0c;最小值对应单调递增队列 单调栈&#xff1a;擅长维护最近【大于/小于】关系 从左侧先入栈&#xff0c;就是维护左侧最近关系 从右侧先入栈&#xff0c;就是维…

Python解析姓名自动生成邮箱

现在很多公司都会有属于自己公司的专属邮箱。但是邮箱重复确实一个很麻烦的事情。 业务需求如下&#xff1a; 自动解析姓名为拼音姓和拼音名&#xff0c;由拼音姓和拼音名组装一个邮箱&#xff0c;如果组装的邮箱重复则需要加上数字&#xff0c;数据累计向上。from xpinyin i…

JavaScript 之 toString()方法详解

一、简介 ​ 在 JavaScript 中&#xff0c;toString() 方法是很多数据类型内置的方法&#xff0c;它被用于将特定的数据类型转换为字符串。但是在不同的数据类型中的作用并非完全相同&#xff0c;下面就来详细讲解一下 toString() 方法在各种数据类型中的使用和作用。 二、详…

element-ui组件DatePicker日期选择器移动端兼容

element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…

初识MySQL

一、什么是数据库 数据库&#xff08;Database&#xff0c;简称DB&#xff09;&#xff1a;长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库”。 数据库的作用&#xff1a; 可以结构化存储大量的数据&#xff0c;方便检索和访问…

U盘如何设置密码?U盘数据该怎么加密?

U盘等移动储存设备可以存储很多重要文件&#xff0c;方便我们随时使用。为了避免数据泄露&#xff0c;我们需要加密保护U盘数据。那么&#xff0c;U盘数据该怎么加密呢&#xff1f;下面我们就来了解一下。 U盘数据加密保护的必要性 目前&#xff0c;大多数的U盘并不具备数据加…

rhino犀牛怎么导入和调整背景图?

rhino犀牛怎么导入和调整背景图&#xff1f;Rhino建模过程中经常要用到背景图&#xff0c;为了更加方便快捷&#xff0c;我们会直接导入一些图片来当做背景&#xff0c;那么Rhino犀牛如何导入和调整背景图呢&#xff0c;让我们一起来看看吧 打开犀牛软件&#xff0c;进入操作界…

oracle用户密码过期导致cron失败

有客户反馈&#xff0c;有个测试环境很久不做自动备份。登录环境查看&#xff0c;发现oracle用户过期导致&#xff0c;如下 [roothydb ~]# su - oracle Last login: Wed Jan 3 10:19:40 CST 2024 on pts/0 orcl:/home/oraclehydb> crontab -l You (oracle) are not allow…

分布式数据之复制(Replication)

1.简介 1.1简介——使用复制的目的 在分布式系统中&#xff0c;数据通常需要被分散在多台机器上&#xff0c;主要为了达到以下目的&#xff1a; 扩展性&#xff0c;数据量因读写负载巨大&#xff0c;一台机器无法承载&#xff0c;数据分散在多台机器 上可以有效地进行负载均衡…

圣诞节来临,如何用海外云手机给亚马逊店铺引流?

马上就要到圣诞节了&#xff0c;这是一年中冲刺销售量的最后一个好机会&#xff0c;对所有亚马逊卖家都十分重要。而无论是亚马逊新手卖家还是老卖家&#xff0c;要想在激烈的竞争中取胜&#xff0c;仅仅靠产品本身是不现实的&#xff0c;通过测评和社媒引流获取更多曝光和流量…

LLM Agent之再谈RAG的召回信息密度和质量

话接上文的召回多样性优化&#xff0c;多路索引的召回方案可以提供更多的潜在候选内容。但候选越多&#xff0c;如何对这些内容进行筛选和排序就变得更加重要。这一章我们唠唠召回的信息密度和质量。同样参考经典搜索和推荐框架&#xff0c;这一章对应排序重排环节&#xff0c;…

大白话说区块链和通证

1 区块链 简单地说&#xff0c;区块链其实就像是一个不可篡改的分布式数据库&#xff0c;该分布式数据库记录了一系列交易或事件。区块链运行在至少1个以上的节点上&#xff0c;每个节点都有自己的一个分布式数据库&#xff0c;也就是分布式账本。正常情况下&#xff0c;每个节…

C 练习实例19

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 程序分析&#xff1a;请参照&#xff1a;C 练习实例14。 步骤分析&#xff1a; 写一个函数判断是否是完数 找出…

软文写作三大原则与技巧,媒介盒子分享

网络技术的快速发展带来传播环境的巨变&#xff0c;软文已经成为各大企业宣传的主要形式之一。而软文广告的核心就是其文案&#xff0c;一个好的软文不仅能够传达品牌理念&#xff0c;还能吸引用户了解品牌&#xff0c;提高转化率&#xff0c;今天媒介盒子就来和大家聊聊软文写…

二叉树的直径,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题方法分析&#xff1a; 解题分析&#xff1a; 补充说明&#xff1a; 代码优化&#xff1a; 题目地址&#xff1a; 543. 二…

Minitab 20安装包下载及安装教程

Minitab 20下载链接&#xff1a;https://docs.qq.com/doc/DUmNYVGxtUnZkWUpk 1.选中下载好的安装包&#xff0c;鼠标右键解压到”Minitab 20“文件夹 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“下一步” 4.点击“下一步” 5.勾选我接受许可协议中的条…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

CEC2017(Python):七种算法(RFO、DBO、HHO、SSA、DE、GWO、OOA)求解CEC2017

一、7种算法简介 1、红狐优化算法RFO 2、蜣螂优化算法DBO 3、哈里斯鹰优化算法HHO 4、麻雀搜索算法SSA 5、差分进化算法DE 6、灰狼优化算法GWO 7、鱼鹰优化算法OOA 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &…