【k8s】【重要概念】详解污点和容忍度
一、基本概念
先弄清楚一下一些基本概念,才能理解污点和容忍度
(1)节点亲和性和反亲和性
我们的pod拉起来,需要使用节点来承载,那么我们是如何将pod调度到我们预期的节点上呢?
我们可以给节点打上标签,然后在我们在控制pod调度的时候指定它可以调度到那些标签的节点上。那么是如何实现打标签的呢?
K8s上面有个资源对象,节点选择器nodeSelector,它是节点上的一个属性,设置预期的节点标签,k8s调度pod的时候,会读取节点的nodeSelector上的约束标签,k8s只会讲pod调度到我们设置的指定标签的节点上。
节点亲和性与nodeSelector的关系?
nodeSelector 提供了一种最简单的方法来将 Pod 约束到具有特定标签的节点上。 亲和性和反亲和性扩展了你可以定义的约束类型。
节点亲和性:指的是节点的标签约束pod可以调度到那些节点上,跟nodeSelector 功能差不多,有两种节点亲和性调度方式:
- requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。
- preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。
节点反亲和性:与节点亲和性相反,尽可能约束pod调度在不同的节点上,提高HA能力;当我们使用requiredDuringSchedulingIgnoredDuringExecution/preferredDuringSchedulingIgnoredDuringExecution设置节点调度策略时,支持的operator操作: In, NotIn, Exists, DoesNotExist, Gt, Lt. 其中,NotIn 和 DoesNotExist用于实现反亲和性。
二、什么是污点
了解了节点亲和性后,知道节点亲和性是pod的一种属性,它使pod被吸引到一类特定的节点。而污点(Taint)则相反,污点能够让节点排斥一类特定的pod,有点跟节点反亲和性类似。
三、什么是容忍度
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的。
四、如何实现污点和容忍度
(1)给节点打上污点
执行命令:kubectl taint nodes <nodeName> key1=value1:NoSchedule
例如执行如下命令,给node1节点添加node.kubernetes.io/out-of-disk污点:
kubectl taint nodes <nodeName> node.kubernetes.io/out-of-disk='':NoSchedule
(2)查询是够存在污点
1)执行命令:kubectl describe nodes <nodeName> |grep Taints
如果输出:Taints: <none>则证明没有污点,否则存在污点
2)执行命令:kubectl get nodes paas-addon-1 -oyaml |grep taints:
如果输出不为空,则存在污点,否则不存在。
(3)消除污点
在添加污点的命令后面加上“-”即可
kubectl taint nodes <nodeName> key1=value1:NoSchedule-
(4)在pod中设置容忍度
容忍度与kubectl taint 命令创建的污点相匹配, 因此如果一个 Pod 拥有key1或者等于key1污点,都能容忍,都能够被调度到 ,通过设置operator实现:
operator 的默认值是 Equal。
一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果:
- 如果 operator 是 Exists (此时容忍度不能指定 value),
- 如果 operator 是 Equal ,则它们的 value 应该相等
说明:存在两种特殊情况
- 如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。
- 如果 effect 为空,则可以与所有键名 key1 的效果相匹配。
例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
或者
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
(5)污点和容忍度的协调
上述例子中 effect 使用的值为 NoSchedule,你也可以使用另外一个值 PreferNoSchedule、NoExecute等,
可以给一个节点添加多个污点,也可以给一个 Pod 添加多个容忍度设置。 Kubernetes 处理多个污点和容忍度的过程就像一个过滤器:从一个节点的所有污点开始遍历, 过滤掉那些 Pod 中存在与之相匹配的容忍度的污点。余下未被过滤的污点的 effect 值决定了 Pod 是否会被分配到该节点。
1) NoSchedule : Kubernetes 会尽量避免将 Pod 调度到存在其不能容忍污点的节点上, 但这不是强制的。
2)NoExecute:如果未被忽略的污点中存在至少一个 effect 值为 NoExecute 的污点, 则 Kubernetes 不会将 Pod 调度到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。
3)PreferNoSchedule:
- 如果未被忽略的污点中不存在 effect 值为 NoSchedule 的污点, 但是存在至少一个 effect 值为 PreferNoSchedule 的污点, 则 Kubernetes 会 尝试 不将 Pod 调度到该节点。
- 如果未被忽略的污点中不存在 effect 值为 NoSchedule 的污点, 但是存在至少一个 effect 值为 PreferNoSchedule 的污点, 则 Kubernetes 会 尝试 不将 Pod 调度到该节点。
- 点赞
- 收藏
- 关注作者
评论(0)