zoukankan      html  css  js  c++  java
  • Kubernetes之Taints与Tolerations 污点和容忍

            NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。

            Taints(污点)是Node的一个属性,设置了Taints(污点)后,因为有了污点,所以Kubernetes是不会将Pod调度到这个Node上的,

           于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去

            因此 Taints(污点)通常与Tolerations(容忍)配合使用。

    1、设置污点:

     kubectl taint node [node] key=value[effect]   
          其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
           NoSchedule :一定不能被调度。
           PreferNoSchedule:尽量不要调度。
           NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
      示例:kubectl taint node 10.3.1.16 test=16:NoSchedule
    

      

    2、去除污点:

     比如设置污点:
         kubectl taint node 10.3.1.16 test=16:NoSchedule
         kubectl taint node 10.3.1.16 test=16:NoExecute
     去除指定key及其effect:
         kubectl taint nodes node_name key:[effect]-    #(这里的key不用指定value)
                    
     去除指定key所有的effect: 
         kubectl taint nodes node_name key-
     
     示例:
         kubectl taint node 10.3.1.16 test:NoSchedule-
         kubectl taint node 10.3.1.16 test:NoExecute-
         kubectl taint node 10.3.1.16 test-
     
    

     

    查看 node1 上的 taint:

    kubectl describe nodes node1
    

       

    3、Pod 容忍污点示例:

        首先给node设置个污点以观察调度效果:

     kubectl taint node 10.3.1.16 test=16:NoSchedule
    

       

        当pod没有设置容忍时被调度到10.3.1.17:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-taints
      labels:
        os: ubuntu
    spec:
      containers:
      - name: pod-tains
        image: 10.3.1.15:5000/ubuntu:16.04
     
    root@ubuntu:#kubectl create -f pod-taints.yaml
    pod "pod-taints" created
    ###
    root@ubuntu# kubectl get pod -o wide
    NAME       READY    STATUS  RESTARTS  AGE   IP        NODE
    pod-taints    1/1     Running   0     7s 192.168.77.216 10.3.1.17
    

      

     

       给Pod设置容忍:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-taints
      labels:
        os: ubuntu
    spec:
      tolerations: #设置容忍性
      - key: "test" 
       operator: "Equal"  #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal
       value: "16"
       effect: "NoSchedule"
      #意思是这个Pod要容忍的有污点的Node的key是test Equal 16,效果是NoSchedule,
      #tolerations属性下各值必须使用引号,容忍的值都是设置Node的taints时给的值。
     containers:
       - name: pod-tains
       image: 10.3.1.15:5000/ubuntu:16.04
     
    root@ubuntu15:/data/yaml# kubectl get pod -o wide
    NAME              READY     STATUS    RESTARTS   AGE       IP              NODE
    pod-taints        1/1       Running      0       3m    192.168.150.216   10.3.1.16
    
    #容忍后就立即调度到另外一个Node上了。需要在两个Node的Pod数量不平衡时才能看到效果。
    

      

     

    对于tolerations属性的写法:

         其中的key、value、effect 与Node的Taint设置需保持一致, 还有以下几点说明:

             1、如果operator的值是Exists,则value属性可省略。

             2、如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。

             3、如果不指定operator属性,则默认值为Equal。

        另外,还有两个特殊值:

             1、空的key 如果再配合Exists 就能匹配所有的key与value ,也是是能容忍所有node的所有Taints。

             2、空的effect 匹配所有的effect。

    一个node上可以有多个污点:

         比如     test=16:NoScheduler   test2=16:NoSchedule  

    而在Pod容忍时只容忍了其中一个:

    tolerations:
      - key: "test"
        operator: "Equal" 
        value: "16"
        effect: "NoSchedule"
    

      

     

    这样的结果是此Pod无法被调度到key为test的node( 10.3.1.16)上去,因为此Node上设置了两个污点,

    而这个Pod只匹配到了一个污点,也就是只容忍了一个污点,所以可以再加一个容忍:

     tolerations:
      - key: "test"
        operator: "Exists" 
        effect: "NoSchedule"
      - key: "test2"
        operator: "Equal"
        value: "16"
        effect: "NoSchedule"
     
    

       

            如果在设置node的Taints(污点)之前,就已经运行了一些Pod,那么这些Pod是否还能继续在此Node上运行? 这就要看设置Taints污点时的effect(效果)了。

           如果effect的值是NoSchedule或PreferNoSchedule,那么已运行的Pod仍然可以运行,只是新Pod(如果没有容忍)不会再往上调度。

           而如果effect的值是NoExecute,那么此Node上正在运行的Pod,只要没有容忍的,立刻被驱逐。

           虽然是立刻被驱逐,但是K8S为了彰显人性化,又给具有NoExecute效果的污点, 在容忍属性中有一个可选的

              tolerationSeconds字段,用来设置这些Pod还可以在这个Node之上运行多久,给它们一点宽限的时间,到时间才驱逐。

           如果是以Pod来启动的,那么Pod被驱逐后, 将不会再被运行,就等于把它删除了。

           如果是deployment/rc,那么删除的pod会再其它节点运行。

           如果是DaemonSet在此Node上启动的Pod,那么也不会再被运行,直到Node上的NoExecute污被去除或者Pod容忍。

    #设置Pod的宽限时间
    spec:
      tolerations: #设置容忍性
      - key: "test"
        operator: "Equal" #如果操作符为Exists,那么value属性可省略
        value: "16"
        effect: "NoExecute"
        tolerationSeconds: 180 
        #如果运行此Pod的Node,被设置了具有NoExecute效果的Taint(污点),这个Pod将在存活180s后才被驱逐。
        #如果没有设置tolerationSeconds字段,将永久运行。
       
    

      

           通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:

    给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,

    但是也不一定会调度给此特定Node,设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node

    只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里

    设置NodeAffinity到Node。如此就能达到要求了

    实例配置:

    kubectl get deployment  h5-weifeng -o yaml  -n xitu-pretest
    
    
    tolerations:
          - effect: NoSchedule
            key: xitu
            operator: Equal
            value: pretest
    

      

    kubectl describe  nodes  cn-hangzhou.172.16.1.236
    
    
    Taints:             xitu=pretest:NoSchedule
    

      

    kubectl get pod -n xitu-pretest -o wide 
    NAME                                                     READY   STATUS      RESTARTS   AGE    IP            NODE                       NOMINATED NODE
    
    mall-app-async-api-6c9d78c4b-msczt                       1/1     Running     0          19h    10.20.2.68    cn-hangzhou.172.16.1.236   <none>
    mall-audit-provider-5b7b5f4d5-559nf                      1/1     Running     1          47h    10.20.2.120   cn-hangzhou.172.16.1.236   <none>
    mall-basic-oss-web-567f7c6c76-h48kf                      1/1     Running     0          45h    10.20.2.23    cn-hangzhou.172.16.1.236   <none>
    

      

  • 相关阅读:
    使用SpringAOP获取一次请求流经方法的调用次数和调用耗时
    疫苗之殇与理性应对之道
    【做更好的职场人】理性、弹性、开放的沟通
    使用IntelljIDEA生成接口的类继承图及装饰器模式
    订单导出应对大流量订单导出时的设计问题
    预发和线上的自动化对比工具微框架
    从实战角度看如何构建高质量的软件:一线工程师的一份质量手记
    代码问题及对策
    若干设计经验教训小记
    输入输出无依赖型函数的GroovySpock单测模板的自动生成工具(上)
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/11810612.html
Copyright © 2011-2022 走看看