• k8s中taints和toleration的作用及其使用方式


    1、概述

    在pod进行调度的时候,如果使用了节点的亲和性,那么就会在调度的时候,调度到具有某些标签的节点上,这个是从pod的角度来说的,同时呢,也可以从节点node的角度出发来定义什么样的pod可以被调度到这个节点上。

    在k8s中,可以通过taints和toleration的一起使用来达到这个目的。

    2、在节点上配置taints(污点)

    2.1、语法

    在节点上设置taints

    kubectl taint nodes node1 key1=value1:NoSchedule

    移除节点上的taints

    kubectl taint nodes node1 key1-

    注意:在key的最后面加上“-”

    2.2、示例

    2.2.1、在节点上设置taints

    kubectl taint nodes nccztsjb-node-23 role=master:NoSchedule

    如果移除taints使用

    kubectl taint nodes nccztsjb-node-23 role-

    2.2.2、查看节点上的taints信息

    [root@nccztsjb-node-23 ~]# kubectl describe nodes nccztsjb-node-23 | grep Taints
    Taints:             role=master:NoSchedule
    [root@nccztsjb-node-23 ~]# 

    说明节点上已经被配置了这个taints。那么任何的pod默认是不会被调度到这个节点上的。

    2.2.3、创建pod(多个副本)

    kubectl create deployment nginx-taints --image=172.20.58.152/middleware/nginx:1.21.4 --replicas=5

    查看pod的调度情况

    [root@nccztsjb-node-23 ~]# kubectl get pod -l app=nginx-taints -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
    nginx-taints-6698889db5-2sngj   1/1     Running   0          7s    172.39.157.221   nccztsjb-node-24   <none>           <none>
    nginx-taints-6698889db5-2t4nr   1/1     Running   0          7s    172.39.21.86     nccztsjb-node-25   <none>           <none>
    nginx-taints-6698889db5-jjbwn   1/1     Running   0          7s    172.39.21.85     nccztsjb-node-25   <none>           <none>
    nginx-taints-6698889db5-ljdlf   1/1     Running   0          7s    172.39.157.223   nccztsjb-node-24   <none>           <none>
    nginx-taints-6698889db5-mtds6   1/1     Running   0          7s    172.39.157.222   nccztsjb-node-24   <none>           <none>
    [root@nccztsjb-node-23 ~]# 

    从查询的结果来看,pod没有被调度到nccztsjb-node-23的节点上。

    那要让某些的pod被调度到这个节点上该怎么做呢?

    继续往下看toleration的内容。


    3、pod上设置toleration(容忍)

    所谓的toleration即pod允许、容忍某些节点,可以进行调度。

    那,我们看到,在2.2.3的步骤中,pod是不会在节点nccztsjb-node-23上进行发布的,那么要在这个节点上进行调度该如何操作呢?

    就是要在pod上定义toleration。

    3.1、语法

    (1)operator: equal

    tolerations:
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoSchedule"

    注意,如果operator如果是Equal,那么就要定义key和value,并且要和taints设置的值是一样的。

    (2)operator: exists

    tolerations:
    - key: "key1"
      operator: "Exists"
      effect: "NoSchedule"

    如果operator是exists的,那么就不需要设置value的值。

    (3)operator为exists,但是不设置key

    tolerations:
    - operator: "Exists"
      effect: "NoSchedule"

    3.2、示例

    (1) operator为euqal的情况

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-taints
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      selector:
        matchLabels:
          app: nginx-taints
      replicas: 5
      template:
        metadata:
          labels:
            app: nginx-taints
        spec:
          containers:
          - image: 172.20.58.152/middleware/nginx:1.21.4
            imagePullPolicy: IfNotPresent
            name: nginx
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          tolerations:
          - key: "role"
            operator: "Equal"
            value: "master"
            effect: "NoSchedule"

    创建deployment

    kubectl replace -f nginx-taints.yaml
    
    [root@nccztsjb-node-23 ~]# kubectl get pod -l app=nginx-taints -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
    nginx-taints-58b6ddd798-6dstj   1/1     Running   0          28s   172.39.21.84     nccztsjb-node-25   <none>           <none>
    nginx-taints-58b6ddd798-dm9nn   1/1     Running   0          26s   172.39.157.225   nccztsjb-node-24   <none>           <none>
    nginx-taints-58b6ddd798-ptm5m   1/1     Running   0          28s   172.39.157.224   nccztsjb-node-24   <none>           <none>
    nginx-taints-58b6ddd798-rxgcg   1/1     Running   0          26s   172.39.21.92     nccztsjb-node-25   <none>           <none>
    nginx-taints-58b6ddd798-ztnvb   1/1     Running   0          28s   172.39.209.74    nccztsjb-node-23   <none>           <none>

    发现在重新应用了yaml之后,是可以在nccztsjb-node-23节点上进行pod的调度的。

    (2)operator为exists的情况

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-taints
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      selector:
        matchLabels:
          app: nginx-taints
      replicas: 5
      template:
        metadata:
          labels:
            app: nginx-taints
        spec:
          containers:
          - image: 172.20.58.152/middleware/nginx:1.21.4
            imagePullPolicy: IfNotPresent
            name: nginx
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          tolerations:
          - key: "role"
            operator: "Exists"
            effect: "NoSchedule"

    重新应用yaml

    [root@nccztsjb-node-23 ~]# kubectl replace -f nginx-taints.yaml 
    deployment.apps/nginx-taints replaced
    [root@nccztsjb-node-23 ~]# kubectl get pod -l app=nginx-taints -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
    nginx-taints-6cb85bb844-6b8kr   1/1     Running   0          13s   172.39.157.226   nccztsjb-node-24   <none>           <none>
    nginx-taints-6cb85bb844-k72xc   1/1     Running   0          13s   172.39.21.93     nccztsjb-node-25   <none>           <none>
    nginx-taints-6cb85bb844-ql2zh   1/1     Running   0          11s   172.39.157.227   nccztsjb-node-24   <none>           <none>
    nginx-taints-6cb85bb844-s48z8   1/1     Running   0          11s   172.39.21.90     nccztsjb-node-25   <none>           <none>
    nginx-taints-6cb85bb844-wwwhb   1/1     Running   0          13s   172.39.209.75    nccztsjb-node-23   <none>           <none>

    也一样是可以在节点nccztsjb-node-23上进行调度的。

    OK,以上就是在node上设置tanints,默认没有任何的pod会被调度到该节点上,然后通过在pod上设置toleration允许pod被调度到这个节点上。注意:是允许、能够被调度到这个节点上,不是一定、必须调度到这个节点上(比如在有多个节点的情况下,其他的节点没有taints的设置是可以允许被调度上的)

    (3)不设置key和value的场景

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-taints
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      selector:
        matchLabels:
          app: nginx-taints
      replicas: 5
      template:
        metadata:
          labels:
            app: nginx-taints
        spec:
          containers:
          - image: 172.20.58.152/middleware/nginx:1.21.4
            imagePullPolicy: IfNotPresent
            name: nginx
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          tolerations:
          - operator: "Exists"
            effect: "NoSchedule"

    重新应用配置yaml

    [root@nccztsjb-node-23 ~]# kubectl apply -f nginx-taints.yaml 
    deployment.apps/nginx-taints created
    
    [root@nccztsjb-node-23 ~]# kubectl get pod -l app=nginx-taints -o wide
    NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
    nginx-taints-548544bcdd-2ftwq   1/1     Running   0          10s   172.39.209.76    nccztsjb-node-23   <none>           <none>
    nginx-taints-548544bcdd-6wvtp   1/1     Running   0          10s   172.39.157.229   nccztsjb-node-24   <none>           <none>
    nginx-taints-548544bcdd-glbkv   1/1     Running   0          10s   172.39.21.89     nccztsjb-node-25   <none>           <none>
    nginx-taints-548544bcdd-gn6wp   1/1     Running   0          10s   172.39.21.91     nccztsjb-node-25   <none>           <none>
    nginx-taints-548544bcdd-kdkfx   1/1     Running   0          10s   172.39.157.228   nccztsjb-node-24   <none>           <none>
    [root@nccztsjb-node-23 ~]# 

    可以发现,pod还是依然可以被调度到节点nccztsjb-node-23上的。即如果没有key,value,将operator设置为exists是一样的效果。这个设置可以容忍任何的taints.

    3.3、effect可以取哪些值

    • NoSchedule
    • PreferNoSchedule
    • NoExecure

    4、核心关注

    • taints定义在node上,拒绝pod的运行
    • toleration定义在pod上,让pod能够运行在标注了taint的node上。

    taints的主要目标:让pod避开那些不合适的node. (不合适的node标注上taints)

  • 相关阅读:
    Python 正则表达式入门
    使用numpy与matplotlib.pyplot画图
    快乐python 零基础也能P图 —— PIL库
    Jieba库使用和好玩的词云
    python运用turtle 画出汉诺塔搬运过程
    有进度条圆周率计算
    用pythen画五角星
    pytest+allure+requests-接口自动化测试
    pytest---allure测试报告
    自动化测试---pytest
  • 原文地址:https://www.cnblogs.com/chuanzhang053/p/15954071.html
Copyright © 2020-2023  润新知