kubernetes 调度器——亲和性

网友投稿 789 2022-11-03

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

kubernetes 调度器——亲和性

Kubernetes调度说明:

Scheduler是Kubernetes的调度器,也是非常重要的一个模块,总结一句话概括。调度器就是把Pod分配到合适的Node节点上。

Kubernetes调度过程:

调度过程可以分为两部分:

1、过滤:将不满足条件的直接pass掉,称为predicate。

2、打分:在调度过程会根据优先级排序,称为priority。

3、最后会从中选择优先级高的节点。如果中间有任何一个步骤错误,都会直接返回错误。

Predicate有一系列的算法可以使用:

PodFitsResources :节点上剩余的资源是否大于 pod 请求的资源PodFitsHost :如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配PodFitsHostPorts :节点上已经使用的 port 是否和 pod 申请的 port 冲突PodSelectorMatches :过滤掉和 pod 指定的 label 不匹配的节点NoDiskConflict :已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读

如果在 predicate 过程中没有合适的节点,pod 会一直在  pending  状态,不断重试调度,直到有节点满足条件。经过这个步骤,如果有多个节点满足条件,就继续 priorities 过程:按照优先级大小对节点排序

优先级由一系列键值对组成,键是该优先级项的名称,值是它的权重(该项的重要性)。这些优先级选项包括:

LeastRequestedPriority :通过计算 CPU 和 Memory 的使用率来决定权重,使用率越低权重越高。换句话说,这个优先级指标倾向于资源使用比例更低的节点BalancedResourceAllocation :节点上 CPU 和 Memory 使用率越接近,权重越高。这个应该和上面的一起使用,不应该单独使用ImageLocalityPriority  :倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高

通过算法对所有的优先级项目和权重进行计算,得出最终的结果

自定义调度器:

除了 kubernetes 自带的调度器,你也可以编写自己的调度器。通过 spec:schedulername 参数指定调度器的名 字,可以为 pod 选择某个调度器进行调度。比如下面的 pod 选择 my-scheduler 进行调度,而不是默认的 default-scheduler :

Node Affinity

Affinity 翻译中文为“亲和性”,它对应的是 Anti-Affinity,我们翻译成“互斥”。

Affinity的优点:

匹配有更多的逻辑组合,不只是字符串的完全相等。调度分成软策略(soft)和硬策略(hard),在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度。

node/pod Affinity:

preferredDuringSchedulingIgnoredDuringExecution: 软策略首选 比较喜欢

requiredDuringSchedulingIgnoredDuringExecution: 硬策略 需要 必修

键值运算关系:

In:label的值在某个列表中NotIn:label的值不在某个列表中Gt:label的值大于某个值Lt:label的值小于某个值Exists:某个label存在DoesNotExist:某个label不存在

node节点亲和性: nodeAffinity

硬策略:

软策略:

Pod亲和性 podAffinity

requiredDuringSchedulingIgnoredDuringExecution:硬策略

kubectl label pod podname app=label --overwrite=true

亲和性/反亲和性调度策略比较

污点(Taint)和容忍(Toleration)

污点:污点和节点亲和性恰好相反,亲和性是用于吸引Pod,而污点能够是节点排斥的一类Pod。假设:一个人去相亲要求相亲对象不能够会打呼噜,这就是一个污点。

有污点那就有接受的一方,那就是容忍。容忍和污点是相互配合的,可以用来避免Pod被分配到不适合的Pod上。每一个节点上都有一个或多个融合和污点。在K8s master节点上默认有个污点是Noschedule如下图所示:

使用kubectl taint 命令可以给Node节点设置污点,Node被设置上了污点就会相互排斥。每个污点都有一个value和key作为污点标签,当前污点支持三个选项:

NoSchedule:表示K8s将不会将Pod调度到具有该污点的Node上。PreferNoSchedule:表示K8s将尽量避免将Pod调度到具有该污点的Node上。NoExecute:表示K8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经在的Pod驱逐出去。

容忍(Tolerations)

tolerations:  #containers同级

- key: "check"  #能容忍的污点key

  operator: "Equal"   #Equal等于表示key=value Exists不等于,表示当值不等于下面value正常

  value: "guozig"   #

  effect: "NoExecute"  #effect策略

   tolerationSeconds: 3600  #原始的pod多久驱逐,注意只有effect: "NoExecute"才能设置,不然报错

注:key,value,effect要与Node上设置的taint保持一致。operator的值为Exists将会忽略value值。TolerationSeconds用于描述当Pod需要被驱逐是可以在Pod上继续保留运行的时间。

如下:

1、  当不指定 key 值时,表示容忍所有的污点 key:

tolerations:

- operator: "Exists"

2、当不指定 effect 值时,表示容忍所有的污点作用

tolerations:

- key: "key"

   operator: "Exists"

3、有多个 Master 存在时,防止资源浪费,可以如下设置

kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

PreferNoSchedule

尽可能不在该节点上运行,只有当节点资源不够用才运行

固定调度节点

固定调度节点通俗点就是强制要求匹配规则,会跳过Secheduler和Deployment的调度策略。如下:

Deployment控制器

StatefulSet控制器

总结:本文章主要介绍通过一些实例进行介绍一些调度器的功能。

注明:需要详解K8s可以访问:https://kubernetes.io/zh/

上一篇:软件测试培训之测试用例设计的5大误区
下一篇:软件测试培训之移动APP测试怎么避免Bug漏测?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~