调度策略

k8s的调度策略分为predicates(预选策略)和priorites(优选策略),整个调度过程分俩步

  • 预选策略,predicates是强制性规则,遍历所有的node节点,安装具体的预选策略筛选出符合要求的node列表,如果没有node符合predicates策略规则,那么pod就会被挂起,直到有node能够满足
  • 优选策略,在第一步筛选的基础上,按照优选策略为待选node打分排序,获取最优者

预选策略–必须全部满足

  1. CheckNodeCondition:检测node是否正常
  2. GeneralPredicates:普通判断策略
    1. HostName: 检测pod对象是否定义了pod.spec.hostname
    2. PodFitsHostPorts:检测pods.spec.containets.ports.hostPort是否定义
    3. MatchNodeSelector:检测pod是否设置了pods.spec.nodeSelector
    4. PodFitsResources:检测pod的资源需求是否能被节点所满足
  3. NoDiskConflict:检测pod依赖的存储卷是否能满足需求
  4. PodToleratesNodeTaints: 检测pod上的spec.tolerations可容忍的污点是否完全包含节点上的污点
  5. PodToleratesNodeNoExecuteTaints: 检测pod上是否启用了NoExecute级别的污点,默认没有启用
  6. CheckNodeLabelPresence: 检测node上的标签的存在与否,默认没有启用
  7. CheckServiceAffinity:将相同service pod的对象放到一起,默认没有启用
  8. CheckVolumeBinding:检测节点上已绑定和未绑定的volume
  9. NoVolumeZoneConflict:检测区域,是否有pod volume的冲突
  10. CheckNodeMemoryPressure:检测内存节点是否存在压力
  11. CheckNodePIDPressure:检测pid资源的情况
  12. CheckNodeDiskPressure:检测disk资源压力
  13. MatchInterPodAffity:检测pod的亲和性
  14. 下面的几个策略一般用不上(EBS,GCE,Azure)对这几个云厂商的
  15. MaxEBSVolumeCount: 确保已挂载的EBS存储卷不超过设置的最大值,默认39
  16. MaxGCEPDVolumeCount: 确保已挂载的GCE存储卷不超过设置的最大值,默认16
  17. MaxAzureDiskVolumeCount: 确保已挂载的Azure存储卷不超过设置的最大值,默认16

优选策略

优选函数的评估: 如果一个pod过来,会根据启用的全部函数的得分相加得到的评估

  1. LeastRequested:最少请求,与节点的总容量的比值,

    计算公式:
    (cpu((capacity-sum(requested))*10 / capacity)+memory((capacity-sum(requested))*10 / capacity)) / 2
  2. BalancedResourceAllocation:cpu和内存资源被占用的比率相近程度,越接近,比分越高,平衡节点的资源使用情况,
    计算公式:
    cpu=cpu((capacity-sum(requested))*10 / capacity)
    mem=memory((capacity-sum(requested))*10 / capacity)
  3. NodePreferAvoidPods:在这个优先级中,优先级最高,得分非常高
    根据节点的注解信息“scheduler.alpha.kubernetes.io/preferAvoidPods”
  4. TaintToleration:将pod对象的spec.tolertions与节点的taints列表项进行匹配度检测,匹配的条目越多,得分越低
  5. SeletorSpreading:尽可能的把pod分散开,也就是没有启动这个pod的node,得分会越高
  6. InterPodAffinity:遍历pod的亲和性,匹配项越多,得分就越多
  7. NodeAffinity:节点亲和性,亲和性高,得分高
  8. MostRequested:空闲量越少的,得分越高,与LeastRequested不能同时使用,集中一个机器上面跑pod,默认没有启用
  9. NodeLabel:根据node上面的标签来评估得分,有标签就有分,没有标签就没有分,默认没有启用
  10. ImageLocality:一个node的得分高低,是根据node上面是否有镜像,有镜像就有得分,反之没有(根据node上已有满足需求的image的size的大小之和来计算。),默认没有启用

高级调度

Toleration(容忍)
operator可以定义为:
	Equal:表示key是否等于value,默认
	Exists:表示key是否存在,此时无需定义value

tain 的 effect 定义对 Pod 排斥效果
	NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
	NoExecute:既影响调度过程,也影响显著的Pod对象;不容忍的Pod对象将被驱逐
	PreferNoSchedule: 表示尽量不调度

#实例:
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule" 
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
- key: "node.alpha.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000(当 pod 需要被驱逐时,可以继续在 node 上运行的时间)
	
Tain(污点)和label(标签)
kubectl taint nodes node1 key1=value1:NoSchedule


节点打标签:
kubectl label nodes kube-node node=kube-node
kubectl get node -a -l "node=kube-node"
删除标签:
kubectl label nodes 1.1.1.1 role-
Affinity(亲和性)
Affinity
	podAntiAffinity
	podAffinity
	nodeAffinity
	概要
		labelSelector : 选择跟那组Pod亲和
		namespaces : 选择哪个命名空间
		topologyKey : 指定节点上的哪个键
		matchExpressions :匹配表达式,这个标签可以指定一段,例如pod中定义的key为zone,perator为In(包含那些),values为foo和bar。就是在node节点中包含foo和bar的标签中调度
		matchFields : 匹配字段 和上面的意思 不过他可以不定义标签值,可以定义

#实例:
#Pod软反亲和性:
当应用服务A和数据库服务B要求尽量不要在同一台节点上的时候。

  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - {key: app, operator: In, values: ["myapp"]}
        topologyKey: kubernetes.io/hostname #按照hostname的不同来分配


#Pod硬反亲和性:
pod不能分配在同一台机器上,按照topologyKey来区分机器是否相同

  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - {key: app, operator: In, values: ["myapp"]}
        topologyKey: zone 

#Pod亲和性,
k8s节点分布在不同的机房或者区域,使用亲和性来做调度
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - {key: app, operator: In, values: ["myapp"]}
        topologyKey: kubernetes.io/hostname

#node硬亲和:
选择在 node 有 zone 标签值为 foo 或 bar 值的节点上运行 pod

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
#node软亲和:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - preference:
          matchExpressions:
          - key: zone
            operator: In
            values:
            - foo
            - bar
        weight: 60
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