Kubernetes使用节点亲缘性将POD调度到特定节点上小家电维修

节点污点可以用来让pod远离特定的节点,尽量在不修改已有pod信息的前提,通过在节点添加污点信息,来拒绝pod在某些节点上的部署。

而现在介绍一种叫做节点亲缘性,通过明确的在pod中添加的信息,来决定一个pod可以或者不可以被调度到哪些节点上。

对比节点亲缘性和节点选择器

在早期版本的Kubernetes中,初始的节点亲缘性机制,就是pod描述中的nodeSelector字段。节点必须包含所有pod对应字段中的指定label,才能成为pod调度的目标节点。

节点选择器实现简单,但是它不能满足你的所有需求。正因为如此,一种更强大的机制被引入。节点选择器最终会被弃用,所以现在了解新的节点亲缘性机制就变得重要起来。

与节点选择器类似,每个pod可以定义自己的节点亲缘性规则。这些规则可以允许指定硬性限制或者偏好。如果指定一种偏好的话,你将告知Kubernetes对于某个特定的pod,它更倾向于调度到某些节点上,之后Kubernetes将尽量把这个pod调度到这些节点上面。如果没法实现的话,pod将被调度到其他某个节点上。

检查默认的节点标签

节点亲缘性根据节点的标签来进行选择,这点跟节点选择器是一致的。现在检查一个GoogleKubernetes引擎集群(GKE)中节点的标签,来看一下它们默认的标签是什么,如以下代码所示。

#代码16.7GKE节点的默认标签$kubectldescribenodegke-kubia-default-pool-db274c5a-mjnfName:gke-kubia-default-pool-db274c5a-mjnfRole:Labels:beta.kubernetes.io/arch=amd64beta.kubernetes.io/fluentd-ds-ready=truebeta.kubernetes.io/instance-type=f1-microbeta.kubernetes.io/os=linuxcloud.google.com/gke-nodepool=default-poolfailure-domain.beta.kubernetes.io/region=europe-west1#最后这三个标签对于节点亲缘性来说最为重要failure-domain.beta.kubernetes.io/zone=europe-west1-dkubernetes.io/hostname=gke-kubia-default-pool-db274c5a-mjnf这个节点有很多标签,但涉及节点亲缘性和pod亲缘性时,最后三个标签是最重要的。这三个标签的含义如下:

这三个以及其他标签,将被用于pod亲缘性规则。在第三章中,你己经学会如何给一个节点添加自定义标签,并且在pod的节点选择器中使用它。可以通过给pod加上节点选择器的方式,将节点部署到含有这个自定义标签的节点上。现在,你将学习到怎么用节点亲缘性规则实现同样的功能。

有这么一个例子,使用了节点选择器使得需要GPU的pod只被调度到有GPU的节点上。包含了nodeSelector字段的pod描述如以下代码所示。

#代码16.8使用了节点选择器的pod:kubia-gpu-nodeselector.yamlapiVersion:v1kind:Podmetadata:name:kubia-gpuspec:nodeSelector:gpu:"true"containers:-image:luksa/kubia#这个pod会被调度到包含了gpu=true标签的节点上name:kubianodeSelector字段表示,pod只能被部署在包含了gpu=true标签的节点上。如果将节点选择器替换为节点亲缘性规则,pod定义将会如以下代码清单所示。

#代码16.9使用了节点亲缘性规则的pod:kubia-gpu-nodeaffinity.yamlapiVersion:v1kind:Podmetadata:name:kubia-gpuspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:gpuoperator:Invalues:-"true"containers:-image:luksa/kubianame:kubia首先会注意到的是,这种写法比简单的节点选择器要复杂得多,但这是因为它的表达能力更强,再详细看一下这个规则。

较长的节点亲缘性属性名的意义

把这个名字分成两部分,然后分别看下它们的含义:

