热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes中的资源限制

微信公众号:运维开发故事,作者:乔克limitRangeLimitRange有个好听的中文名字,叫资源配置访问管理。用

微信公众号:运维开发故事,作者:乔克


limitRange

LimitRange有个好听的中文名字,叫"资源配置访问管理"。用过K8S的都知道,在默认情况下,K8S不会对Pod进行CPU和内存限制,这就意味着这个未被限制的Pod可以随心所欲的使用节点上的CPU和内存,如果某个Pod发生内存泄漏那么将是一个非常糟糕的事情。

所以正常情况下,我们在部署Pod的时候都会把Requests和Limits加上,如下:

apiVersion:apps/v1
kind:Deployment
metadata:name:ng-deploy
spec:selector:matchLabels:app:ng-demoreplicas:2template:metadata:labels:app:ng-demospec:containers:- name:ng-demoimage:nginximagePullPolicy:IfNotPresentresources:requests:cpu:100mmemory:216Milimits:cpu:100mmemory:216Mi

但是,如果Pod非常多,而且很多Pod只需要相同的限制,我们还是像上面那样一个一个的加就非常繁琐了,这时候我们就可以通过LimitRange做一个Namespace资源限制。如果在部署Pod的时候指定了requests和Limits,则指定的生效。反之则由全局的给Pod加上默认的限制。

总结,LimitRange可以实现的功能:

  • 限制namespace中每个pod或container的最小和最大资源用量。

  • 限制namespace中每个PVC的资源请求范围。

  • 限制namespace中资源请求和限制数量的比例。

  • 配置资源的默认限制。


创建LimitRange之后,LimitRange会在它所属namespace范围内生效。

常用的场景如下(来自《Kubernetes权威指南》)

  • 集群中的每个节点都有2GB内存,集群管理员不希望任何Pod申请超过2GB的内存:因为在整个集群中都没有任何节点能满足超过2GB内存的请求。如果某个Pod的内存配置超过2GB,那么该Pod将永远都无法被调度到任何节点上执行。为了防止这种情况的发生,集群管理员希望能在系统管理功能中设置禁止Pod申请超过2GB内存。

  • 集群由同一个组织中的两个团队共享,分别运行生产环境和开发环境。生产环境最多可以使用8GB内存,而开发环境最多可以使用512MB内存。集群管理员希望通过为这两个环境创建不同的命名空间,并为每个命名空间设置不同的限制来满足这个需求。

  • 用户创建Pod时使用的资源可能会刚好比整个机器资源的上限稍小,而恰好剩下的资源大小非常尴尬:不足以运行其他任务但整个集群加起来又非常浪费。因此,集群管理员希望设置每个Pod都必须至少使用集群平均资源值(CPU和内存)的20%,这样集群能够提供更好的资源一致性的调度,从而减少了资源浪费。

LimitRange可以用来限制Pod,也可以限制Container。下面我们以一个例子来详细说明。

配置LimitRange

(1)、首先创建一个namespace

apiVersion:v1
kind:Namespace
metadata:name:coolops

(2)、为namespace配置LimitRange

apiVersion:v1
kind:LimitRange
metadata:name:mylimitnamespace:coolops
spec:limits:- max:cpu:"1"memory:1Gimin:cpu:100mmemory:10MimaxLimitRequestRatio:cpu:3memory:4type:Pod- default:cpu:300mmemory:200MidefaultRequest:cpu:200mmemory:100Mimax:cpu:"2"memory:1Gimin:cpu:100mmemory:10MimaxLimitRequestRatio:cpu:5memory:4type:Container

参数说明:

  • max:如果type是Pod,则表示pod中所有容器资源的Limit值和的上限,也就是整个pod资源的最大Limit,如果pod定义中的Limit值大于LimitRange中的值,则pod无法成功创建。如果type是Container,意义类似。

  • min:如果type是Pod,则表示pod中所有容器资源请求总和的下限,也就是所有容器request的资源总和不能小于min中的值,否则pod无法成功创建。如果type是Container,意义类似。

  • maxLimitRequestRatio:如果type是Pod,表示pod中所有容器资源请求的Limit值和request值比值的上限,例如该pod中cpu的Limit值为3,而request为0.5,此时比值为6,创建pod将会失败。

  • defaultrequest和defaultlimit则是默认值,只有type为Container才有这两项配置


注意:(1)、如果container设置了max, pod中的容器必须设置limit,如果未设置,则使用defaultlimt的值,如果defaultlimit也没有设置,则无法成功创建 (2)、如果设置了containermin,创建容器的时候必须设置request的值,如果没有设置,则使用defaultrequest,如果没有defaultrequest,则默认等于容器的limit值,如果limit也没有,启动就会报错

创建上面配置的LimitRange:

# kubectl apply -f limitrange.yaml
limitrange/mylimitcreated# kubectl get limitrange -n coolops
NAMECREATEDAT
mylimit2020-03-26T09:46:33Z# kubectl describe limitranges -n coolops mylimit
Name:mylimit
Namespace:coolops
TypeResourceMinMaxDefaultRequestDefaultLimitMaxLimit/RequestRatio
---------------------------------------------------------------------
Podmemory10Mi1Gi--4
Podcpu100m1--3
Containercpu100m2200m300m5
Containermemory10Mi1Gi100Mi200Mi4

