• k8s的高级调度方式


    默认的scheduler的调度过程:
    1.预选策略:从所有节点当中选择基本符合选择条件的节点。
    2.优选函数:在众多符合基本条件的节点中使用优选函数,计算节点各自的得分,通过比较进行排序。
    3.从最高得分的节点中随机选择出一个作为Pod运行的节点。
    可以通过自己的预设来影响预选、优选过程,从而实现符合我们期望的调度结果。

    影响调度方式:
        1.节点选择器:NodeSelector,甚至可以设置nodename来选择节点本身。
        2.亲和性调度:NodeAffinity(节点亲和性)、podAffinity(Pod亲和性)、PodAntiAffinity(Pod的反亲和性)
        3.污点和容忍度:Taint、toleration

    1.节点选择器:NodeSelector(pod.spec.nodeSelector)
        如果我们期望把Pod调度到某一个特定的节点上,可以通过设定Pod.spec.nodeName给定node名称实现。
        我们可以给一部分node打上特有标签,在pod.spec.nodeSelector中匹配这些标签。可以极大的缩小预选范围。
        给node添加标签:
        kubectl label nodes NODE_NAME key1=value1...keyN=valueN
        如:在node01上打上标签为app=frontend,而在pod上设置NodeSelector为这个标签,则此Pod只能运行在存在此标签的节点上。
            若没有node存在此标签,则Pod无法被调度,即为Pending状态。

    2.亲和性调度:Affinity(pod.spec.affinity)
        (1)节点亲和性:NodeAffinity(pod.spec.affinity.nodeAffinity)
             表示Pod更倾向被调度在与节点亲和度高的节点上
             pod.spec.affinity.nodeAffinity.下有两种定义方式:

     1 preferredDuringSchedulingIgnoreDuringExecution:软亲和性;不管节点上能否满足设定条件,Pod都可以被调度,只是Pod优先被调度到符合条件多的节点上。
     2 - preference:##与相应权重相关联的节点选择器项。
     3     matchExpressions:##按节点标签列出的节点选择器要求列表
     4     - key:     ##键
     5       operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
     6       values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
     7     matchFields:##按节点字段列出的节点选择器要求列表
     8     - key:     ##键
     9       operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
    10       values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
    11   weight:      ##权重,0~100的数值
     1 requiredDuringSchedulingIgnoreDuringExecution硬亲和性;节点必须满足设定条件,Pod才能被调度到这个节点。
     2   nodeSelectorTerms: ##节点选择器列表
     3   - matchExpressions:##按节点标签列出的节点选择器要求列表
     4     - key:     ##键
     5       operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
     6       values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
     7     matchFields:##按节点字段列出的节点选择器要求列表
     8     - key:     ##键
     9       operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
    10       values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。

             例:硬亲和性,pod只会被调度到存在zone=foo或zone=bar标签的节点上,若没有节点存在此标签,则pod将不会被调度到任何节点上,即为Pending状态。
    自主式pod的资源清单:            

     1 apiVersion: v1
     2 kind: Pod
     3 metadata:
     4   name: pod-node-affinity
     5   namespace: default
     6 spec:
     7   containers:
     8   - name: myapp
     9     image: kubernetes/myapp:v1
    10   affinity:
    11     nodeAffinity:
    12       requiredDuringSchedulingIgnoredDuringExecution:
    13         nodeSelectorTerms:
    14         - matchExpressions:
    15           - key: zone
    16             operator: In
    17             values:
    18             - foo
    19             - bar         

        (2)Pod亲和性:podAffinity(pod.spec.affinity.podAffinity)
            表示一组pod更倾向与运行在一起,一般需要高效通信时需要将pod与pod运行在相近的位置。
            第一个pod被调度到某一个节点,第二个pod会跟随第一个pod运行在同一个位置相近的节点上。
            同一个位置的节点不一定是同一个节点,这个节点可能是同一个命名空间、网段、机柜、机房、甚至同一个区域的某一个节点上。
            因为如果说,同一个节点上的资源不足时,pod被调度不到同一个节点,那么就会找与这个节点相近的某个节点上。
            节点相近是指节点到节点的网络路程较近。
            当然,若资源空间充足也可以实现让第二个Pod跟随第一个pod运行在同一个节点上。
            可以根据topologyKey设定的标签来判定拥有哪些标签的节点属于同一位置
            与节点亲和性一样,pod.spec.affinity.podAffinity.下也有两种定义方式:

     1 preferredDuringSchedulingIgnoreDuringExecution:软亲和性;不管节点上能否满足设定条件,Pod都可以被调度,只是Pod优先被调度到符合条件多的节点上。
     2   podAffinityTerm: ##定义一组pods(即与相对于此pod应位于(关联)或不在同一地点(反亲和力),在同一地点被定义为运行在一个节点上,其键<topologykey>的标签值与一组pods运行的任何节点
     3     labelSelector: ##根据标签选定一组pod作为亲和对象。
     4       matchExpressions:##标签选择器要求列表
     5       - key:     ##键
     6         operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
     7         values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
     8       matchLabels:##标签选择器要求列表
     9     namespaces:  ##指明选定的pod亲和对象是哪组名称空间下的,不指定则为第一个pod所运行的命名空间下。
    10     topologyKey: ##位置拓扑键,用来判定拥有哪些标签的节点是同一位置。
    11   weight:        ##权重,0~100的数值
    1 requiredDuringSchedulingIgnoreDuringExecution: 硬亲和性;必须满足设定条件。
    2 - labelSelector: ##根据标签选定一组pod作为亲和对象。
    3     matchExpressions:##标签选择器要求列表
    4     - key:     ##键
    5       operator:##表示键与一组值的关系。有效的运算符有:In、NotIn、Exist、DoesNotExsit。GT和LT
    6       values:  ##值;若operator为In或NotIn则值必须为非空;若operator为Exists或DoesNotExist则值必须为空;若operator为Gt或Lt则值必须有一个元素。
    7     matchLabels:##标签选择器要求列表
    8   namespaces:   ##指明选定的pod亲和对象是哪组名称空间下的,不指定则为第一个pod所运行的命名空间下。
    9   topologyKey:  ##位置拓扑键,用来判定拥有哪些标签的节点是同一位置。

        (3)Pod反亲和性:podAffinity(pod.spec.affinity.podAntiAffinity)
            意义与上面相反,区别是topologyKey一定不能是相同的。这里不再叙述
            一组pod具有反亲和性,则这组pod一定不会被调度到同一位置节点上。
            这里的同一位置与上面一样。
            资源清单只需将podAffinity改为podAntiAffinity即可,然后定义topologyKey。

    3.污点和容忍度:Taint、toleration(nodes.spec.taints)(pod.spec.tolerations)        
        污点就是定义在节点上的键值属性数据:三类:1.标签。2.注解。3.污点。
        其中,标签和注解可以在节点或pod上使用,而污点只能在节点上使用。
        污点主要是让节点拒绝那些不能容忍自己污点的pod的。
        而pod上可以定义容忍度,只要是节点上的污点是pod的容忍度的子集,则pod就可以运行在这个节点上。    
        taints是用在节点上的键值数据定义污点的,toleration是用在pod上的键值数据定义容忍度的。       
        
        污点:taints(nodes.spec.taints)
            在节点上定义污点:

    1 nodes.spec.taints.
    2            - effect:  ##当pod不能容忍污点时采取的措施是什么。
    3                NoSchedule:  ##仅影响调度过程,对现存的pod不产生影响;
    4                PreferNoSchedule:  ##柔性版的NoSchedule
    5                NoExecute:   ##不仅影响调度,而且影响现存pod对象,不容忍的pod对象将被驱逐;
    6              key:      ##键
    7              timeAdded:
    8              value:    ##值
    9 添加污点命令:kubectl taint node NODE_NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options]
    10 删除污点命令:kubectl taint node NODE_NAME KEY_NAME-

          
        容忍度:toleration(pod.spec.tolerations)
            在pod中定义容忍度:

    1 pod.spec.tolerations.
    2          - effect:  ##同上
    3            key:     ##同上
    4            value:   ##同上
    5            operator:##有效的运算符是Exists、Equal。默认为Equal。这样pod就可以容忍某一特定类别的污点
    6            tolerationSeconds:##若不能容忍污点,多长时间后被驱逐。
  • 相关阅读:
    Asm Instance Parameter Best Practice
    Real Application Testing Database Replay、SPA的价格和介绍
    11g OCM Upgrade Exam Tips
    如何在文本框输入框里按回车键,光标自动跳转到下一个文本框输入框或者是执行某按钮的提交?
    asp.net textbox回车变成按扭事件
    图片判断你的左脑发达还是右脑发达 (转)
    关于Oracle数据和对象的导入导出 [转]
    ajax web.config配置与发布
    批处理复制最新的文件夹里面的bmp文件到指定目录
    C#调用存储过程返回值
  • 原文地址:https://www.cnblogs.com/Smbands/p/10949478.html
Copyright © 2020-2023  润新知