目前,当你知道当前的亲缘性规则只会影响正在被调度的pod,并且不会导致己经在运行的pod被剔除时,情况可能会更简单一些。这就是为什么目前的规则都是以IgnoredDuringExecution结尾的。最终,Kubernetes也会支持RequiredDuringExecution,表示如果去除掉节点上的某个标签,那些需要节点包含该标签的pod将会被剔除,但是,Kubernetes目前还不支持次特性。所以,可以暂时不去关心这个长字段的第二部分。

了解节点选择器条件

记住上一节所解释的内容,将更容易理解nodeSelectorTerms和matchExpressions字段,这两个字段定义了节点的标签必须满足哪一种表达式,才能满足pod调度的条件。样例中的单个表达式比较容易理解,节点必须包含一个叫作gpu的标签,并且这个标签的值必须是true。

因此,这个pod只会被调度到包含gpu=true的节点上。如图16.2所示。

现在,更有趣的部分来了,节点亲缘性也可以在调度时指定节点的优先级,将在接下来的部分看到。

最近介绍的节点亲缘性的最大好处就是,当调度某一个pod时,指定调度器可以优先考虑哪些节点,这个功能是通过preferredDuringSchedulingIgnoredDuringExecution字段来实现的。

想象一下拥有一个跨越多个国家的多个数据中心,每一个数据中心代表了一个单独的可用性区域。在每个区域中,有一些特定的机器,只提供给你自己或者你的合作公司使用。现在,你想要部署一些pod,希望将pod优先部署在区域zone1,并且是为你公司部署预留的机器上。如果你的机器没有足够的空间用于这些pod,或者出于其他一些重要的原因不希望这些pod调度到上面,那么就会调度到其他区域的其他机器上面,这种情况你也是可以接受的。节点亲缘性就可以实现这样的功能。

给节点加上标签

首先,节点必须加上合适的标签。每个节点需要包含两个标签,一个用于表示所在的这个节点所归属的可用性区域,另一个用于表示这是一个独占的节点还是一个共享的节点。

在接下来假设双节点的集群环境,将使用这个集群中的两个工作节点,当然也可以使用GKE或者其他多节点的集群。

首先,给这些节点加上标签,如以下代码所示。

#代码16.10给节点加上标签$kubectllabelnodenode1.k8savailability-zone=zone1node"node1.k8s"labeled$kubectllabelnodenode1.k8sshare-type=dedicatednode"node1.k8s"labeled$kubectllabelnodenode2.k8savailability-zone=zone2node"node2.k8s"labeled$kubectllabelnodenode2.k8sshare-type=sharednode"node2.k8s"labeled$kubectlgetnode-Lavailability-zone-Lshare-typeNAMESTATUSAGEVERSIONAVAILABILITY-ZONESHARE-TYPEmaster.k8sReady4dv1.6.4node1.k8sReady4dv1.6.4zone1dedicatednode2.k8sReady4dv1.6.4zone2shared指定优先级节点亲缘性规则

当这些节点的标签设置好,现在可以创建一个Deployment,其中优先选择zone1中的dedicated节点。下面的代码清单显示了这个Deployment的描述。

#代码16.11含有优先级节点亲缘性规则的Deployment:preferred-deployment.yamIapiVersion:extensions/v1beta1kind:Deploymentmetadata:name:prefspec:replicas:5template:metadata:labels:app:prefspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:#指定优先级,这不是必需的-weight:80#这块是节点有限调度到zone1,这是最重要的偏好preference:matchExpressions:-key:availability-zoneoperator:Invalues:-zone1-weight:20#同时优先调度pod到独占节点,但是该优先级为zone1优先级的1/4preference:matchExpressions:-key:share-typeoperator:Invalues:-dedicatedcontainers:-args:-sleep-"99999"image:busyboxname:main查看上面的代码清单,定义了一个节点亲缘性优先级,而不是强制要求(后面会讲解)。想要pod被调度到包含标签availability-zone=zone1以及share-type=dedicated的节点上。第一个优先级规则是相对重要的,因此将其weight设置为80,而第二个优先级规则就不那么重要(weight设置为20)。

