Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求)。污点的行为完全相反,它们允许一个节点排斥一组 Pod。
在 Kubernetes 中,您可以标记(污染)一个节点,以便在该节点上不能调度任何 Pod,除非它们应用了明确的容忍度。Tolerations 应用于 Pod,并允许(但不要求)Pod 调度到具有匹配污点的节点上。
污点和容忍度协同工作可确保 Pod 不会被调度到不合适的节点上。
污点语法
常见的污点语法是:
key=value:Effect
可以分配三个不同的值effect:
NoSchedule:如果至少有一个未被忽略的污点NoSchedule生效,那么 Kubernetes 不会将 pod 调度到该节点上。已经存在的不容忍这种污点的 Pod 不会被从该节点驱逐或删除。但是除非有匹配的容忍度,否则不会在这个节点上安排更多的 Pod。这是一个硬约束。
PreferNoSchedule:如果至少有一个不可容忍的污点有影响,Kubernetes 将尝试不在节点上调度 Pod 。但是如果有一个 pod 可以容忍一个 taint,它可以被调度。这是一个软约束。
NoExecute:如果至少有一个未被忽略的NoExecute taint 生效,那么 Pod 将从节点中被逐出(如果它已经在节点上运行),并且不会被调度到节点上(如果它还没有在节点上运行)节点)。这是一个强约束。
我们可以对单个节点应用多个污点,对单个 Pod 应用多个容忍度。
向节点添加污点
语法
kubectl taint nodes <node_name> key=value:effect
看看不同节点上已经运行的 pod
root@kube-master:~# kubectl get pods -o wide
在节点上kube-worker2应用污点
root@kube-master:~# kubectl describe nodes kube-worker2 | grep -i taint
Taints: <none>root@kube-master:~# kubectl taint nodes kube-worker2 new-taint=taint_demo:NoSchedule
node/kube-worker2 taintedroot@kube-master:~# kubectl describe nodes kube-worker2 | grep -i taint
Taints: new-taint=taint_demo:NoSchedule
在上面的示例中,在 kube-worker2 node 上应用了一个 taint new-taint=taint_demo:NoSchedule
现在让我们看看正在运行的 pod:
root@kube-master:~# kubectl get pods -o wide
根据NoSchedule约定,已经运行的 pod 不受影响。
现在让我们用同一个节点添加 NoExecute 污点。
root@kube-master:~# kubectl taint nodes kube-worker2 new-taint=taint_demo:NoExecute
node/kube-worker2 taintedroot@kube-master:~# kubectl describe nodes kube-worker2 | grep -i taint
Taints: new-taint=taint_demo:NoExecutenew-taint=taint_demo:NoSchedule
现在让我们看看正在运行的 pod:
root@kube-master:~# kubectl get pods -o wide
所有不能容忍污点的Pod都被驱逐了。
从节点中移除污点
如果您不再需要污点,请运行以下命令将其删除:
root@kube-master:~# kubectl taint node kube-worker2 new-taint:NoSchedule-
node/kube-worker2 untaintedroot@kube-master:~# kubectl taint node kube-worker2 new-taint:NoExecute-
node/kube-worker2 untainted
为 Pod 添加容忍度
您可以在PodSpec添加容忍度.
让我们再查看添加NoSchedule污点的节点。
root@kube-master:~# kubectl taint nodes kube-worker2 new-taint=taint_demo:NoSchedule
node/kube-worker2 tainted
部署一个具有污点容忍度的 pod 这是我们的清单文件:
root@kube-master:~/taint_tolerations# cat toleration.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-toleration-demolabels:env: staging
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresenttolerations:- key: "new-taint"operator: "Equal"value: "taint_demo"effect: "NoSchedule"
Pod 的 toleration 具有 key new-taint、 value true和 effect NoSchedule,这与我们之前在 node 上应用节点kube-worker2上的 taint 相匹配。这意味着这个 pod 现在有资格被调度到节点kube-worker2。但是,这并不能保证这个 Pod 一定被调度,因为我们没有指定任何node affinity或者nodeSelector。
operator的默认值为Equal。(如果键相同且值相同,则容忍匹配污点)
运算符是Exists(这种情况下不应指定任何值)
应用 Pod 清单文件
root@kube-master:~/taint_tolerations# kubectl apply -f toleration.yaml
pod/nginx-toleration-demo created
验证 Pod 在哪个节点上运行
root@kube-master:~/taint_tolerations# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-toleration-demo 1/1 Running 0 7s 192.168.161.196 kube-worker2 <none> <none>
nodeselector-demo 1/1 Running 2 3d23h 192.168.194.11 kube-worker1 <none> <none>
您可以在上面看到nginx-toleration-demo 被调度到 kube-worker2。
一个节点可以有多个污点,而 pod 可以有多个容忍度。Kubernetes 处理多个 taints 和 toleration 的方式就像一个过滤器:从节点的所有 taint 开始,然后忽略 pod 具有匹配 toleration 的那些;剩余的未被忽略的污点对 pod 有特定的影响。
关于容忍度的重要说明
如果至少有一个未被忽略的NoSchedule taint 生效,那么 Kubernetes 将不会把 pod 调度到该节点上。
如果没有未忽略的 NoSchedule taint 生效,但至少有一个未忽略的PreferNoSchedule taint 生效,则 Kubernetes 将尝试不把 pod 调度到节点上。
如果至少有一个未被忽略的NoExecute taint 生效,那么 pod 将从节点中被逐出(如果它已经在节点上运行),并且不会被调度到节点上(如果它还没有在节点上运行) )。
让我们举个例子:
我已经污染了的节点
root@kube-master:~# kubectl taint nodes kube-worker2 new-taint=taint_demo:NoExecuteroot@kube-master:~# kubectl taint nodes kube-worker2 new-taint=taint_demo:NoScheduleroot@kube-master:~# kubectl taint nodes kube-worker2 new-taint2=taint_demo2:NoSchedule
验证应用的污点
root@kube-master:~# kubectl describe nodes kube-worker2 | grep -i taint
Taints: new-taint=taint_demo:NoExecutenew-taint=taint_demo:NoSchedulenew-taint2=taint_demo2:NoSchedule
Pod 清单文件
root@kube-master:~/taint_tolerations# cat toleration-2.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-toleration-demolabels:env: staging
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresenttolerations:- key: "new-taint"operator: "Equal"value: "taint_demo"effect: "NoSchedule"- key: "new-taint"operator: "Equal"value: "taint_demo"effect: "NoExecute"
在这种情况下,pod 将无法调度到节点上,因为没有与第三个 taint 匹配的容忍度。但是如果在添加 taint 的时候已经在 node 上运行,它就可以继续运行,因为第三个 taint 是 Pod 不能容忍的三个 taint 中唯一的一个。
实际上任何不容忍NoExecute taint 的 pod 都将被立即驱逐,而能够容忍 taint 的 pod 将永远不会被驱逐。但是可以指定一个可选tolerationSeconds字段,该字段指示在添加污点后 pod 将保持绑定到节点的时间。例如:
tolerations:
- key: "new-taint"operator: "Equal"value: "taint_demo"effect: "NoExecute"tolerationSeconds: 3600
这意味着如果这个 pod 正在运行并且又一个匹配的 taint 被添加到该节点,那么该 pod 将保持绑定到该节点 3600 秒,然后被驱逐。如果在该时间之前移除了 taint,则 pod 不会被驱逐。
污点和容忍应用场景总结
专用节点
当您想将一组节点专用于专有工作负载或特定用户时,您可以向这些节点添加一个污点(例如kubectl taint nodes nodename dedicated=groupName:NoSchedule),然后向它们的 pod 添加相应的容忍度。
具有特殊硬件的节点
对于具有专用硬件(例如 GPU)的节点,我们只希望具有这些要求的 pod 在这些节点上运行。污染将帮助我们(例如kubectl taint nodes nodename special=true:NoScheduleor kubectl taint nodes nodename special=true:PreferNoSchedule)并为使用特殊硬件的 pod 添加相应的容忍度。
基于污点的驱逐
当节点存在问题时,每个 pod 可配置的驱逐行为。当某些条件为真时,节点控制器会自动污染节点。
如下是k8s给出内置污点:
node.kubernetes.io/not-ready:节点没有准备好。
node.kubernetes.io/unreachable:无法从节点控制器访问节点。准备就绪时NodeCondition为“未知”。
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:节点不可调度。
原文:https://blog.learncodeonline.in/kubernetes-scheduling-taints-and-tolerations
推荐
Kubernetes 版本升级之路
Kubernetes入门培训(内含PPT)
随手关注或者”在看“,诚挚感谢!
Kubernetes 调度 - 污点和容忍度详解相关推荐
- 云原生之Kubernetes:24、污点和容忍度详解
文章目录 前言 1.概念引入 2.污点和容忍度配置 3.该如何配置? 4.内置污点 5.常用命令补充 6.实战:Taints and Tolerations 前言 Taint(污点)和Tolerati ...
- kubernetes 【调度和驱逐】【1】污点和容忍度
kubernetes 学习污点和容忍度 tags: 策略 文章目录 kubernetes 学习污点和容忍度 1. 概念 2. 示例 3. 基于污点的驱逐 4. 基于节点状态添加污点 1. 概念 节点亲 ...
- 《Kubernetes知识篇:Kubernetes污点和容忍度》
文章目录 一.简介 二.pod对象的排斥等级 三.污点且无容忍度 3.1.污点之排斥等级NoSchedule 3.2.污点之排斥等级NoExecute 3.3.污点之排斥等级PreferNoSched ...
- 图解 K8S(06):调度利器之污点与容忍度(压力驱逐)
本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...
- Kubernetes 笔记(08)— Daemonset 产生缘由、yaml 描述、使用方法、污点和容忍度的定义及使用、静态 Pod
DaemonSet,它会在 Kubernetes 集群的每个节点上都运行一个 Pod,就好像是 Linux 系统里的"守护进程"(Daemon). 1. 产生缘由 Deployme ...
- 基于Kubernetes构建Docker集群管理详解
from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...
- K8S 污点和容忍度
污点和容忍度 节点亲和性(详见这里) 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点. 这可能出于一种偏好,也可能是硬性要求. Taint(污点)则相反,它使节点能够排斥一类特定的 Po ...
- Pod 污点和容忍度
Pod 污点和容忍度 给了节点选则的主动权,我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属性数据,可以定决定拒绝那些pod: taints是键值数据,用在节点上,定义污 ...
- 3.11 污点和容忍度
文章目录 一.污点和容忍度介绍 1.显示污点信息 2.显示容忍度信息 3.污点因子 二.污点应用 三.污点容忍度应用 上一章节介绍了,pod的调度方式有选择器.节点亲和性.pod亲和性和反亲和性,本章 ...
最新文章
- 汇总pandas中的dataframe的索引操作
- 利用intellijidea创建maven多模块项目
- Spring Boot-切换嵌入式Servlet容器
- URLshorting网址短链接PHP源码 开源源码
- RPC与Restful比较
- TCP协议的部分解析(2)
- “进化”的搜索方式:揭秘微软语义搜索背后的技术
- ajax beforeSend中无效果
- 用Latex写学术论文:作者(Author)摘要(Abstract)
- myexcel导入导出数据
- 一位清华贫困生的“树洞”刷屏!“我想照亮哪怕其他一个人也好”...
- win10只能发现部分计算机,Win10的隐藏小秘密,被我发现了
- 可落地的DDD(6)-工程结构
- java queue GATK_GATK 4.0 全外显子call variant
- matlab复杂函数多元函数拟合
- shell if -z -f
- ubuntu 卡在waiting for unattended-upgr to exit的解决
- 通用计算机仍旧遵循冯诺依曼,冯·诺依曼计算机体系
- 酷讯网半年内两换CEO 风投要业绩被指心太急
- python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息