K8s 容器的定向调度与亲和性

K8s 集群节点 CPU 使用率高!内存溢出(OOM)!宕机!导致大量微服务瘫痪怎么办?可能是调度策略没做好,看完这篇文章掌握提高集群稳定性的管理诀窍。

Kubernetes(K8s)是一个开源的容器编排工具,而容器调度是其非常重要的特性,所谓的调度是指将容器(Pod)分配到集群中的节点上运行的过程。为了更好地控制容器的调度,K8s 提供了多种调度策略,其中包括定向调度和亲和性策略。在实际的 K8s 集群维护场景中,合理使用这些调度策略,对集群的稳定性至关重要。本文将通过分享实践案例,帮助你更好地理解和使用这些功能。

定向调度

定向调度通过 nodeNamenodeSelector 来声明 Pod 期望调度的目标节点,这种方式的调度是强制性的,不管节点是否存在,是否宕机,都会往声明的节点上去调度,当目标不存在或不可调度时,将会导致 Pod 无法运行。

  • nodeName

强制将 Pod 调度到指定主机名的节点上,这种方式简单粗暴,没有经过 Scheduler 的调度逻辑。

示例:我有一个机器学习的应用,需要调度到集群中唯一的 GPU 节点上,可以这样做。

apiVersion: apps/v1
kind: Deployment
metadata:name: athena
spec:replicas: 1selector:matchLabels:app: athenatemplate:metadata:labels:app: athenaspec:containers:- name: athenaimage: athena:2.0.0nodeName: k8s-node-gpu-1
  • NodeSelector

强制将 Pod 调度到指定标签的节点上,这种方式通过 Label-selector 机制实现,在 Pod 创建之前,会由 Schedule 的 MatchNodeSelector 调度策略根据 Label 匹配节点,再将 Pod 调度到目标节点上。

示例:我有一个机器学习的应用,需要调度到集群中带有 hardware-type:gpu 标签的节点上,带有该标签的节点有多台,可以这样做。

apiVersion: apps/v1
kind: Deployment
metadata:name: athena
spec:replicas: 1selector:matchLabels:app: athenatemplate:metadata:labels:app: athenaspec:containers:- name: athenaimage: athena:2.0.0nodeSelector:hardware-type: gpu# gpu-type: T4 (允许有多label匹配)

定向调度比较简单粗暴,那有没有相对温和、灵活点的调度策略呢?当然是有的,接下来让我们来看看亲和性调度策略。

亲和性调度

亲和性调度(Affinity)在定向调度的基础上,通过灵活的节点亲和性(nodeAffinity)、Pod 亲和性(podAffinity)、Pod 反亲和性(podAntiAffinity)规则,满足更多样化的调度场景。

  • nodeAffinity

nodeSelector 更加强大和灵活,可以让 Pod 满足更多样化的条件调度到指定的节点上,支持“软性调度”(PreferredDuringSchedulingIgnoreDuringExecution)和“硬性调度”(RequiredDuringSchedulingIgnoredDuringExecution)”,硬性调度比较强硬,不满足条件则调度不成功,而软性调度相对温和,属于倾向性优先选择满足条件的节点,并不强求。

让我们来看两个示例,加深理解:

示例 1:我有一个机器学习的应用,必须调度到集群中带有 hardware-type: gpu,且区域 kubernetes.io/zone 的值为 cn-shenzhen-1 或 cn-shenzhen-2 标签的节点上。我们可以通过亲和性的硬性调度实现,具体如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: athena
spec:replicas: 2selector:matchLabels:app: athenatemplate:metadata:labels:app: athenaspec:containers:- name: athenaimage: athena:2.0.0affinity:nodeAffinity:# 硬性调度,节点必须满足所有条件才可以调度requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: hardware-type# 运算operator: Invalues:- gpu- key: kubernetes.io/zoneoperator: Invalues:- cn-shenzhen-1- cn-shenzhen-2

Operator 支持的运算符还有:

Exists(key必须存在,value可以是任意的)
DoesNotExist(key不能存在)
In(key的value必须在提供的值列表中)
NotIn(key的value不能在提供的值列表中)
Gt(key的value必须大于提供的值,仅支持整数)
Lt(key的value必须小于提供的值)