测试LimitRange

(1)、创建一个允许范围之内的requests和limits的pod

apiVersion:v1
kind:Pod
metadata:name:pod01namespace:coolops
spec:containers:- name:pod-01image:nginximagePullPolicy:IfNotPresentresources:requests:cpu:200mmemory:30Milimits:cpu:300mmemory:50Mi

我们通过kubectl apply -f pod-01.yaml可以正常创建Pod。

(2)、创建一个cpu超出允许访问的Pod

apiVersion:v1
kind:Pod
metadata:name:pod02namespace:coolops
spec:containers:- name:pod-02image:nginximagePullPolicy:IfNotPresentresources:requests:cpu:200mmemory:30Milimits:cpu:2memory:50Mi

然后我们创建会报如下错误:

# kubectl apply -f pod-02.yaml
Errorfromserver(Forbidden):errorwhencreating"pod-02.yaml":pods"pod02"isforbidden:[maximumcpuusageperPodis1,butlimitis2,cpumaxlimittorequestratioperPodis3,butprovidedratiois10.000000,cpumaxlimittorequestratioperContaineris5,butprovidedratiois10.000000]

(3)创建低于允许范围的Pod

apiVersion:v1
kind:Pod
metadata:name:pod03namespace:coolops
spec:containers:- name:pod-03image:nginximagePullPolicy:IfNotPresentresources:requests:cpu:200mmemory:30Milimits:cpu:100mmemory:10Mi

然后会报如下错误:

# kubectl apply -f pod-03.yaml
ThePod"pod03"isinvalid:
*spec.containers[0].resources.requests:Invalidvalue:"200m":mustbelessthanorequaltocpulimit
*spec.containers[0].resources.requests:Invalidvalue:"30Mi":mustbelessthanorequaltomemorylimit

(4)、创建一个未定义request或Limits的Pod

apiVersion:v1
kind:Pod
metadata:name:pod04namespace:coolops
spec:containers:- name:pod-04image:nginximagePullPolicy:IfNotPresentresources:requests:cpu:200mmemory:200Mi

然后我们创建完Pod后会发现自动给我们加上了limits。如下:

# kubectl describe pod -n coolops pod04
...Limits:cpu:300mmemory:200MiRequests:cpu:200mmemory:200Mi
...

上面我指定了requests,LimitRange自动给我们加上了defaultLimits,你也可以试一下全都不加或者加一个,道理是一样的。值得注意的是这里要注意一下我们设置的maxLimitRequestRatio,配置的比列必须小于等于我们设置的值。

上文有介绍LimitRange还可以限制还可以限制PVC,如下:

apiVersion:v1
kind:LimitRange
metadata:name:storagelimitsnamespace:coolops
spec:limits:- type:PersistentVolumeClaimmax:storage:2Gimin:storage:1Gi

创建完后即可查看:

kubectldescribelimitranges-ncoolopsstoragelimits
Name:storagelimits
Namespace:coolops
TypeResourceMinMaxDefaultRequestDefaultLimitMaxLimit/RequestRatio
---------------------------------------------------------------------
PersistentVolumeClaimstorage1Gi2Gi---

你可以创建PVC进行测试,道理是一样的。


参考资料

[1] https://kubernetes.io/docs/concepts/policy/limit-range/

[2] 《Kubernetes权威指南》


-----------------------

公众号:乔边故事(ID:qiaobiangushi)

知乎: 乔边故事

头条号:乔边故事

只要脸皮够厚,整个世界都将被你踩在脚下。

-----------------------

扫码二维码关注公众号,不定期维护优质内容,技术干货!

图片

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。


推荐阅读
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 大家好,全新的技术专栏《从零开始掌握容器云网络实战》正式上线。该专栏将系统地介绍容器云网络的基础知识、核心技术和实际应用案例,帮助读者全面理解和掌握容器云网络的关键技术与实践方法。 ... [详细]
  • prometheus09-k8s部署grafana
    1.部署grafana?apiVersion:?appsv1?kind:?StatefulSet?metadata:??name:?grafana??namespace:?kube-systemspec:??serviceName:?grafana??repl ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • C盘无法格式化的原因及解决方法
    本文探讨了C盘无法格式化的原因,并提供了详细的解决方案,帮助用户顺利进行系统维护。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 从运维繁忙到屡获殊荣:一位CIO的辉煌转型之路
    企业首席信息官(CIO)常常面临一个棘手的问题:如何有效推动公司的数字化转型?尽管数字化转型已成为企业未来发展的重要共识,但如何具体实施依然是许多CIO面临的重大挑战。在日常运营中,企业需要处理大量的业务问题和制定各种发展规划,这使得数字化转型往往被排在较低的优先级。此外,不断涌现的新问题和新规划也常常打乱原有的计划,进一步增加了转型的难度。 ... [详细]
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • kubernetes 下实现socket.io 的集群模式
    2019独角兽企业重金招聘Python工程师标准socket.io单节点模式是很容易部署的,但是往往在生产环境一个节点不能满足业务需求,况且还要保 ... [详细]
  • 原文:https:www.cnblogs.comdalianpaip12088118.htmlapiVersion:appsv1kind:DaemonSetme ... [详细]
  • 0157.K 升级 kubeadm 集群_一主两从
    升级kube ... [详细]
author-avatar
芦子根_889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有