我的编程空间,编程开发者的网络收藏夹
学习永远不晚

kubernetes资源QOS机制实现原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

kubernetes资源QOS机制实现原理是什么

本篇内容主要讲解“kubernetes资源QOS机制实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes资源QOS机制实现原理是什么”吧!

QOS是k8s中一种资源保护机制,其主要是针对不可压缩资源比如的内存的一种控制技术,比如在内存中其通过为不同的Pod和容器构造OOM评分,并且通过内核的策略的辅助,从而实现当节点内存资源不足的时候,内核可以按照策略的优先级,优先kill掉哪些优先级比较低(分值越高优先级越低)的Pod,今天来分析下背后的实现

1.关键基础特性

kubernetes资源QOS机制实现原理是什么

1.1 一切皆文件

在Linux中一切皆文件,控制CGroup本身也是通过配置文件进行的,这是我创建的一个内存Lmits为200M的Pod的容器的配置

# pwd/sys/fs/cgroup# cat ./memory/kubepods/pod8e172a5c-57f5-493d-a93d-b0b64bca26df/f2fe67dc90cbfd57d873cd8a81a972213822f3f146ec4458adbe54d868cf410c/memory.limit_in_bytes209715200

1.2 内核内存配置

这里我们重点关注内存相关的两个配置:VMOvercommitMemory其值为1,表示运行分配所有的物理内存资源,注意不包括SWAP资源VMPanicOnOOM其值为0:表示当内存不足的时候触发oom_killer进行选择部分进程进行kill,QOS也是通过影响其kill流程来实现的

