《Kubernetes知识篇:Kubernetes之pod污点和容忍度》

2023-11-09 16:30

本文主要是介绍《Kubernetes知识篇:Kubernetes之pod污点和容忍度》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战


一、简介

Kubernetes官方文档:污点和容忍度
kubernetes污点和容忍度测试用例

Taint(污点),它使节点能够排斥一类特定的 Pod。
容忍度(Tolerations)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。


二、pod对象的排斥等级

NoSchedule
如果新创建pod没有设置容忍度的话,那么该pod不会被调度,但是不会影响之前已经调度的pod。

NoExecute
既影响调度过程,又影响现存的pod,如果已经存在的pod不能容忍节点后来加的污点,这个pod就会被驱逐。

PreferNoSchedule
尽量避免将Pod调度到具有污点的节点上,如果集群中有没有污点的节点则优先调度到干净节点,如果所有工作节点都被打上污点,则也可以正常调度到这些有污点的工作节点上。

如下图所示:
在这里插入图片描述


三、污点且无容忍度

问题一:为什么master节点的污点排斥等级为Noschedule,却有pod可以被调度呢?
在这里插入图片描述
原因:因为这些可以被调度的pod都设置了容忍度NoExecute,而NoExecute排斥等级高于Noschedule,可以向下包容的,所以可以被调度。如下所示:
在这里插入图片描述


3.1、污点之排斥等级NoSchedule

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-16增加一个污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule

在这里插入图片描述
若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 3           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:
在这里插入图片描述
结论:由于k8s-worker-16节点有污点,且没有配置pod容忍度,所以pod无法被调度到k8s-worker-16节点,而当前k8s集群工作节点只有k8s-worker-16和k8s-worker-21,所以pod全部被调度到另外一台工作节点,即k8s-worker-21节点上。

4、使用命令kubectl taint给节点k8s-worker-21增加一个污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

5、创建Deployment,观察pod调度情况

[root@k8s-client-17 yaml]# kubectl delete -f taintNoSchedule.yaml 
deployment.apps "nginx-deployment" deleted
[root@k8s-client-17 yaml]# kubectl apply -f taintNoSchedule.yaml 
deployment.apps/nginx-deployment created
[root@k8s-client-17 yaml]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-845d4d9dff-4hp4h   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
nginx-deployment-845d4d9dff-6shr8   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
nginx-deployment-845d4d9dff-fxk2s   0/1     Pending   0          5s    <none>   <none>   <none>           <none>

如下所示:
在这里插入图片描述
结论:由于k8s-worker-16节点和k8s-worker-21节点都被打上污点,且没有配置pod容忍度,所以新创建的pod无法被调度到这两个节点,而当前k8s集群工作节点只有k8s-worker-16和k8s-worker-21,无其他工作节点,所以新创建的pod无法调度到合适的节点,pod会一直处于Pending状态。

6、k8s-worker-21移除污点

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-
node/k8s-worker-21 untainted
[root@k8s-client-17 yaml]# kubectl describe node k8s-worker-21 | grep Taints 
Taints:             <none>

7、创建Deployment,观察pod调度情况
在这里插入图片描述
结论:k8s-worker-21移除污点,重新创建pod,则该pod可以正常调度到k8s-worker-21节点上。


3.2、污点之排斥等级NoExecute

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-21增加一个污点,排斥等级为NoExecute,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoExecute
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoExecute

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

#移除污点
kubectl taint node k8s-worker-21 deploy=nginx:NoExecute-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 3           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:
在这里插入图片描述
结论:k8s-worker-21工作节点被打上污点,排斥等级为NoExecute,且没有配置pod容忍度的话,会自动删除该节点上已经存在的pod。


3.3、污点之排斥等级PreferNoSchedule

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-21增加一个污点,排斥等级为NoExecute,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:PreferNoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:PreferNoSchedule

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

#移除污点
kubectl taint node k8s-worker-21 deploy=nginx:PreferNoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:
在这里插入图片描述
结论:k8s-worker-16和k8s-worker-21工作节点被打上污点,排斥等级为PreferNoSchedule,且没有配置pod容忍度的话,经观察pod可以正常调度到k8s-worker-16和k8s-worker-21工作节点上。


