pod调度之Taints和Tolerations(污点和容忍)
2020-07-17 10:08
176 查看
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上。而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。
Taints(污点)是Node的一个属性,设置了Taints(污点)后,Kubernetes是不会将Pod调度到这个Node上的。
Kubernetes给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够把Pod调度过去。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。
- 设置污点
语法: kubectl taint NODE NAME KEY=VAL:TAINT_EFFECT 其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ] NoSchedule :一定不能被调度。 PreferNoSchedule:尽量不要调度。 NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
实例: [root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedule node/kafka03 tainted
- 去除污点
去除指定key及其effect: kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value) 去除指定key所有的effect: kubectl taint nodes node_name key-
实例: [root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedule- node/kafka03 untainted [root@bogon shell]# kubectl taint node kafka03 test- node/kafka03 untainted
- Pod 容忍污点示例:
首先给node设置个污点以观察调度效果:
[root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedule node/kafka03 tainted
当pod没有设置容忍时被调度到server01这个节点上了:
[root@bogon ~]# kubectl get pod -o wide|grep pod-taints pod-taints 1/1 Running 0 5m1s 172.17.0.3 server01 <none> <none>
- 给Pod设置容忍:
[root@bogon ~]# vim pod-taints-tolerations.yaml apiVersion: v1 kind: Pod metadata: name: pod-taints-tolerations labels: app: redis spec: tolerations: #设置容忍性 - key: "test" operator: "Equal" #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal(=) value: "kafka03" #意思是这个Pod要容忍的有污点的Node的key是test Equal kafka03,效果是NoSchedule, effect: "NoSchedule" containers: - name: pod-tains-tolerations image: redis
容忍后就调度到另外一个Node上了。这需要在两个Node的Pod数量不平衡时才能看到效果。
[root@bogon ~]# kubectl get pod -o wide|grep pod-taints-tolerations pod-taints-tolerations 1/1 Running 0 65s 172.17.0.4 kafka03 <none> <none>
对于tolerations属性的写法:
其中的key、value、effect 与Node的Taint设置需保持一致, 还有以下几点说明:
- 如果operator的值是Exists,则value属性可省略。
- 如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。
- 如果不指定operator属性,则默认值为Equal。
另外,还有两个特殊值:
- 空的key 如果再配合Exists 就能匹配所有的key与value ,也就是能容忍所有node的所有Taints。
- 空的effect 匹配所有的effect。
通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:(Taints+Tolerations+NodeAffinity)
给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,但是也不一定会调度给此特定Node。
设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里设置NodeAffinity到Node。如此就能达到要求了。
相关文章推荐
- Kubernetes之Taints与Tolerations 污点和容忍
- Kubernetes1.6新特性:POD高级调度-污点和容忍特性/报告节点问题特性
- K8S 之Taints(污点) 和 Tolerations(容忍)--初探;
- 深入kubernetes调度之Taints和Tolerations
- kubernetes调度之污点(taint)和容忍(toleration)
- k8s基本概念-配置调度策略之(Taints-and-Tolerations)
- pod管理调度约束、与健康状态检查
- Kubernetes的污点和容忍(上篇)
- 污点(Taint )和容忍(Toleration)
- Kubernetes之Pod调度
- Kubernetes之pod调度
- Kubernetes的污点和容忍(下篇)
- Taints and Tolerations
- 为什么Kubernetes使用Pod作为最小调度单元
- pod调度之DaemonSet
- pod调度之Job:批处理调度
- Kubernetes之Pod调度
- Kubernetes1.6新特性:POD高级调度-亲和性/反亲和性特性
- 【Kubernetes】Pod调度到指定Node
- pod调度之CrontJob:定时任务