影响K8S Pod分配和调度策略的两大关键特性
在Kubernetes中有一个最复杂的调度器可以处理pod的分配策略。基于在pod规范中所提及的资源需求,Kubernetes调度器会自动选择最合适的节点来运行pod。
但在许多实际场景下,我们必须干预调度过程才能在pod和一个节点或两个特定pod之间进行匹配。因此,Kubernetes中有一种十分强大的机制来管理及控制pod的分配逻辑。
那么,本文将探索影响Kubernetes中默认调度决定的关键特性。
节点亲和性/反亲和性
Kubernetes一向以来都是依赖label和selector来对资源进行分组。例如,某服务使用selector来过滤具有特定label的pod,这些label可以选择性地接收流量。Label和selector可以使用简单的基于等式的条件(=and!=)来评估规则。通过nodeSelector的特性(即强制将pod调度到特定节点上),可以将这一技术扩展到节点中。
此外,label和selector开始支持基于集合的query,它带来了基于in、notin和exist运算符的高级过滤技术。与基于等式的需求相结合,基于集合的需求提供了复杂的技术来过滤Kubernetes中的资源。
节点亲和性/反亲和性使用label和annotation的基于表达集的过滤技术来定义特定节点上的pod的分配逻辑。Annotation可以提供不会暴露到selector的其他元数据,这意味着用于annotation的键不会包含在query和过滤资源中。但是节点亲和性可以在表达式中使用annotation。反亲和性可以确保pod不会被强制调度到与规则匹配的节点上。
除了能够在query中使用复杂的逻辑之外,节点亲和性/反亲和性能够为分配逻辑强制施加硬性和软性规则。硬性规则将会执行严格的策略,可能会阻止将pod分配到不符合条件的节点上。而软性规则则会首先确认节点是否与特定的条件相匹配,如果它们不匹配,它将使用默认的调度模式来分配Pod。表达式requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution将会分别执行硬性规则和软性规则。
以下是在硬性和软性规则下使用节点亲和性/反亲和性的示例:
affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "failure-domain.beta.kubernetes.io/zone" operator: In values: ["asia-south1-a"]
以上规则将指示Kubernetes调度器尝试将Pod分配到在GKE集群的asia-south1-a区域中运行的节点上。如果没有可用的节点,则调度器将会直接应用标准的分配逻辑。
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "failure-domain.beta.kubernetes.io/zone" operator: NotIn values: ["asia-south1-a"]
以上规则通过使用NotIn运算符来强制执行反亲和性。这是一个硬性规则,它能够确保没有pod被分配到运行在asia-south1-a空间中的GKE节点。
Pod亲和性/反亲和性
尽管节点亲和性/反亲和性能够处理pod和节点之间的匹配,但是有些场景下我们需要确保pod在一起运行或在相同的节点上不运行2个pod。Pod亲和性/反亲和性将帮助我们应用强制实施粒度分配逻辑。
与节点亲和性/反亲和性中的表达式类似,pod亲和性/反亲和性也能够通过requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution强制实施硬性以及软性规则。还可以将节点亲和性与pod亲和性进行混合和匹配,以定义复杂的分配逻辑。
为了能够更好地理解概念,想象一下我们有一个web和缓存deployment,其中三个副本在一个3节点的集群中运行。为了确保在web和缓存pod之间低延迟,我们想要在用一个节点上运行它们。与此同时,我们不想在相同的节点上运行超过1个缓存pod。基于此情况,我们需要实施以下策略:每个节点仅运行1个且只有1个缓存Pod的web pod。
首先,我们将使用反亲和性规则来部署缓存,它将阻止超过1个pod运行在1个节点上:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis topologyKey: "kubernetes.io/hostname"
topoloyKey使用附加到节点的默认label动态过滤节点的名称。请注意,我们使用podAntiAffinity表达式和in运算符来应用规则的方式。
假设在集群的某个节点上安排了3个pod缓存,那么现在我们想要在与缓存Pod相同的节点上部署web pod。我们将使用podAffinity来实施这一逻辑:
podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis topologyKey: "kubernetes.io/hostname"
以上代码表明Kubernetes调度器要寻找有缓存Pod的节点并部署web pod。
除了节点和pod的亲和性/反亲和性之外,我们还能使用taints和tolerations来定义自定义分配逻辑。此外,我们还能写自定义调度程序,它可以从默认的调度程序中接管调度逻辑。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
01月22日云栖号头条:向大家报告一个重要技术进展!个人全基因组测序分析只需15分钟,创下了新的世界纪录!
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯:向大家报告一个重要技术进展!阿里达摩院和华大基因一起,把基因测序分析的时间缩提速了100多倍!创下了新的世界纪录;近日在西安市举办的“2020贺岁产业创新论坛·西安站”现场,阿里云中国区副总裁卫炜揭示了企业取得长足进步的四大能力分别是产品力、运营能力、组织力、技术创新能力。并重点阐述了企业保持持续创新的核心是组织在线和业务在线;淘宝向平台上的所有商家发出公告,要求平台上所有口罩绝不允许涨价。淘宝同时表示已启动官方专项补贴,保证消费者能买到价格实惠的品质正品的口罩。一起来看最新的资讯: 向大家报告一个重要技术进展!阿里达摩院和华大基因一起,把基因测序分析的时间缩提速了100多倍!创下了新的世界纪录! 在这之前,科学界普遍需要120个小时才能完成类似流程。而现在,通过阿里云只需要15分钟。这背后是双方的科学家一起精诚合作,付出了整整四年多的努力。这项突破对精准医疗领域可谓意义重大,能够帮助我们人类定位到自己疾病发生的...
- 下一篇
解决App Store上传ipa卡在Authenticating with App Store的问题
Apple在最新发布的XCode 11中移除了使用已久的Application Loader,并提供了新的Transporter代替Application Loader。但是在最近上传应用的时候一直卡在Authenticating with App Store这一步,Transporter、XCode、命令行都试遍了还是不行。网上找了一番之后发现以前的Application Loader也存在类似的情况,大致原因是使用的jar组件太旧了。 网上提供的方法都是针对Application Loader的,并没有找到针对Transporter对应的解决方法,好在方法是相通的。 先通过Mac App Store下载Transporter应用。 打开Terminal并执行以下命令: sudo /Applications/Transporter.app/Contents/itms/bin/iTMSTransporter 点击回车之后会要求输入登录密码(输入时密码不可见)。接下来开始更新Transporter组件,窗口上会显示日志。 更新过程会持续一段时间。如果看到下图显示的界面说明已经更新完成了。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境