示例 2:我有一个机器学习的应用,倾向于调度到集群中带有 hardware-type: gpu,且区域 kubernetes.io/zone 的值为 cn-shenzhen-1 或 cn-shenzhen-2 标签的节点上。我们可以通过亲和性的软性调度实现,如果不能满足条件,他也会尝试去调度其他节点,具体如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: athena
spec:replicas: 2selector:matchLabels:app: athenatemplate:metadata:labels:app: athenaspec:containers:- name: athenaimage: athena:2.0.0affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:# 满足条件的节点会加分,值支持(1-100),分数越高,优先级越高# 不加的话,满足条件的节点权重也为0,不能保证其优先级。- weight: 1preference:matchExpressions:- key: hardware-type# 运算,支持的运算符跟硬性调度一致operator: Invalues:- gpu- key: kubernetes.io/zoneoperator: Invalues:- cn-shenzhen-1- cn-shenzhen-2
  • Pod 亲和性(podAffinity)和反亲和性(podAntiAffinity)

顾名思义,Pod 亲和性用来指定哪些 Pod 应该跟哪些 Pod 更加靠近,而 Pod 反亲和性通常用来打散 Pod,让某些 Pod 不在同一节点或区域,同样也有“软性调度”(PreferredDuringSchedulingIgnoreDuringExecution)”和“硬性调度” (RequiredDuringSchedulingIgnoredDuringExecution),接下来我将用一个示例,加深对 Pod 亲和性和反亲和性的理解:

示例:有两个微服务 zeusathena 相互调用比较频繁,他们都有两个副本,出于提升效率和可用性考虑,我想将 zeus 和 athena 的副本打散到两个不同的可用区(zone),并让他们的副本必须部署到同一个节点上,假设 zeus 已经部署好了,那 athena 的部署可以这样实现。

apiVersion: apps/v1
kind: Deployment
metadata:name: athena
spec:replicas: 2selector:matchLabels:app: athenatemplate:metadata:labels:app: athenaspec:containers:- name: athenaimage: athena:2.0.0affinity:# Pod亲和性podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchLabels:app: zeus# 拓扑键,表示在相同主机上调度topologyKey: kubernetes.io/hostname# Pod反亲和性podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchLabels:app: athena# 拓扑键,表示在不同区域上调度topologyKey: topology.kubernetes.io/zone

结 语

在文章开头我们提到如何借助调度策略来提升 K8s 集群的可用性,相信看完全文的小伙伴都可以悟出其中奥妙,我们可以将高计算、高内存的 Pod 调度到指定的节点,避免影响关键服务运行,另外为了保障微服务的高可用性,我们通常会打散副本到不同的节点或者可用区。

本文首发:SRE运维手记,作者:亦零一。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb 实验7 JSP内置对象II实现购物车

实验七 JSP内置对象II 目的: 掌握JSP内置对象的使用。理解JSP的作用域掌握session,application对象的使用 实验要求: 完成实验题目要求提交实验报告,将代码和实验结果页面截图放入报告中 实验过程: 一、结合之前…

Linux随记(十二)

