介绍
本篇内容主要讲解“kubernetes资源QOS机制实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes资源QOS机制实现原理是什么”吧!
QOS是k8中一种资源保护机制,其主要是针对不可压缩资源比如的内存的一种控制技术,比如在内存中其通过为不同的Pod和容器构造伯父评分,并且通过内核的策略的辅助,从而实现当节点内存资源不足的时候,内核可以按照策略的优先级,优先杀死掉哪些优先级比较低(分值越高优先级越低)的豆荚,今天来分析下背后的实现
1。关键基础特性
1.1一切皆文件
在Linux中一切皆文件,控制CGroup本身也是通过配置文件进行的,这是我创建的一个内存Lmits为200米的圆荚体的容器的配置
#, pwd/sys/fs/cgroup # cat 。/内存/kubepods/pod8e172a5c - 57 - f5 - 493 d - a93d b0b64bca26df/f2fe67dc90cbfd57d873cd8a81a972213822f3f146ec4458adbe54d868cf410c/memory.limit_in_bytes 209715200
1.2内核内存配置
这里我们重点关注内存相关的两个配置:VMOvercommitMemory其值为1,表示运行分配所有的物理内存资源,注意不包括交换资源VMPanicOnOOM其值为0:表示当内存不足的时候触发oom_killer进行选择部分进程进行杀戮,QOS也是通过影响其杀死流程来实现的
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, }
QOS打2.分机制与判定实现
QOS打分机制主要是根据请求和限制里面的资源限制来进行类型判定与打分的,我们就来快速看下这部分的实现
2.1根据容器判定QOS类型
2.1.1构建容器列表
遍历所有的容器列表,注意这里会包含所有的初始化容器和业务容器
requests :=, v1.ResourceList {} limits :=, v1.ResourceList {} zeroQuantity :=, resource.MustParse (“0”) isGuaranteed :=,真的 allContainers :=, [] v1.Container {} 时间=allContainers 附加(allContainers, pod.Spec.Containers…)//,追加所有的初始化容器, allContainers =,附加(allContainers, pod.Spec.InitContainers…)
2.1.2处理请求和限制
这里遍历所有的请求和限制限制的资源,分别加入到不同的资源集合汇总,其中判定是不是保证主要是根据限制里面的资源是否包含CPU和内存两种资源,都包含才可能是保证
for _, container :=, range allContainers {//process 请求 名字,for quantity :=, range container.Resources.Requests { if ! isSupportedQoSComputeResource(名字),{ 继续 } if quantity.Cmp (zeroQuantity),==, 1, { delta :=, quantity.DeepCopy () if _, exists :=,请求[名字];,exists {! 请求[名字],=δ },{else delta.Add(请求[名字]) 请求[名字],=δ } } }//process 限制 qosLimitsFound :=, sets.NewString () 名字,for quantity :=, range container.Resources.Limits { if ! isSupportedQoSComputeResource(名字),{ 继续 } if quantity.Cmp (zeroQuantity),==, 1, { qosLimitsFound.Insert (string(名字)) delta :=, quantity.DeepCopy () if _, exists :=,限制[名字];,! exists { 限制[名字],=δ },{else delta.Add(限制[名字]) 限制[名字],=δ } } } if ! qosLimitsFound.HasAll (string (v1.ResourceMemory),字符串(v1.ResourceCPU)), {//,必须是全部包含cpu和内存限制 isGuaranteed =false } }
2.1.3 BestEffort
如果荚里面的容器没有任何请求和限制的限制则就是BestEffort
if len(请求),==,0,,,,,,len(限制),==,0,{ return v1.PodQOSBestEffort }
2.1.4
要保证是保证必须是资源相等,并且限定的数量相同
//, Check is requests match limits for all 资源。 if isGuaranteed  { 名字,for req :=, range requests { if lim, exists :=,限制[名字];,! exists | |, lim.Cmp(点播),!=,0,{ isGuaranteed =false 打破 } } } if isGuaranteed ,,,, len(请求),==,len(限制),{ return v1.PodQOSGuaranteed }kubernetes资源QOS机制实现原理是什么