美文网首页
Kubernetes对Pod调度指定Node以及Node的Tai

Kubernetes对Pod调度指定Node以及Node的Tai

作者: Maxwell_Dncey | 来源:发表于2019-12-03 12:07 被阅读0次

    1.指定pod到指定的node上

    #1.1查看节点的lebel
    kubectl get nodes --show-labels
    
    #1.2获取到该节点的label信息
    ip-10-100-2-80     Ready    <none>   60d   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=ip-10-100-2-80,kubernetes.io/os=linux
    
    #1.3也可通过自己设置label
    kubectl label nodes <node-name> <label-key>=<label-value>
    
    #1.4在配置文件spec下面添加
    spec:
      nodeSelector:
          kubernetes.io/hostname: ip-10-100-2-80
    
    

    2.Taint 和 Toleration

    2.1. 概念

    • nodeSelector可以通过打标签的形式让Pod被调度到指定的Node上,Taint则相反,它使节点能够排斥一类特定的Pod,除非Pod被指定了toleration的标签。(taint即污点,Node被打上污点;只有容忍[toleration]这些污点的Pod才可能被调度到该Node)。

    2.2 effect的类型

    NoSchedule:只有拥有和这个 taint 相匹配的 toleration 的 pod 才能够被分配到这个节点。

    PreferNoSchedule:系统会尽量避免将 pod 调度到存在其不能容忍 taint 的节点上,但这不是强制的。

    NoExecute :任何不能忍受这个 taint 的 pod 都会马上被驱逐,任何可以忍受这个 taint 的 pod 都不会被驱逐。Pod可指定属性 tolerationSeconds 的值,表示pod 还能继续在节点上运行的时间。

    tolerations:
    - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoExecute"
    tolerationSeconds: 3600
    

    2.3 kubectl taint

    # 给节点增加一个taint(污点),它的key是<key>,value是<value>,effect是NoSchedule。
    kubectl taint nodes <node_name> <key>=<value>:NoSchedule
    
    #删除节点上的taint。
    kubectl taint nodes node1 key:NoSchedule-
    
    

    2.4 只有拥有和这个taint相匹配的toleration的pod才能够被分配到 node_name 这个节点。

    例如,在 PodSpec 中定义 pod 的 toleration:
    #operator:Equal 会比较key和value
    #operator:Exists 只要含有key就会容忍该污点
    
    tolerations:
    - key: "key"
      operator: "Equal"
      value: "value"
      effect: "NoSchedule"
    
    tolerations:
    - key: "key"
      operator: "Exists"
      effect: "NoSchedule"
    
    #容忍所有含污点的node
    tolerations:
    - operator: "Exists"
    
    #容忍所有key相同的,忽视effect
    tolerations:
    - key: "key"
      operator: "Exists"
    

    2.3. 使用场景

    2.3.1. 专用节点

    kubectl taint nodes <nodename> dedicated=<groupName>:NoSchedule
    

    先给Node添加taint,然后给Pod添加相对应的 toleration,则该Pod可调度到taint的Node,也可调度到其他节点。

    如果想让Pod只调度某些节点且某些节点只接受对应的Pod,则需要在Node上添加Label(例如:dedicated=groupName),同时给Pod的nodeSelector添加对应的Label。

    2.3.2. 特殊硬件节点

    如果某些节点配置了特殊硬件(例如CPU),希望不使用这些特殊硬件的Pod不被调度该Node,以便保留必要资源。即可给Node设置taint和label,同时给Pod设置toleration和label来使得这些Node专门被指定Pod使用。

    kubectl taint

    kubectl taint nodes nodename special=true:NoSchedule 
    # 或者
    kubectl taint nodes nodename special=true:PreferNoSchedule
    

    2.3.3. 基于taint驱逐

    effect 值 NoExecute ,它会影响已经在节点上运行的 pod,即根据策略对Pod进行驱逐。

    如果 pod 不能忍受effect 值为 NoExecute 的 taint,那么 pod 将马上被驱逐
    如果 pod 能够忍受effect 值为 NoExecute 的 taint,但是在 toleration 定义中没有指定 tolerationSeconds,则 pod 还会一直在这个节点上运行。
    如果 pod 能够忍受effect 值为 NoExecute 的 taint,而且指定了 tolerationSeconds,则 pod 还能在这个节点上继续运行这个指定的时间长度。

    相关文章

      网友评论

          本文标题:Kubernetes对Pod调度指定Node以及Node的Tai

          本文链接:https://www.haomeiwen.com/subject/wxdcgctx.html