Taints和Tolerations的引入
- NodeAffinity节点亲和性,是在Pod上定义的一种属性, 使得Pod能够被调度到某些Node上运行(优先选择或强制要求)。Taint 则正好相反,它让Node拒绝Pod的运行
- Taint需要和Toleration配合使用,让Pod避开那些不合适的Node。在 Node上设置一个或多个Taint之后,除非Pod明确声明能够容忍这些污点,否则无法在这些Node上运行。Toleration是Pod的属性,让Pod能够 (注意,只是能够,而非必须)运行在标注了Taint的Node上
可以用kubectl taint 命令为node设置Taint信息
kubectl taint nodes nodename key=value:NoSchedule
kubectl taint nodes 192.168.8.130 version=v1:NoSchedule
查看node上面的的Taintsd
[root@promote archive]# kubectl describe nodes 192.168.8.130 |grep Taints
Taints: version=v1:NoSchedule
这个设置为node1加上了一个Taint。该Taint的键为key,值为 value,Taint的效果是NoSchedule。这意味着除非Pod明确声明可以容忍这个Taint,否则就不会被调度到192.168.8.130上
设置可以容忍污点使得Pod能够调度到node1上
apiVersion: v1
kind: Pod
metadata:
labels:
test: nginx
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
tolerations:
- key: version #key是taint key,如果该值为空匹配所有的taints的key,而且 operator的是必须为Exists
operator: Equal # Valid operators are Exists and Equal
value: v1
effect: NoSchedule
验证:
或者
apiVersion: v1
kind: Pod
metadata:
labels:
test: nginx
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
tolerations:
- key: version
operator: Exists #可以容忍特定类别的所以污点
effect: NoSchedule
Pod的Toleration声明中的key和effect需要与Taint的设置保持一致, 并且满足以下条件之一
operator的值是Exists(无须指定value)
operator的值是Equal并且value相等。
如果不指定operator,则默认值为Equal
◎ 空的key配合Exists操作符能够匹配所有的键和值。
◎ 空的effect匹配所有的effect。
补充:effect的值
- effect的取值为NoSchedule,还可以取值为 PreferNoSchedule,这个值的意思是优先,也可以算作NoSchedule的软限制版本—一个Pod如果没有声明容忍这个Taint,则系统会尽量避免把 这个Pod调度到这一节点上,但不是强制的
延伸
根据上面实验,继续给node加上一个污点,根据下图发现,pod继续在原来的node上面运行
加上NoExecute污点,发现之前在192.168.8.130的pod,正在被驱逐。也不会在另外的node节点上面创建新的。