Pod和容器的LimitRange原理和实践总结

一、背景介绍

通常情况下,Pod中的容器可以无限制的使用节点上的CPU和内存资源,在共享资源和资源有限的情况下,若不加以限制,某个集群或命名空间的资源可能会消耗殆尽,导致其他节点上优先级低的Pod发生驱逐、重新调度、重启等问题,因此针对资源限额需要有针对命名空间级别的使用限制,以及针对Pod和容器级别的使用限制,LimitRange就是在后者的背景下诞生的。

二、应用场景

1、适用对集群的某个命名空间中的容器设置默认的统一的request和limit值,配合Resource Quotas更好的实现命名空间级别的资源限额。

2、适用对单个Pod的CPU和内存资源限额控制,如实现Pod中所有容器CPUlimit之和不得超过某值。

3、适用对单个容器的CPU和内存资源限额控制,如实现容器的CPUlimit值不得超过某值。

三、实践

一、LimitRange设置默认request和limit

适用场景:适用对集群的某个命名空间中的容器设置默认的统一的request和limit值

新建limitrange】

LimitRange针对某个namespace的Pod或容器的CPU和内存的默认值、request和limit值实现管控,因此限制的的范围是在namespace下,在创建LimitRange之前,先创建1个用于测试的namespace

kubectl create namespace limitrange-test-ns
[root@k8s-master limitrange]# kubectl get ns |grep limitrange-test-nslimitrange-test-ns   Active   78m

namespace创建成功后,在此命名空间下创建limitrange

[root@k8s-master limitrange]# lslimitrange.yaml[root@k8s-master limitrange]# cat limitrange.yaml apiVersion: v1kind: LimitRangemetadata:  name: mem-limit-range-test  namespace: limitrange-test-ns   #指定命名空间spec:  limits:  - default:      memory: 256Mi                   defaultRequest:      memory: 128Mi    type: Container
kubectl apply -f limitrange.yaml
[root@k8s-master limitrange]# kubectl describe limitrange mem-limit-range-test -n limitrange-test-ns Name:       mem-limit-range-testNamespace:  limitrange-test-nsType        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio----        --------  ---  ---  ---------------  -------------  -----------------------Container   memory    -    -    128Mi            256Mi          -
[root@k8s-master limitrange]# kubectl describe ns limitrange-test-nsName:         limitrange-test-nsLabels:       <none>Annotations:  <none>Status:       ActiveNo resource quota.Resource Limits Type       Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio ----       --------  ---  ---  ---------------  -------------  ----------------------- Container  memory    -    -    128Mi            256Mi          -

可以看到已为limitrange-test-ns的命名空间下所有的容器设置了默认的request值和limit值,接下来看下在容器中是如何生效的

容器limitrange生效验证】

1、容器未设置limit,且未设置request

[root@k8s-master limitrange]# cat container-limitrange.yaml apiVersion: v1kind: Podmetadata:  name: pod-container-men-limit-testspec:  containers:  - name: container-limlitrange-test    image: nginx:latest    imagePullPolicy: IfNotPresent
[root@k8s-master limitrange]# kubectl get pod -o wide -n limitrange-test-ns NAME                           READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATESpod-container-men-limit-test   1/1     Running   0          28s   10.122.235.216   k8s-master   <none>           <none>[root@k8s-master limitrange]# curl 10.122.235.216:80<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>    body {        width: 35em;        margin: 0 auto;        font-family: Tahoma, Verdana, Arial, sans-serif;    }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>

可以看到此Pod已经running,且业务正常,在创建此Pod容器部分并未设置默认值,但是Pod所在的命名空间有配置过默认的limitrange策略,验证下此策略是否生效到Pod的容器部分

spec:  containers:  - image: nginx:latest    imagePullPolicy: IfNotPresent    name: container-limlitrange-test    resources:      limits:        memory: 256Mi      requests:        memory: 128Mi

总结:容器未设置limit,且未设置request,则容器运行起来后的request和limit值默认与limitrange type为container设置的request和limit的保持一致。

2、容器中设置limit,但是未设置request

[root@k8s-master limitrange]# cat container-limitrange.yaml apiVersion: v1kind: Podmetadata:  name: pod-container-men-limit-test  namespace: limitrange-test-nsspec:  containers:  - name: container-limlitrange-test    image: nginx:latest    imagePullPolicy: IfNotPresent    resources:      limits:        memory: "500Mi"

只设置内存的limit值且大于limitrange设置的limit值

[root@k8s-master limitrange]# kubectl apply -f container-limitrange.yaml pod/pod-container-men-limit-test created[root@k8s-master limitrange]# kubectl get pod -n limitrange-test-ns NAME                           READY   STATUS    RESTARTS   AGEpod-container-men-limit-test   1/1     Running   0          9s
[root@k8s-master limitrange]# kubectl get pod pod-container-men-limit-test -o json -n limitrange-test-ns "spec": {        "containers": [            {                "image": "nginx:latest",                "imagePullPolicy": "IfNotPresent",                "name": "container-limlitrange-test",                "resources": {                    "limits": {                        "memory": "500Mi"                    },                    "requests": {                        "memory": "500Mi"                    }                },                "terminationMessagePath": "/dev/termination-log",                "terminationMessagePolicy": "File"

