Loading

污点taints和容忍toleration_v1

污点taints和容忍toleration

查看taints

root@node81[14:12:09]:/home/k8s_conf/saas# kubectl describe nodes node81 
...
CreationTimestamp:  Tue, 10 May 2022 17:31:08 +0800
Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false

分别对应=:

=node-role.kubernetes.io/master

= 空

=NoSchedule

effect可以取值:

  • PreferNoSchedule: 尽量不要调度。
  • NoSchedule: 一定不能被调度。
  • NoExecute: 不仅不会调度, 还会驱逐 Node 上已有的 Pod。
  • 设置taints
kubectl taint node node81 node-role.kubernetes.io/master:PreferNoSchedule

删除taints

#root@node81[14:41:26]:/home/k8s_conf/saas# kubectl taint node node81 node-role.kubernetes.io/master:NoSchedule-
node/node81 untainted
#root@node81[14:41:33]:/home/k8s_conf/saas# kubectl describe nodes node81
...
CreationTimestamp:  Tue, 10 May 2022 17:31:08 +0800
Taints:             <none>
Unschedulable:      false
...

容忍

一个 Node 可以有多个污点,一个 Pod 可以有多个容忍。

想要pod调度到有污点node,需要pod容忍包含该node所有污点(PreferNoShedule除外)

设置容忍tolerations

apiVersion: apps/vl
kind: Deployment
metadata: 
  name: example 
spec: 
  replicas: 3 
  template:
    spec: 
      ......
      tolerations: 
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"
        tolerationSeconds: 3600

tolerationSeconds用于设置多长时间以后再踢掉pod,单位秒

operator:可选值Equal 和 Exists

Exists: 匹配容忍在已有条件下的所有污点

key为空,则匹配所有key

tolerations:
- operator: "Exists"

key不为空,effect为空,则匹配该key的所有值

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

Equal

Node 和 Pod 的 key 为 key1、value1 与 effect 相同则能调度

#污点
key1=value1:NoSchedule

#Pod设置
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

Node 的污点的 key、value、effect 和 Pod 容忍都相同则能调度

# 设置污点
key1=value1:NoSchedule
key2=value2:NoExecute

# Pod设置容忍
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key2"
  operator: "Equal"
  value: "value2"
  effect: "NoExecute"

Node 的污点和 Pod 的大部分都相同,不同的是 Node 污点 effect 为 PreferNoSchedule 的,可能会调度

# 污点
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule

# Pod设置容忍
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key2"
  operator: "Equal"
  value: "value2"
  effect: "NoExecute"

Node 的污点和 Pod 的大部分都相同,不同的是 Node 污点 effect 为 NoSchedule 和 NoExecute 的,不会被调度

# 污点
key1=value1:NoSchedule
key2=value2:NoExecute
key3=value3:PreferNoSchedule

# Pod设置容忍
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key3"
  operator: "Equal"
  value: "value3"
  effect: "PreferNoSchedule"

驱逐

污点的 effect 可以设置为 NoExecute时

  • 立即将没有配置容忍的 Pod 逐出。
  • 设置容忍但是没有指定 tolerationSeconds 参数的,那么该容忍永久生效。
  • 设置容忍但是有指定 tolerationSeconds 参数的,那么在指定的时间内容忍有效,超过指定时间后将被剔除。

当某些条件为 true 时,节点控制器会自动污染节点。内置以下污点:

  • node.kubernetes.io/not-ready: 节点尚未准备好。这对应于 NodeCondition Ready 为 false。
  • node.kubernetes.io/unreachable: 无法从节点控制器访问节点。这对应于 NodeCondition Ready 为 Unknown。
  • node.kubernetes.io/out-of-disk: 节点磁盘不足。
  • node.kubernetes.io/memory-pressure: 节点有内存压力。
  • node.kubernetes.io/disk-pressure: 节点有磁盘压力。
  • node.kubernetes.io/network-unavailable: 节点的网络不可用。
  • node.kubernetes.io/unschedulable: 节点不可调度。
  • node.cloudprovider.kubernetes.io/uninitialized: 当 kubelet 从 "外部" 云提供程序开始时,此污点在节点上设置为将其标记为不可用。来自 cloud-controller-manager 的控制器初始化此节点后,kubelet 删除此污点。

节点失效 pod转移等待时间

当某个 Pod 运行所在的 Node 变成 unready 或者 unreachable 不可用状态时,Kubernetes 可以等待该 Pod 被调度到其他节点的最长等待时间

tolerations:
- effect: NoExecutekey: node.alpha.kubernetes.io/notReady
  operator: Exists
  tolerationSeconds: 300
- effect: NoExecutekey: node.alpha.kubernetes.io/unreachable 
  key: operator: Exists 
  tolerationSeconds: 300 

这两个容忍度表示,该 Pod 将容忍所在节点处于 notReady 或者 unreachable 状态维持 300 秒。 当 Kubernetes 控制器检测到有节点处 notReady 或者 unreachable 状态时, 将会等待 300 秒,如果超过指定时间的话 Kubernetes 将会把该 Pod 重新调度到其他节点上。

参考:http://www.mydlq.club/article/69/#

posted @ 2022-05-12 18:49  萝卜青菜~  阅读(93)  评论(0编辑  收藏  举报