一、redhat6.9 ,sftp连接后出现2个connect close 问题描述: 操作系统:redhat 6.9 客户反馈,他们机器sftp连接jxx192.168.1.100后出现connection closed排查过程: 登录192.168.1.100 (最开始使用普通用户…

[蓝桥杯 2024 省 C] 回文数组

题目名字 [蓝桥杯 2024 省 C] 回文数组 题目链接 题意 给n个数字,用最少的次数,通过同时两个数字或单个数字加一或减一使给的这一串数字变成回文数 思路 字眼最少其实就需要判断出这个大概就是贪心了,不过很可惜比赛的时候就只想到了回文&a…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言,涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等,能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能,并且免费开源,能够完美地…

【测试平台】打包 子节点android环境配置

背景 本文记录不是安卓Gradle打包,因为我们google play提审,为了规避跟下架包的相似度避免马甲包封号,使用混淆逻辑。 打包环境部署 申请对应虚拟机会有两个账号root和admin,主要避免root账号权限过高造成脚本误操作。这里面问题…

免杀对抗—DLL劫持白加黑隐写分离EDRSyscall-hook

前言 今天讲点比较高端的东西—DLL反射注入,首先什么是DLL文件,简答来说就是程序为了实现某个功能而调用的文件。举个例子,某个代码想要实现某个功能是不是会调用一些封装好的函数,exe同样如此,想要实现某个功能就会调…

uniapp推送配置流程

Dcloud Dcloud注册账号 个推 了解即可 注册个推账号 ios配置流程 需配置含有推送的描述文件以及p8证书 配置推送证书 ios证书配置报技术错误(参数错误) TeamID-苹果开发者账号唯一的ID 安卓需配置多厂商 小米手机需要配置小米厂商 华为手机则需…

每天10个vue面试题(四)

1、简述 mixin、extends 的覆盖逻辑? mixin 和 extends均是用于合并、拓展组件的,两者均通过 mergeOptions 方法实现合并。mixins 接收一个混入对象的数组,其中混入对象可以像正常的实例对象一样包含实例选项,这些选项会被合并到…

zookeeper全系列学习之分布式锁实现

文章目录 前言一、分布式锁的通用实现思路二、ZK实现分布式锁的思路三、ZK实现分布式锁的编码实现1、核心工具类实现2、测试代码编写线程安全问题复现使用上面封装的ZkLockHelper实现的分布式锁 优点缺点 总结 前言 就像上篇文章zookeeper全系列学习之统一配置获取说的&#x…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性,无法实现跨平台完全兼容,例如:微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制,可以针对特定的平台编译执行特定的代码,否则不执行。…

【ArcGISPro】制作简单的ArcGISPro-AI助手

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_ai大模型流式输出效果(打字效果) python-CSDN博客 【C#】调用本机AI大模型流式返回_怎么实现调用本地大模型时实现流式输出-CSDN博客 【ArcGISPro】宣布推…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)没几天,又来一个新的,真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)https://blog.csdn.ne…

稳定性排查指令

有无输入指令 adb shell getevent lrt 磁盘信息 adb shell df -h 查看data分区 内存信息 adb shell cat /proc/meminfo | grep MemFree adb shell dumpsys meminfo com.aaaa.systemservice(不跟就是所有的pss,rss等分布) 堆栈信息代码中 L…

Django后台接口开发

一、设计轮播图ORM模型 设计轮播图的ORM(Object-Relational Mapping,对象关系映射)模型,主要是为了在关系型数据库和业务实体对象之间建立一个映射关系。这样,开发者在操作具体的业务对象时,就不需要再编写…

android 10 后台启动activity

摘要:Android 10(API 级别 29)及更高版本会限制应用何时可以启动 activity 背景。这些限制有助于最大限度地减少对用户的干扰, 让用户能够更好地控制其屏幕上显示的内容。本文以此为出发点,基于展锐平台对系统代码进行…

什么是阻塞队列?阻塞队列的实现原理及使用详解

在现代的多线程编程中,线程之间的协作与同步是提升程序稳定性和并发性能的重要环节。而 阻塞队列(Blocking Queue) 是 Java 并发包中用于实现线程安全的数据交换的基础工具之一,它广泛用于生产者-消费者模式等多种场景。本文将深入…

职场中同事与你抢功你该怎么说

职场如战场,当你花费心思提出一个好方案,拉到一个大客户,抑或你兢兢业业地工作为公司发展做出了极大的贡献时,同事想把这一切归功于自己,这时你该怎么办?是据理力争,还是自认倒霉?或…

可编辑97页PPT | 制造企业数字化转型战略咨询及IT总体规划方案

荐言分享:制造企业数字化转型是当前市场环境下的必然趋势,旨在通过引入先进的信息技术,优化业务流程,提升运营效率,增强客户体验,实现可持续发展。这一转型过程涉及多个方面,需要综合考虑企业战…

计算机网络的数据链路层

计算机网络的数据链路层 数据链路层是OSI参考模型中的第二层,它位于物理层之上,网络层之下。数据链路层的主要功能是在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。…

计算机视觉中的点算子:从零开始构建

Hey小伙伴们!今天我们要聊的是一个非常基础但极其重要的计算机视觉技术——点算子(Point Operators)。点算子主要用于对图像的每个像素进行独立的处理,比如亮度调整、对比度增强、灰度化等。通过这些简单的操作,我们可…