了解节点优先级是如何工作的

如果集群包含多个节点,当调度上面的代码中的Deploymentpod时,节点将会分成4个组,如图16.3所示。那些包含availability-zone以及share-type标签,并且匹配pod亲缘性的节点,将排在最前面。然后,由于pod的节点亲缘性规则配置的权重,接下来是zone1的shared节点,然后是其他区域的dedicated节点,优先级最低的是剩下的其他节点。

在一个包含两个节点的集群中部署节点

如果在一个包含两个节点的集群中创建该部署,看到的最多的应该是pod被部署在了node1上面。检查下面的代码清单看情况是否属实。

#代码16.12查看pod调度情况$kubectlgetpo-owideNAMEREADYSTATUSRESTARTSAGEIPNODEpref-607515-1rnwv1/1Running04m10.47.0.1node2.k8spref-607515-27wp01/1Running04m10.44.0.8node1.k8spref-607515-5xd0z1/1Running04m10.44.0.5node1.k8spref-607515-jx9wt1/1Running04m10.44.0.4node1.k8spref-607515-mlgqm1/1Running04m10.44.0.6node1.k8s5个pod被创建,其中4个部署在了node1,1个部署在了node2。为什么会有1个pod会被调度到node2而不是node1原因是除了节点亲缘性的优先级函数,调度器还是使用其他的优先级函数来决定节点被调度到哪。其中之一就是SelectorSpreadPriority函数,这个函数确保了属于同一个ReplicaSet或者Service的pod,将分散部署在不同节点上,以避免单个节点失效导致这个服务也宕机。这就是有1个pod被调度到node2的最大可能。

可以去试着扩容部署至20个实例或更多,将看到大多数的pod被调度到node1。如果没有设置任何节点亲缘性优先级,pod将会被均匀地分配在两个节点上面。

上面也简单介绍了简单的原理以及过程,现在介绍更多的规则以及案例。

节点亲和调度分成软策略(soft)和硬策略(hard),在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度。

表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行。

表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中RequiredDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,则重新选择符合要求的节点。

表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。

表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中RequiredDuringExecution表示如果后面节点标签发生了变化,满足了条件,则重新调度到满足条件的节点。

再来一个官方示例

apiVersion:v1kind:Podmetadata:name:with-node-affinityspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/e2e-az-nameoperator:Invalues:-e2e-az1-e2e-az2preferredDuringSchedulingIgnoredDuringExecution:-weight:1preference:matchExpressions:-key:another-node-label-keyoperator:Invalues:-another-node-label-valuecontainers:-name:with-node-affinityimage:gcr.io/google_containers/pause:2.0这个pod同时定义了requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution两种nodeAffinity。第一个要求pod运行在特定AZ的节点上,第二个希望节点最好有对应的another-node-label-key:another-node-label-value标签。

这里的匹配逻辑是label在某个列表中,可选的操作符有:

如果nodeAffinity中nodeSelector有多个选项,节点满足任何一个条件即可;如果matchExpressions有多个选项,则节点必须同时满足这些选项才能运行pod。

