zoukankan      html  css  js  c++  java
  • k8s 调度策略

    k8s 调度策略

    在调度的过程当中有3个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点

    • 节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
    • 节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
    • 节点选定:从优先级排序结果中挑选出优先级最高的节点运行Pod,当这类节点多于1个时,则进行随机选择

    常用预选策略

    预选策略 作用
    CheckNodeCondition 检查是否可以在节点报告磁盘、网络不可用或未准备好时将Pod调度其上
    HostName 如果Pod对象拥有spec.hostname属性,则检查节点名称字符串是否和该属性值匹配。
    PodFitsHostPorts Pod的spec.hostPort属性时,检查端口是否被占用
    MatchNodeSelector Pod的spec.nodeSelector属性时,检查节点标签
    NoDiskConflict Pod依赖的存储卷在此节点是否可用,默认没有启用
    PodFitsResources 检查节点上的资源(CPU、内存)可用性是否满足Pod对象的运行需求。
    PodToleratesNodeTaints Pod的spec.tolerations属性,仅关注NoSchedule和NoExecute两个效用标识的污点
    PodToleratesNodeNoExecuteTaints Pod的spec.tolerations属性,是否能接纳节点的NoExecute类型污点,默认没有启用
    CheckNodeLabelPresence 仅检查节点上指定的所有标签的存在性,默认没有启用
    CheckServiceAffinity 将相同Service的Pod对象放置在同一个或同一类节点上以提高效率,默认没有启用
    MaxEBSVolumeCount 检查节点已挂载的EBS(亚马逊弹性块存储)存储卷数量是否超过设置的最大值,默认为39
    MaxGCEPDVolumeCount 检查节点上已挂载的GCE PD(谷歌云存储) 存储卷数量是否超过最大值,默认为16
    MaxAzureDiskVolumeCount 检查节点上已挂载的Azure Disk存储卷数量是否超过最大值,默认为16
    CheckVolumeBinding 检查节点上已绑定和未绑定的PVC是否满足需求
    NoVolumeZoneConflict 在给定区域zone限制下,检查此节点部署的Pod对象是否存在存储卷冲突
    CheckNodeMemoryPressure 检查节点内存压力,如果压力过大,那就不会讲pod调度至此
    CheckPodePIDPressure 检查节点PID资源压力
    CheckNodeDiskPressure 检查节点磁盘资源压力
    MatchInterPodAffinity 检查节点是否满足Pod对象亲和性或反亲和性条件

    常用优先函数

    函数名称 详细说明
    LeastRequestedPriority 节点的优先级就由节点空闲资源与节点总容量的比值,即由(总容量-节点上Pod的容量总和-新Pod的容量)/总容量)来决定。 CPU和内存具有相同权重,资源空闲比越高的节点得分越高。 cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2
    BalancedResourceAllocation CPU和内存使用率越接近的节点权重越高,该策略不能单独使用,必须和LeastRequestedPriority组合使用,尽量选择在部署Pod后各项资源更均衡的机器。 如果请求的资源(CPU或者内存)需求大于节点的capacity,那么该节点永远不会被调度到。
    InterPodAffinityPriority 通过迭代 weightedPodAffinityTerm 的元素计算和,并且如果对该节点满足相应的PodAffinityTerm,则将 “weight” 加到和中,具有最高和的节点是最优选的。
    SelectorSpreadPriority 为了更好的容灾,对同属于一个service、replication controller或者replica的多个Pod副本,尽量调度到多个不同的节点上。 如果指定了区域,调度器则会尽量把Pod分散在不同区域的不同节点上。当一个Pod的被调度时,会先查找Pod对于的service或者replication controller, 然后查找service或replication controller中已存在的Pod,运行Pod越少的节点的得分越高。本质就是往运行同类pod少的节点上分配。
    NodeAffinityPriority 亲和性机制。Node Selectors(调度时将pod限定在指定节点上), 支持多种操作符(In, NotIn, Exists, DoesNotExist, Gt, Lt),而不限于对节点labels的精确匹配。 另外支持两种类型的选择器,一种是“hard(requiredDuringSchedulingIgnoredDuringExecution)”选择器, 它保证所选的主机必须满足所有Pod对主机的规则要求。 这种选择器更像是之前的nodeselector,在nodeselector的基础上增加了更合适的表现语法。 另一种是“soft(preferresDuringSchedulingIgnoredDuringExecution)”选择器, 它作为对调度器的提示,调度器会尽量但不保证满足NodeSelector的所有要求。
    NodePreferAvoidPodsPriority(权重1W) 如果 节点的 Anotation (注解信息)没有设置 key-value:scheduler. alpha.kubernetes.io/ preferAvoidPods = "...",则节点对该 policy 的得分就是10分, 加上权重10000,那么该node对该policy的得分至少10W分。如果Node的Anotation设置了, scheduler.alpha.kubernetes.io/preferAvoidPods = "..." ,如果该 pod 对应的 Controller 是 ReplicationController 或 ReplicaSet, 则该 node 对该 policy 的得分就是0分。
    TaintTolerationPriority 使用 Pod 中 tolerationList 与 节点 Taint 列表项进行匹配,配对成功的项越多,则得分越低。污点越匹配,得分越低
    ImageLocalityPriority 根据Node上是否存在一个pod的容器运行所需镜像大小对优先级打分,分值为0-10。遍历全部Node, 如果某个Node上pod容器所需的镜像一个都不存在,分值为0; 如果Node上存在Pod容器部分所需镜像,则根据满足当前需求的镜像的大小来决定分值,镜像越大,分值就越高;如果Node上存在pod所需全部镜像,分值为10。默认没有启用
    EqualPriority 是一个优先级函数,它给予所有节点相等权重。
    MostRequestedPriority 在 ClusterAutoscalerProvider 中,替换 LeastRequestedPriority,给使用多资源的节点,更高的优先级。 计算公式为: (cpu(10 sum(requested) / capacity) + memory(10 sum(requested) / capacity)) / 2默认没有启用

    实际中常用干预调度方式

    node 选择器

    指定 Pod 的 spec.nodeSelector 属性选择带有相应标签的节点

    node 亲和性调度

    节点亲和性规则:硬亲和性 required 、软亲和性 preferred。

    • 硬亲和性规则不满足时,Pod会置于Pending状态,软亲和性规则不满足时,会选择一个不匹配的节点
    • 当节点标签改变而不再符合此节点亲和性规则时,不会将Pod从该节点移出,仅对新建的Pod对象生效

    Pod 资源亲和调度

    pod亲和性规则:硬亲和性,软亲和性。 规则和节点亲和性调度的类似。

    Pod 反亲和调度

    Pod反亲和调度用于分散同一类应用,调度至不同的区域、机架或节点等。

    也分为硬反亲和性,软反亲和性,规则和前面的类似。

    污点和容忍度

    污点 taints 是定义在节点上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上,除非Pod有接纳节点污点的容忍度容忍度 tolerations 是定义在Pod上的键值属性数据,用于配置可容忍的污点,且调度器将Pod调度至其能容忍该节点污点的节点上或没有污点的节点上

    污点定义于nodes.spec.taints,语法: key=value:effect

    effect定义排斥等级:

    • NoSchedule,不能容忍,但仅影响调度过程,已调度上去的pod不受影响,仅对新增加的pod生效。
    • PreferNoSchedule,柔性约束,节点现存Pod不受影响,如果实在是没有符合的节点,也可以调度上来
    • NoExecute,不能容忍,当污点变动时,Pod对象会被驱逐

    容忍度定义于pods.spec.tolerations

    在Pod上定义容忍度时:

    • 等值比较 容忍度与污点在key、value、effect三者完全匹配
    • 存在性判断 key、effect完全匹配,value使用空值
    # 等值判断
    tolerations:
    - key: "key1"
      operator: "Equal"  #判断条件为Equal
      value: "value1"
      effect: "NoExecute"
      tolerationSeconds: 3600
     
    # 存在性判断
    tolerations:
    - key: "key1"
      operator: "Exists"    #存在性判断,只要污点键存在,就可以匹配
      effect: "NoExecute"
      tolerationSeconds: 3600
    

    一个节点可配置多个污点,一个Pod也可有多个容忍度

  • 相关阅读:
    设计模式详解(图码)
    设计模式详解(图)
    Zookeeper学习
    取消单元格的点击事件
    ios 中生成随机数
    IOS 时间和时间戳之间转化
    偏好存空判断
    限制textfield的文字长度
    tabBar的图标不被系统渲染
    (转)IOS http请求的get 和 post的请求的区别
  • 原文地址:https://www.cnblogs.com/leffss/p/14866060.html
Copyright © 2011-2022 走看看