总结:容器中设置实际limit,但是未设置request,容器运行成功后request=实际limit

3、容器中未设置limit,但是设置request

[root@k8s-master limitrange]# cat container-limitrange.yaml apiVersion: v1kind: Podmetadata:  name: pod-container-men-limit-test  namespace: limitrange-test-nsspec:  containers:  - name: container-limlitrange-test    image: nginx:latest    imagePullPolicy: IfNotPresent    resources:      requests:        memory: "150Mi"
[root@k8s-master limitrange]# kubectl apply -f container-limitrange.yamlpod/pod-container-men-limit-test created
[root@k8s-master limitrange]# kubectl get pod pod-container-men-limit-test -o json -n limitrange-test-ns"spec": {        "containers": [            {                "image": "nginx:latest",                "imagePullPolicy": "IfNotPresent",                "name": "container-limlitrange-test",                "resources": {                    "limits": {                        "memory": "256Mi"                    },                    "requests": {                        "memory": "150Mi"                    }                },                "terminationMessagePath": "/dev/termination-log",                "terminationMessagePolicy": "File",

总结:容器中未设置limit,但是设置实际request,则容器运行起来后request=实际request,limit=limitrange.limit

二、Pod和容器的max、min、maxLimitRequestRatio

适用场景:控制容器或Pod的CPU或内存资源使用,如容器的CPU的request不得小于多少,limit不得大于多少,不满足条件则创建失败,先介绍下参数:

容器部分:
1、defaultRequest:容器默认的request值,若不指定request值,则默认为此值

2、max:容器的实际设置的limit值应小于等于此值

3、min:容器实际设置的request值应大于等于此值

4、maxLimitRequestRatio:Max Limit/Request Ratio,为容器CPU或内存的Limit/Request值应小于等于此值

Pod部分:

1、max:Pod中所有容器的实际设置的limit之和值应小于等于此值

2、min:Pod中所有容器实际设置的request值之和应大于等于此值

3、maxLimitRequestRatio:Max Limit/Request Ratio,为Pod中所有容器CPU或内存的Limit之和/Request之和值应小于等于此值

演示如下:

kubectl create namespace limitrange-02-test-ns
[root@k8s-master limitrange]# cat limitrange.yaml apiVersion: v1kind: LimitRangemetadata:  name: limitrange-test  namespace: limitrange-02-test-ns spec: limits: - max:    cpu: 2000m    memory: 1000Mi   min:    cpu: 200m    memory: 6Mi   maxLimitRequestRatio:    cpu: 3    memory: 2   type: Pod - default:                      #容器的默认limit值    cpu: 300m    memory: 200Mi   defaultRequest:               #容器的默认request值    cpu: 200m    memory: 100Mi   max:                          #容器的limit值不得大于max    cpu: 1000m    memory: 500Mi   min:                          #容器的request的值不得小于min    cpu: 100m    memory: 3Mi   maxLimitRequestRatio:         #容器的limit/request不得大于,如容器的CPU的limit/request不得大于4    cpu: 5    memory: 4   type: Container
kubectl apply -f container-02-limitrange.yaml
[root@k8s-master limitrange]# kubectl describe ns limitrange-02-test-ns Name:         limitrange-02-test-nsLabels:       <none>Annotations:  <none>Status:       ActiveNo resource quota.Resource Limits Type       Resource  Min   Max     Default Request  Default Limit  Max Limit/Request Ratio ----       --------  ---   ---     ---------------  -------------  ----------------------- Pod        cpu       200m  2       -                -              3 Pod        memory    6Mi   1000Mi  -                -              2 Container  cpu       100m  1       200m             300m           5 Container  memory    3Mi   500Mi   100Mi            200Mi          4

可以看到设置的Pod和容器设置的max和min已经生效了,接下来验证下设置的策略是否生效,创建1个Pod的容器的内存limit值大于500Mi

[root@k8s-master limitrange]# cat container-02-limitrange.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-limitrange-test
namespace: limitrange-02-test-ns
spec:
containers:
- name: container-limlitrange-test
image: nginx:latest
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "100Mi"
limits:
memory: "600Mi"

[root@k8s-master limitrange]# kubectl apply -f container-02-limitrange.yaml
Error from server (Forbidden): error when creating "container-02-limitrange.yaml": pods "pod-limitrange-test" is forbidden: [memory max limit to request ratio per Pod is 2, but provided ratio is 6.000000, maximum memory usage per Container is 500Mi, but limit is 600Mi, memory max limit to request ratio per Container is 4, but provided ratio is 6.000000]

提示容器的limit/request值为6大于4,且limit为600Mi大于设置最大max值500Mi,因此创建失败,在Pod只有1个容器的情况下podlimit/request值为6大于2,同样做下request值小于min值的测试