func setupKernelTunables(option KernelTunableBehavior) error {desiredState := map[string]int{utilsysctl.VMOvercommitMemory: utilsysctl.VMOvercommitMemoryAlways,utilsysctl.VMPanicOnOOM:       utilsysctl.VMPanicOnOOMInvokeOOMKiller,utilsysctl.KernelPanic:        utilsysctl.KernelPanicRebootTimeout,utilsysctl.KernelPanicOnOops:  utilsysctl.KernelPanicOnOopsAlways,utilsysctl.RootMaxKeys:        utilsysctl.RootMaxKeysSetting,utilsysctl.RootMaxBytes:       utilsysctl.RootMaxBytesSetting,}

2.QOS打分机制与判定实现

QOS打分机制主要是根据Requests和limits里面的资源限制来进行类型判定与打分的,我们就来快速看下这部分的实现

2.1 根据容器判定QOS类型

2.1.1 构建容器列表

遍历所有的容器列表,注意这里会包含所有的初始化容器和业务容器

requests := v1.ResourceList{}limits := v1.ResourceList{}zeroQuantity := resource.MustParse("0")isGuaranteed := trueallContainers := []v1.Container{}allContainers = append(allContainers, pod.Spec.Containers...)// 追加所有的初始化容器 allContainers = append(allContainers, pod.Spec.InitContainers...)

2.1.2 处理Requests和limits

这里遍历所有的Requests和Limits限制的资源,分别加入到不同的资源集合汇总,其中判定是不是Guaranteed主要是根据limits里面的资源是否包含CPU和内存两种资源,都包含才可能是Guaranteed

for _, container := range allContainers {// process requestsfor name, quantity := range container.Resources.Requests {if !isSupportedQoSComputeResource(name) {continue}if quantity.Cmp(zeroQuantity) == 1 {delta := quantity.DeepCopy()if _, exists := requests[name]; !exists {requests[name] = delta} else {delta.Add(requests[name])requests[name] = delta}}}// process limitsqosLimitsFound := sets.NewString()for name, quantity := range container.Resources.Limits {if !isSupportedQoSComputeResource(name) {continue}if quantity.Cmp(zeroQuantity) == 1 {qosLimitsFound.Insert(string(name))delta := quantity.DeepCopy()if _, exists := limits[name]; !exists {limits[name] = delta} else {delta.Add(limits[name])limits[name] = delta}}}if !qosLimitsFound.HasAll(string(v1.ResourceMemory), string(v1.ResourceCPU)) {// 必须是全部包含cpu和内存限制isGuaranteed = false}}

2.1.3 BestEffort

如果Pod里面的容器没有任何requests和limits的限制则就是BestEffort

if len(requests) == 0 && len(limits) == 0 {return v1.PodQOSBestEffort}

2.1.4 Guaranteed

要是Guaranteed必须是资源相等,并且限定的数量相同

// Check is requests match limits for all resources.if isGuaranteed {for name, req := range requests {if lim, exists := limits[name]; !exists || lim.Cmp(req) != 0 {isGuaranteed = falsebreak}}}if isGuaranteed &&len(requests) == len(limits) {return v1.PodQOSGuaranteed}

2.1.5 Burstable

如果不是上面两种就是最后一种burstable了

return v1.PodQOSBurstable

2.2 QOS OOM打分机制

2.2.1 OOM打分机制

其中guaranteedOOMScoreAdj是-998其实这跟OOM实现有关系,一台node节点上主要是三部分组成:kubelet主进程、docker进程、业务容器进程,而OOM的打分里面-1000表示该进程不会被oom所kill, 那一个业务进程最少也就只能是-999因为你不能保证自己的业务永远不会出现问题,所以在QOS里面-999其实就是kubelet和docker进程所保留的,剩下的才能作为业务容器分配(分值越高越容易被kill)

// KubeletOOMScoreAdj is the OOM score adjustment for KubeletKubeletOOMScoreAdj int = -999// DockerOOMScoreAdj is the OOM score adjustment for DockerDockerOOMScoreAdj int = -999// KubeProxyOOMScoreAdj is the OOM score adjustment for kube-proxyKubeProxyOOMScoreAdj  int = -999guaranteedOOMScoreAdj int = -998besteffortOOMScoreAdj int = 1000

2.2.2 关键Pod

关键Pod是一种特殊的存在,它可以是Burstable或者BestEffort类型的Pod,但是OOM打分却可以跟Guaranteed一样,这种类型的Pod主要包含三种:静态Pod、镜像Pod和高优先级Pod

if types.IsCriticalPod(pod) {return guaranteedOOMScoreAdj}

判定实现

func IsCriticalPod(pod *v1.Pod) bool {if IsStaticPod(pod) {return true}if IsMirrorPod(pod) {return true}if pod.Spec.Priority != nil && IsCriticalPodBasedOnPriority(*pod.Spec.Priority) {return true}return false}

2.2.3 Guaranteed与BestEffort

这两种类型都有各自默认的值分别为Guaranteed(-998)和BestEffort(1000)

switch v1qos.GetPodQOS(pod) {case v1.PodQOSGuaranteed:// Guaranteed containers should be the last to get killed.return guaranteedOOMScoreAdjcase v1.PodQOSBestEffort:return besteffortOOMScoreAdj}

2.2.4 Burstable

其中关键的一行就是:oomScoreAdjust := 1000 - (1000memoryRequest)/memoryCapacity,从这个计算里面可以看出,如果我们申请的资源越多,那么 (1000memoryRequest)/memoryCapacity这个里面计算出来的时机值就会越小,即最终结果就越大,其实也就表明如果我们占用的内存越少,则打分就越高,这类容器就相对比较容易被kill

memoryRequest := container.Resources.Requests.Memory().Value()oomScoreAdjust := 1000 - (1000*memoryRequest)/memoryCapacity// A guaranteed pod using 100% of memory can have an OOM score of 10. Ensure that burstable pods have a higher OOM score adjustment.if int(oomScoreAdjust) < (1000 + guaranteedOOMScoreAdj) {return (1000 + guaranteedOOMScoreAdj)}// Give burstable pods a higher chance of survival over besteffort pods.if int(oomScoreAdjust) == besteffortOOMScoreAdj {return int(oomScoreAdjust - 1)}return int(oomScoreAdjust)

到此,相信大家对“kubernetes资源QOS机制实现原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

kubernetes资源QOS机制实现原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

kubernetes资源QOS机制实现原理是什么

本篇内容主要讲解“kubernetes资源QOS机制实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes资源QOS机制实现原理是什么”吧!QOS是k8s中一种资源保护
2023-06-19

OAM Kubernetes 实现核心原理是什么

OAM Kubernetes 实现核心原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。OAM 因何而生我们知道,应用容器技术自诞生开始,就以 “彻底改变
2023-06-04

怎么掌握ADO.NET资源管理器原理机制

这篇文章主要介绍“怎么掌握ADO.NET资源管理器原理机制”,在日常操作中,相信很多人在怎么掌握ADO.NET资源管理器原理机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么掌握ADO.NET资源管理器原
2023-06-17

java反射机制的实现原理是什么

Java反射机制是指在运行状态中,对任意一个类都能够知道这个类的所有属性和方法,对任意一个对象都能够调用它的任意一个方法。实现Java反射机制的原理主要涉及以下几个方面:1. 类装载器:Java反射机制通过类装载器加载指定的类,并生成对应的
2023-08-08

kubernetes中Istio实现金丝雀发布原理是什么

这期内容当中小编将会给大家带来有关kubernetes中Istio实现金丝雀发布原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:简介 互联网产品用户数量庞大,如果采用全量发布的话不论对于
2023-06-04

MySQL事务隔离机制与实现原理是什么

这篇“MySQL事务隔离机制与实现原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL事务隔离机制与实现原理是
2022-11-30

android binder机制原理是什么

Android Binder机制是Android系统中用于进程间通信(IPC)的核心机制,它基于进程间通信的原理,实现了高效、安全、稳定的进程间通信。Android Binder机制的原理主要包括以下几个方面:1. Binder驱动:Bin
2023-09-20

android中事件分发机制的实现原理是什么

android中事件分发机制的实现原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。android中的事件处理,以及解决滑动冲突问题都离不开事件分发机制,androi
2023-05-30

Android Adapter机制和原理是什么

Android Adapter机制是一种将数据与视图之间进行绑定的机制,用于在Android应用中将数据呈现给用户。Adapter负责将数据源(如数组、列表、数据库等)转化为视图(如列表项、网格项等),并将其展示在界面上。Android的A
2023-09-26

java反射机制原理是什么

Java反射机制是指在运行时动态获取类的信息并操作类的属性和方法的能力。它允许程序在运行时通过类的全限定名来获取类的实例,调用类的构造方法和方法,访问和修改类的属性。Java反射机制的原理主要包括两个方面:1. 获取类的信息:Java反射机
2023-08-30

Java RMI机制的原理是什么

本篇内容主要讲解“Java RMI机制的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java RMI机制的原理是什么”吧!Java RMIJava RMI之HelloWorld篇Ja
2023-06-20

android Handler机制的原理是什么

Android中的Handler机制是用来实现线程之间的通信的一种机制。它的原理是基于消息队列和消息循环。每个线程都有自己的消息队列,当一个线程需要与其他线程进行通信时,它可以创建一个Handler对象,并将消息发送到其他线程的消息队列中。
2023-09-20

Hibernate flush机制的原理是什么

本篇内容介绍了“Hibernate flush机制的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!针对昨天同事遇到的hiberna
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录