AIGC革命已来,如何在企业场景落地?如何选择模型、怎样应用RAG、需要哪些组织流程配套? 了解详情
写点什么

影响 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:40623

评论

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

十一、高可用

Geek_28b526

Week1 作业

oooh-la

重学JS | 数组知识点大全,必收藏!

梁龙先森

大前端 编程语言

架构师第一周总结



呃?!!!我彻底忘了这件事😂

Nydia

2020年国内前端团队都做了些什么?

徐小夕

大前端 技术栈 2021

架构师训练营第2期 第11周总结

月下独酌

第 11 周 系统架构作业

心在那片海

消息队列优化(1) -- 鶸的介绍篇

1412

消息队列 workflow srpc 异步调度 并行计算

消息队列优化(3) -- grpc MPMCQueue 简介及各队列性能对比

1412

消息队列 workflow srpc 异步调度 并行计算

这样规范写代码,同事直呼“666”

xcbeyond

Java 代码规范 规范

架构师训练营第2期 第11周命题作业

月下独酌

console.log也能插图!!!

德育处主任

CSS html 大前端 Web js

谁说明天上线,这货压根不知道开发流程!

小傅哥

Java 小傅哥 架构设计 开发流程 开发规范

江苏民丰 x mPaaS | 县域小银行,技术团队就12人,却找到了数字化转型的秘籍

蚂蚁集团移动开发平台 mPaaS

银行数字化转型 mPaaS

我画了 40 张图就是为了让你搞懂计算机网络层

cxuan

计算机网络 IP 网络层 ipv6 ipv4

与前端训练营的日子 --Week10

SamGo

学习

消息队列优化(2) -- 几种基本实现

1412

消息队列 workflow srpc 异步调度 并行计算

关于一个梦(自我的死亡)

Yuchen

身心健康 心理 自我

软件架构设计方案实战

Andy

面试官:数据库自增ID用完了会怎么样?

艾小仙

数据库

Week 11 作业

evildracula

架构师 01 期,大作业一

子文

判断回文数字算法,swift 5初始化详解,时间管理计划落地,swift5 多线程高级用法 John 易筋 ARTS 打卡 Week 33

John(易筋)

ARTS 打卡计划 算法回文数字判断 时间管理计划落地 swift5 初始化详解 swift5多线程高级用法

UDP连接要不要发起connect

kof11321

网络编程

开源整套Netty源码笔记+19个案例调优+游戏项目,终于彻底顿悟了

Java架构追梦

Java 源码 架构 Netty 游戏项目

第六周学习总结

Binary

第 11 周 系统架构总结

心在那片海

微服务缓存原理与最佳实践

万俊峰Kevin

缓存 缓存穿透 缓存并发 go-zero Go 语言

万字长文聊缓存(上)

Silently9527

Java nginx HTTP

AI人脸识别技术门禁系统解决方案智慧社区建设

13828808769

人脸识别 智慧城市 智慧平安小区平台开发 刷脸

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