[root@k8s-master limitrange]# cat container-02-limitrange.yaml apiVersion: v1kind: Podmetadata:  name: pod-limitrange-test  namespace: limitrange-02-test-nsspec:  containers:  - name: container-limlitrange-test    image: nginx:latest    imagePullPolicy: IfNotPresent    resources:      requests:        memory: "1Mi"    #小于min值      limits:        memory: "200Mi
[root@k8s-master limitrange]# kubectl apply -f container-02-limitrange.yaml Error from server (Forbidden): error when creating "container-02-limitrange.yaml": pods "pod-limitrange-test" is forbidden: [minimum memory usage per Pod is 6Mi, but request is 1048576, memory max limit to request ratio per Pod is 2, but provided ratio is 200.000000, minimum memory usage per Container is 3Mi, but request is 1Mi, memory max limit to request ratio per Container is 4, but provided ratio is 200.000000]

提示容器request的值为1Mi小于min值3Mi,且limit/request=200大于4,同样不满足Pod的min为6和ratio,因此创建失败。

四、总结

本文描述了LimitRange的诞生背景、适用场景、以及具体如何实现和控制Pod、容器的资源限额,产品设计上主要考虑如下几点:

1、产品设计上需要方便用户低门槛快速设置默认request、limit值,配合Resource Quotas提供强大而稳定的K8S原生资源限额能力。

2、max、min、Limit/Request Ratio等功能如果开放给对K8S不了解的用户,门槛较高,若无意配置完成且生效,可能会导致容器的创建异常,且不知如何解决,是否直接开放需要认真考虑。

 

来源:https://www.icode9.com/content-4-839201.html

(0)

相关推荐

  • 调试 Kubernetes 最简单方法

    本文介绍了 Kubectl debug 和临时容器等调试方法. 作者:Martin Heinz  翻译:Bach (K8sMeetup) 校对:星空下的文仔  来源:K8sMeetup社区 调试容器化 ...

  • 云原生系列2 部署你的第一个k8s应用

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...

  • 在 Kubernetes 集群快速部署 KubeSphere 容器平台

    KubeSphere 不仅支持部署在 Linux 之上,还支持在已有 Kubernetes 集群之上部署 KubeSphere,自动纳管 Kubernetes 集群的已有资源与容器. 前提条件 Kub ...

  • Kubernetes官方java客户端之七:patch操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  • 市场营销:原理与实践(第17版)

    第 1 篇 定义市场营销和市场营销过程 第 1 章?营销:创造顾客价值和顾客契合? 1.1 什么是市场营销 1.2 理解市场与顾客需求 1.3 设计顾客价值导向的市场营销战略和计划 1.4 管理顾客关 ...

  • 力量训练原理与实践

    第一章 导论--定义.目标.任务与原则 一.训练的定义 二.训练的目标 三.训练任务 (一)个性培养 (二)专项体能 (三)神经肌肉的适应性 四.训练原则 (一)超负荷原则 (二)持续训练原则 (三) ...

  • 【赠书】如何深入浅出掌握联邦学习技术的原理与实践

    周末又到了,本周末给大家赠送3本人工智能领域的新书,本次赠送的书籍是<深入浅出联邦学习>,下面来看详情. 这是一本什么样的书 这是一部大型金融集团联邦学习负责人撰写,中外院士及清华.华科. ...

  • 疏水扩容器作用及原理

    正文 3265 字 丨 9 分钟阅读 疏水扩容器的作用:降低进入疏水扩容器的疏水的压力:工质回收热量再利用. 扩容器共有三路汽水管路:中间,疏水进入管路:底部,降压后的水的排出管路:上部,降压后闪蒸出 ...

  • 【直播】5.25日晚摄影图像处理原理与实践直播、赠书+书籍解读+案例剖析

    各位朋友,本周二晚8点(5月25日20:00),有三会开设一场深度学习与摄影图像处理相关的直播,届时会有书籍内容解读,实践案例讲解,赠书+纪念文化产品等环节,欢迎大家及时参与! 直播主题 本次主题是带 ...

  • 市场营销:原理与实践 第 2篇

    第 2 篇 理解市场和顾客价值 第 3 章?分析市场营销环境? 3.1 微观环境与宏观环境 3.2 人口与经济环境 3.3 自然与技术环境 3.4 政治 - 社会与文化环境 3.5 应对市场营销环境 ...

  • 市场营销:原理与实践 第 1 篇

    第 1 篇 定义市场营销和市场营销过程 第 1 章?营销:创造顾客价值和顾客契合? 1.1 什么是市场营销 1.2 理解市场与顾客需求 1.3 设计顾客价值导向的市场营销战略和计划 1.4 管理顾客关 ...

  • 市场营销:原理与实践 内容简介

    数字技术的迅猛发展创造了一个崭新的.更加契合的.更加互联的市场营销世界. 新消费者赋能和新市场营销分析,对于市场营销者及其服务的消费者都产生了重大影响.今天的市场营销,就是在数字和社交网络迅速变化的市 ...

  • docker容器增加端口映射最佳实践(修改配置文件方式)

    前言: 在日常的docker运维中,经常遇到这样一个问题:已经配置好且运行的docker容器要根据业务需要增加端口映射到宿主机,如何简单有效的解决呢? 下面以mysql容器为例,详细说明操作步骤. 一 ...