本文主要是介绍十二、K8S之污点和容忍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
污点和容忍
一、概念
k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。
此时就需要用到污点(Taint)和容忍(Toleration),这些配置都是 key: value 类型的。
K8S的污点和容忍是其中一种高级调度功能,作用是让 Kubernetes 集群中的节点有选择地接受或拒绝来自不同类型 Pod 的调度请求,可以帮助运维人员更好地管理、调度和控制应用程序的部署。
二、污点
在节点上设置污点,当我们在一个节点上打上污点以后,k8s 会认为尽量不要将 pod 调度到该节点上。
配置污点主要分为两类
- NoSchedule
设置了 NoSchedule 污点的节点将不会被调度器分配新的 Pod,但已经运行的 Pod 不受影响。这个污点用于标记节点暂时无法接受新的 Pod 的情况,例如节点维护或故障。
- NoExecute
设置了 NoExecute 污点的节点将不会被调度器分配新的 Pod,并且已经运行在该节点上的 Pod,如果它们不容忍该污点,则会被驱逐出该节点。这个污点用于标记节点上的某些服务或资源已经不再可用,而正在运行的 Pod 需要尽快迁移到其他节点。
- PreferNoSchedule
“软性”的 NoSchedule
,尽量避免往该节点上调度,但不能保证完全避免
2.1、使用到的命令
# 为节点打上污点, 这里的key和value是自定义的标签,主要作用是为了解释为什么打污点
kubectl taint node k8s-master key=value:NoExecute# 移除污点,就是打污点的命令后面加一个-
kubectl taint node k8s-master key=value:NoSchedule-# 查看污点
kubectl describe no k8s-master
------------------- 看Taints数据
Taints: node-role.kubernetes.io/master:NoSchedule
2.2、示例
在K8S中,master节点默认有一个NoSchedule类型的污点,现在我是想通过配置污点的方式将一个运行在节点1的pod转移到 master节点上。
-
1、去除master污点
kubectl taint node node-role.kubernetes.io/master:NoSchedule-
-
2、给节点1添加一个NoExecute 类型的污点
kubectl taint node k8s-node1 ceshi=t:NoExecute
做完这两步之后就会发现pod转移到master节点上运行了
三、容忍
容忍是标注在 pod 上的,当 pod 被调度时,如果没有配置容忍,则该 pod 不会被调度到有污点的节点上,只有该 pod 上标注了满足某个节点的所有污点,则可能会被调度到这些节点
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent#容忍配置 tolerations:- key: "test"operator: "Equal"value: "t"effect: "NoSchedule"
- key
表示要匹配的污点的键(Key),就是标签的key。必须与节点上设置的污点键一致。
- operator
表示匹配操作符,可以取值为 “Equal”、“Exists” 或 “DoesNotExist”,分别表示完全匹配、存在匹配和不存在匹配。如果为Exists,则不需要value
- value
标签的值
- effect
表示匹配效果(Effect),可以取值为 “NoSchedule”、“PreferNoSchedule” 或 “NoExecute”,分别表示不可调度、尽量避免调度和驱逐。
这四个参数中,前三个主要是为了匹配标签的key-value,effect匹配污点类型
存在两种特殊情况:
如果一个容忍度的
key
为空且operator
为Exists
, 表示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。如果
effect
为空,则可以与所有键名key1
的效果相匹配。
这篇关于十二、K8S之污点和容忍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!