四、污点且有容忍度

设置了污点的node要根据taint的effect: Noscedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,pod将在一定程度上不会调度到该node上,但我们可以在pod上设置容忍(toleration),意思是设置了容忍的pod可以将容忍污点的存在,可以被调度到存在污点的node上。

tolerations:
- key: "key1"operator: "Equal"value: "Value"effect: "NoSchedule"tolerationSeconds: 3600
- key: "key1"operator: "Equal"value: "Value"effect: "NoExecute"
- key: "key2"operator: "Exists"effect: "NoSchedule" 

其中 key ,value, effect 要与 Node 上设置的 taint 保持一致,operator 的值为 Exists 将会忽略 value 值,tolerationsSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间。

1、当不指定key值时,表示容忍所有的污点key

tolerations:
- operator: "Exists"

2、当不指定effect值时,表示容忍key为app的所有排斥等级

tolerations:
- key: "app"operator: "Exists"

3、当有多个Master存在时,为防止资源浪费,可以如下设置

kubectl taint nodes master-nodename node-role.kubernetes.io/master:PreferNoSchedule

容忍度属性字段参数详解,如下图所示:
在这里插入图片描述


4.1、容忍度NoSchedule之通配

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

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

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-
kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-1.yamlapiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Exists"  #表示等值关系,只要对应的键是存在的,exists,其值被自动定义成通配符value: ""  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等effect: "" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,空意味着匹配所有的排斥等级  

如下图所示:
在这里插入图片描述
结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoExecute,yaml文件中定义的tolerations属性,operator等值关系为Exists,其值被自动定义成通配符value和effect对应的值为空,表示匹配value和effect值为任意值,即被打上污点的节点key对应的值为deploy,value的值为任意值,effect排斥等级为NoSchedule或NoExcuete或PreferNoschedule均可被容忍,即可正常调度到该节点。


4.2、容忍度NoExecute完全匹配

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoExecute
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoExecute
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoExecute
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoExecute

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

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoExecute-
kubectl taint node k8s-worker-21 deploy=nginx:NoExecute-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-2.yamlapiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Equal"  #表示等值关系,即必须完全匹配,effect字段、value值必须与节点保持一致value: "nginx"  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等,不能为空effect: "NoExecute" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,不能为空 tolerationSeconds: 30 #表示容忍的时间周期,必须是NoExecute,否则该字段将被忽略,没有设置,这意味着永远容忍污染,不会驱逐,0和负值将被视为0表示立即驱逐

如下图所示:
在这里插入图片描述
等待30秒后,如下图所示:
在这里插入图片描述
说明:这里设置为30秒,符合污点的节点创建并且运行1分钟后进入回收状态,新的pod又调度到此节点,一分钟后再次删除,创建、删除…一直下去。

结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoExecute,yaml文件中定义了pod的容忍度为NoExecute,与当前k8s-worker-16节点和k8s-worker-21节点污点排斥等级一致,则是可以正常调度的。这里要注意的是tolerationSeconds: 30,表示容忍的时间周期,必须是NoExecute,否则该字段将被忽略,没有设置,这意味着永远容忍污染,不会驱逐,0和负值将被视为0表示立即驱逐。


4.3、容忍度NoSchedule完全匹配

1、k8s集群worker节点默认是没有污点的,如下图所示:
在这里插入图片描述
2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

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

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-
kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-3.yaml apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Equal"  #表示等值关系,即必须完全匹配,effect字段、value值必须与节点保持一致value: "nginx"  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等,不能为空effect: "NoSchedule" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,不能为空 

如下图所示:
在这里插入图片描述
结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoSchedule,按照规则新创建的pod是调度不了的,但是在yaml文件中定义了pod的容忍度为NoSchedule,与当前k8s-worker-16节点和k8s-worker-21节点污点排斥等级一致,则是可以正常调度的。


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

这篇关于《Kubernetes知识篇:Kubernetes之pod污点和容忍度》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377244

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不