上一章节介绍了,pod的调度方式有选择器、节点亲和性、pod亲和性和反亲和性,本章节继续介绍pod的其他调度方式:污点和容忍度。
一、污点和容忍度介绍
污点是相对于节点说的,一旦给某个节点上打了污点了标签,pod调度时就会阻止pod调度在该节点上,如果pod设置了容忍这个节点的污点的话,pod也可以调度在有污点的节点上。
1、显示污点信息
在集群上部署pod时经常发现,pod一般被调度在各个子节点上进行部署的,没有被调度在master主节点上,正是因为master主节点上打了污点标签,所以一般pod不会调度在主节点上的。通过如下命令可以查看master主节点的污点信息
kubectl describe node k8s-master01 #其中k8s-master01为主节点名
执行完上述命令后,会发现如下
图中表示有一个污点Taints: node-role.kubernetes.io/master:NoSchedule
,Taints表示污点,污点标签为 node-role.kubernetes.io/master,污点的value值为空,NoSchedule为影响因子。
污点一般是由一个key、value,以及一个effect组成,表现为 =:。
图中显示污点将阻止pod调度到主节点上,除非有pod能容忍这个污点。
2、显示容忍度信息
尽管主节点设置了污点,但还是有些系统的pod调度在了主节点上,那是因为这些系统pod设置了容忍度,可以容忍主节点的污点。首先查看系统的pod,
[root@k8s-master01 affinity_work]# kubectl get pod -o wide -n kube-system
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
etcd-k8s-master01 1/1 Running 15 124d 192.168.137.100 k8s-master01 <none> <none>
kube-apiserver-k8s-master01 1/1 Running 16 124d 192.168.137.100 k8s-master01 <none> <none>
kube-controller-manager-k8s-master01 1/1 Running 17 124d 192.168.137.100 k8s-master01 <none> <none>
kube-flannel-ds-amd64-2hb24 1/1 Running 6 123d 192.168.137.20 k8s-node02 <none> <none>
kube-flannel-ds-amd64-5cb5g 1/1 Running 18 123d 192.168.137.100 k8s-master01 <none> <none>
kube-flannel-ds-amd64-hr4w9 1/1 Running 6 123d 192.168.137.10 k8s-node01 <none> <none>
kube-proxy-5tqnc 1/1 Running 6 123d 192.168.137.10 k8s-node01 <none> <none>
kube-proxy-959qc 1/1 Running 16 124d 192.168.137.100 k8s-master01 <none> <none>
kube-proxy-rqmfm 1/1 Running 6 123d 192.168.137.20 k8s-node02 <none> <none>
kube-scheduler-k8s-master01 1/1 Running 15 124d 192.168.137.100 k8s-master01 <none> <none>
如上所示,发现有些系统pod是调度在了master主节点上的,以最下面的kube-scheduler-k8s-master01为例,查看该节点的容忍度信息,执行命令
kubectl describe pod kube-scheduler-k8s-master01 -n kube-system
发现如下信息
从图中显示可知,该pod设置了Tolerations: :NoExecute
容忍度信息,所以该pod可以调度在master主节点上。
3、污点因子
从前面可知,master主节点用的污点因子为NoSchedule,表示pod没有容忍污点就不允许调度在master主节点上,污点因子除了NoSchedule外,还有PreferNoSchedule和NoExecute因子。
- NoSchedule:表示如果pod没有容忍这些污点,Pod则不能调度到包含这些污点的节点上;
- PreferNoSchedule:是 NoSchedule的一个宽松版本,表示尽量阻止pod被调度在PreferNoSchedule污点类型的节点上,但是如果没有其他节点可以调度,pod依然会被调度在该类型的节点上。
- NoExecute:NoExecute不同于NoSchedule和PreferNoSchedule,后两者只在调度期间起作用,而NoExecute也会影响正在节点上运行着的pod。如果在一个节点上添加了NoExecut类型污点,哪些在该节点上运行着的pod,如果没有容忍这个NoExecute污点,将会从这个节点中去除。
二、污点应用
集群包含一个主节点k8s-master02和两个子节点,分别为k8s-node01和k8s-node02,现在在k8s-node01节点上打一个污点,pod调度时没有设置容忍度会全部调度在k8s-node02节点的
kubectl taint node k8s-node01 prod=dev:NoSchedule
在k8s-node01节点打的污点标签为prod=dev,污点因子设置的为NoSchedule,表示如果pod不能容忍prod=dev污点就不会调度在k8s-node01节点上,如下所示,pod全部调度在了k8s-node02节点上。
[root@k8s-master01 affinity_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
taint-replica-849hz 1/1 Running 0 36s 10.244.2.175 k8s-node02 <none> <none>
taint-replica-9472b 1/1 Running 0 36s 10.244.2.176 k8s-node02 <none> <none>
taint-replica-s62zl 1/1 Running 0 36s 10.244.2.174 k8s-node02 <none> <none>
三、污点容忍度应用
上面案例在k8s-node01设置了prod=dev的污点,类型为NoSchedule,下面部署pod时设置pod可以容忍该污点,pod就可以调度到k8s-node01节点上了
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: taint-replica
spec:
replicas: 3
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "sleep 3600"]
imagePullPolicy: IfNotPresent
tolerations: #设置pod的容忍度,可以忍受带prod=dev的污点节点,类型为NoSchedule
- key: prod
operator: Equal
value: dev
effect: NoSchedule
通过该yaml文件创建replicaset后,发现pod可以调度在了k8s-node01上
[root@k8s-master01 affinity_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
taint-replica-7k9rn 1/1 Running 0 6s 10.244.2.178 k8s-node02 <none> <none>
taint-replica-pmb9s 1/1 Running 0 6s 10.244.2.177 k8s-node02 <none> <none>
taint-replica-rhzdx 1/1 Running 0 6s 10.244.1.193 k8s-node01 <none> <none>
注意:本案例operator设置的为Equal,即key=value,表示污点的标签要等于污点value值。operator还可以取值Exists,此时会忽略values值,表示只要节点存在key就满足容忍条件,pod可以调度在污点所在标签上。
污点的容忍度还有如下应用案例总结:
1.只要节点存在标签prod,不管标签的value值如何,影响作用为NoExecute的节点,pod都可以容忍
tolerations:
- key: prod
operator: Exists
effect: NoExecute
2.当不指定effect时,表示容忍所有污点的作用,如下,凡是节点上有标签prod,不管容忍因子是什么否可以忍受,即可以同时忍受NoSchedule、PreferNoSchedule、NoExecute作用。
tolerations:
- key: prod
operator: Exists
3.当不指定key,只定义operator,如下所示,表示只要存在污点的节点,无论容忍因子是什么,pod都可以在该节点上调度(如下定义,pod也可以调度到master节点上)
tolerations:
- operator: Exists
4.多个master存在时,防止资源浪费,可如下设置,表示node无资源时可以调度到master节点
kubectl taint nodes k8s-master01 prod=uat:PreferNoSchedule
5.定义pod时如果设置了tolerationSeconds,表示该pod被删除之前可以运行多长时间。比如pod正在某节点,一旦该节点打上了污点,并且容忍因子为NoExecute,则就会删除运行在该节点上的pod(除非pod设置了容忍NoExecute),如果设置了tolerationSeconds=60,表示pod在被删除前允许运行60s。
tolerations:
- key: prod
operator: Equal
value: dev
effect: Noschedule
tolerationSeconds: 60