3.11 污点和容忍度


上一章节介绍了,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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值