写点什么

影响 K8S Pod 分配和调度策略的两大关键特性

  • 2020-05-25
  • 本文字数:2193 字

    阅读完需:约 7 分钟

影响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。表达式 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 将会分别执行硬性规则和软性规则。


以下是在硬性和软性规则下使用节点亲和性/反亲和性的示例:


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 亲和性/反亲和性也能够通过 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 强制实施硬性以及软性规则。还可以将节点亲和性与 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 来定义自定义分配逻辑。此外,我们还能写自定义调度程序,它可以从默认的调度程序中接管调度逻辑。


2020-05-25 16:401055

评论

发布
暂无评论
发现更多内容

【API进阶之路】帮公司省下20万调研费!如何巧用情感分析API实现用户偏好调研

华为云开发者联盟

反馈 API 华为云 API Explorer平台 用户调研

云图说 | 3分钟创建一个游戏类工作负载

华为云开发者联盟

Docker 容器 华为云 工作负载 2048游戏

趣文:那天我被拉入 C++ 亲友群

程序员生活志

c c++ 程序员

数据库外键

will

数据库 性能 外键

“云”上教与学,让教育不止步于课堂

Geek_116789

内存总是不够?HBase&GeoMesa配置优化了解一下

华为云开发者联盟

内存模型 内存 HBase 大集群 GeoMesa

程序员陪娃系列——小小免费按摩师

孙苏勇

程序员 陪伴 随笔杂谈

程序员陪娃系列——小娃的到来

孙苏勇

程序员 陪伴 随笔杂谈

BIGO技术:实时计算平台建设

InfoQ_3597a20b53cc

互联网 BIGO

边云协同!EM-BOX视频分析盒加速安全生产场景落地AI应用

百度大脑

人工智能 人脸识别 图像识别 百度大脑 人体识别

程序员陪娃系列——见你的第一面

孙苏勇

程序员 陪伴 随笔杂谈

低代码平台会让程序员失业?测评了5个工具,谁能让效率提高N倍?

代码制造者

编程 编程语言 低代码 零代码 测评

Linkerd 2.8 - 實現超級簡單又安全的多叢集(multicluster) Kubernetes 架構

Rammus

Kubernetes DevOps 运维 云原生 Service Mesh

程序员陪娃系列——育儿路上二三事续

孙苏勇

程序员 陪伴 随笔杂谈

使用 supervisor 配置 ngrok 内网穿透为守护进程

jerry.mei

Linux 操作系统 ngrok 守护进程 内网穿透

LeetCode题解:21. 合并两个有序链表,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

学了那么多技术,为何依然成不了架构师

菜根老谭

架构设计原则

一次好的聊天可以超过自己努力啃几周的书籍

良知犹存

程序人生

《Java并发编程的艺术》读书笔记1:说说并发编程

Jason

多线程 并发

学生党学编程,有这个开源项目就够了!

JackTian

GitHub 学习 编程 程序员 学生党

入职两周,怀疑自己进了假百度!跟传说中完全不一样!难道真有两家百度公司?

程序员生活志

百度 程序员

多角度分析,通讯时序数据的预测与异常检测挑战

华为云开发者联盟

时序数据库 即时通讯 异常检测 网络智能体 时序预测

MySQL“被动”性能优化汇总!

王磊

MySQL

一款基于 Python 语言的 Linux 资源监视器!

JackTian

Python GitHub Linux bashtop bpytop

Android 原生 SQLite 数据库的一次封装实践

vivo互联网技术

sqlite android 数据库

太赞了!程序员应该访问的最佳网站都在这里了!

JackTian

GitHub 学习 编程 程序员 网站平台

程序员陪娃系列——和孩子聊生死

孙苏勇

程序员 陪伴 随笔杂谈

程序员陪娃系列——育儿路上二三事

孙苏勇

程序员 陪伴 随笔杂谈

构造、析构期间被调虚函数发生的惨案,长教训!

华为云开发者联盟

代码 组合模式 封装、继承、多态 bug 回调函数

移卡荣登2020「AI 最佳成长榜」,AI+金融科技赋能商业服务

DT极客

品质网络的迭变之路,以及运营商的未来之匙

脑极体

影响K8S Pod分配和调度策略的两大关键特性_文化 & 方法_Rancher_InfoQ精选文章