THE END
1.智能化APP:重塑生活方式的科技力量智能化APP:重塑生活方式的科技力量 在科技日新月异的今天,智能化APP已经成为我们生活中不可或缺的一部分。这些应用通过集成先进的人工智能技术,为我们提供了前所未有的便捷与乐趣。本文将深入探讨智能化APP如何重塑我们的生活方式,以及它们在不同领域中的应用和影响。http://test.pbids.com/aboutUs/pbidsNews/1861318279199506432
2.智能家居系统中的控制应用程序用户体验与技术创新探究总结来说,控制智能家电app作为一个核心组件,其重要性不仅在于它能够让我们更方便地管理我们的住宅,更在于它代表了一种从被动接受到主动参与自我空间配置转变的人类行为态度。此外,这项技术还预示着未来的许多可能性,比如真正意义上的“无缝”城市生态环境,以及对于老年人或残疾人的特殊支持需求。这是一个值得深入探讨的https://www.vzern3xsg.cn/zhi-neng/458550.html
3.开发维修小程序:从用户需求到功能实现,打造便捷维修服务预约系统开发维修小程序是一项系统且繁琐的工作。这需要从用户需求着手,进行功能模块的规划,设计合适的界面,以及后台的管理和运营等多个环节。最终目的是为了给用户带来方便的维修服务预约和维修人员安排等功能。未来的维修服务需兼顾用户对时间的需求。这些不同的需求将直接决定https://m.bjhwtx.com/h-nd-381025.html
4.用户操作习惯对设计控制智能家电App有何影响随着科技的飞速发展,智能家居已经成为人们生活中不可或缺的一部分。控制智能家电的App是连接我们与这些高科技设备之间的桥梁,它不仅提供了远程操控功能,还可以通过数据分析帮助我们更好地管理和优化我们的日常生活。然而,为了确保App能够顺利运行并满足用户需求,设计者需要深入理解和考虑用户操作习惯。 https://www.fmovhaqkz.com/zhi-neng/484293.html
5.新一代服务者探索自助接单app对社会影响的深度在当今这个快速发展的时代,科技不断推陈出新,对人们生活方式产生着越来越大的影响。装修行业也不例外,在技术与互联网的双重驱动下,一款颇受关注的应用程序——装修工人自己接单的app,引起了广泛讨论。本文将从多个角度探讨这一创新产品带来的社会影响。 首先,我们必须https://www.6pc9d0c0gh.cn/ce-ping/469847.html
6.智慧居家新篇章全屋智能系统的魅力与实用性智能家装全屋智能系统是指通过集成多种先进技术,如物联网、人工智能、大数据等,实现家庭设备自动化控制和管理的一系列解决方案。随着科技的不断进步,全屋智能系统越来越成为现代家庭生活中不可或缺的一部分。 全屋智能系统的主要功能与优势 节能环保:通过远程控制电器开关,减少不必要的能源消耗,提高能源利用效率。 https://www.9b25r8e8ur.cn/ke-ji/46623.html
7.提供上门安装售后维修等服务,并有三包承诺。下列刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供海尔家电为该公司生产销售的电冰箱提供上门安装、售后维修等服务,并有三包承诺。下列说法不正确的是()A.售后维修属于附加产品B.冰箱的外观式样属于核心产品C.公司承诺属于附加产品D.空调机品牌属于https://www.shuashuati.com/ti/2c281d666a1d4a308703c8238c76c7d3.html?fm=bdbdsa6b01543c6fdadeeb77a121c036181fe
8.附近家电维修店铺地址位置车友交流懂车帝提供附近家电维修店铺地址位置的车友交流详细内容,懂车帝是一个汽车资讯平台,懂车更懂你。我们提供最新汽车报价,汽车图片,汽车价格大全,行情、评测、导购等内容,看车选车买车就上懂车帝。https://www.dongchedi.com/tag/ugc/15651878
9.8点1氪丨淄博大量烧烤店铺转让;iPhone15系列电池容量曝光;?北京市市场监督管理局日前起草的《北京市家用电器维修服务明码标价规定(征求意见稿)》提出,家电维修服务的项目、内容、价格及计价方法都应明码标价,不得在标价之外加价提供服务或出售相关产品。《规定》公开征集意见时间为2023年6月30日至7月30日。(上海证券报) https://36kr.com/p/2331938336136835
10.冰箱eeprom故障(冰箱eeprom故障是什么意思)单片机作为计算机发展的一个重要分支领域,根据目前发展情况,从不同角度单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。 通用型/专用型 这是按单片机适用范围来区分的。例如,80C51是通用型单片机,它不是为某种专用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体http://dppzs.com/mianfeifabu/261753.html
11.家电维修技术探讨家电绝对是我们日常生活中不可或缺的一部分。当这些家电出现问题时,我们常常感到无助和困惑。本文旨在讨论家电维修技术的重要性,通过提供有效的解决方案,帮助读者更好地理解和应对家电故障。 文章结构: I. 家电维修的重要性 A. 家电对我们生活的影响 B. 维修技术的发展对家电维护的意义 http://www.skywxnj.com/article/293438.html
12.电脑知识“菜鸟请进”(本人用N多时间整理)电脑知识“菜鸟请进”(本人用N多时间整理),家电维修论坛家电维修论坛,家电维修技术https://www.chinadz.com/news__282146.html
13.大兵十年家电经验爆料:关于滚筒洗衣机,你想知道的都在这里了作者:家电大兵Bingo 正文 洗衣机算得上是家电界的“元老”了,发明至今已有近150年的历史。从十九世纪的木制手摇“洗衣机”到如今在信息技术的加持下,洗衣机朝着更高效、更节能、更稳定、更智能的方向不断发展。 曾经有人说过:“懒惰是人类科技进步的巨大驱动力”,在家电界尤其适用。但是这句话非常没有情商,什么http://www.zzfmdn.com/article/1254855
14.提升维修服务体验,轻松解决问题:揭秘上门维修小程序的关键功能与用户体在线维修预约功能:上门维修小程序提供了在线预约平台,用户可以通过手机随时随地选择需要维修的项目,填写相关信息,并提交预约请求。这个功能可以帮助用户快速找到合适的维修服务,并方便地安排时间。 维修项目展示:上门维修小程序会展示各种维修项目,如家电维修、水暖维修、家具维修等。用户可以根据自己的需求选择合适的维修项目https://blog.csdn.net/u013744891/article/details/132040357
15.万师傅苏宁一直坚持自营,目的是一方面能够去顺应我们自身的专业化要求,另一方面也希望能够通过专业化的基础设施的打造,再围绕着零售的生态,把专业的物流服务能够打造出来。不管是B2C也好,还是C2C也好,还是现有的B2B,现在有个流行的词叫产业互联,我个人觉得从我们自己物流自身的定位来讲,对于产业互联的市场我们是非常看中的。https://www.wanshifu.com/zhishi/tag/tag611
16.家电维修师傅的奇思妙想,奶粉桶“爆改”小洗衣机马力十足。北京作家编剧肥猪满圈 902跟贴 打开APP 盘老板放鱼苗为保护生态尽一点绵薄之力 云书体育 465跟贴 打开APP 中国福建舰航母进展顺利,为何却刺痛印度人的心 水云人 64跟贴 打开APP 勇敢的飞行员拯救了移民女孩 黑巴电影 569跟贴 打开APP 陈松勇做梦都没想到,自己只是客串了个配角,却意外成为了经典 牛顿电影 454https://m.163.com/v/video/VPHT1HNKJ.html
17.家居维修app排名前十,什么上门维修家电的APP可靠求推荐现在都是手机app,正事多,不错 神工,居家通,户帮户,常州本地的e捷修 4,求一个好用的家电维修管理软件 进家电维修163DZ.COM 维修论坛,有《售后维修管理系统V6》 正式版下载 ,不知对你是否有帮助,下载试试吧。 5,找家具维修的技术工人有什么好的APP吗 http://www.jiebohui.com/znjj/jjjy/215177.html
18.智慧社区建设指南(试行).pdf2.1 目的和原 则 5 2.2 评价指标 体系 6 第3 章 总体架 构与 支撑平台 26 3.1 总体框架 26 3.2 智慧社区 综合信 息 服务平台 https://www.360doc.cn/article/79930059_1132212490.html