ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Kubernetes Container、Pod、Namespace内存及CPU限制

2022-08-25 20:34:05  阅读:312  来源: 互联网

标签:限制 Kubernetes namespace Namespace quota memory Container pod cpu


Quota资源限制

  对每个命名空间的资源消耗总量提供限制(在一个namespace下创建quota,就会只对当前namespace进行资源限制)。它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命令空间中的单个Pod可以使用的计算资源的总上限。

 

配额类型

  Kubernetes可以限制两种类型资源:

  • 对象数量:Kubernetes 资源数量,例如pods,services和ingress等。实施资源数量配额可以提高kubernetes稳定性,避免Etcd数据库无限增长,还可以避免占用node中其他功能资源(例如ip地址服务)。
  • 计算资源:物理或者虚拟资源容量,例如CPU,memory和存储容量。同样,实施计算资源配额可以避免消耗kubernetes集群中单个node所有计算资源,避免单个namespace中应用消耗所有集群资源,导致其他namespace中应用无法正常运行。

 

  kubernetes实施配额,通过ResourceQuota类型资源。一个namespace可以包含多个ResourceQuota对象,这些限制是累加的,一般情况,多个ResourceQuota 对象不会限定同一个资源。

 

对象数量:

  • persistentvolumeclaims
  • services
  • secrets
  • configmaps
  • replicationcontrollers
  • deployments.apps
  • deployments.apps
  • statefulsets.apps
  • jobs.batch
  • cronjobs.batch

 

  可以限制给定命名空间中可以请求的计算资源的总和

资源名称

描述

limits.cpu

所有非终止状态的Pod,其CPU限额总量不能超过该值。

limits.memory

所有非终止状态的Pod,其内存限额总量不能超过该值。

requests.cpu

所有非终止状态的Pod,其CPU需求总量不能超过该值。

requests.memory

所有非终止状态的Pod,其内存需求总量不能超过该值。

hugepages-<size>

对于所有非终止状态的Pod,针对指定尺寸的巨页请求总数不能超过此值。

cpu

与requests.cpu相同。

memorys

与requests.memory相同。

 

配额管理

       示例:创建ResourceQuota对象

[root@master10 ~]# kubectl create ns quota	#创建一个ns用于测试
namespace/quota created
[root@master10 ~]# kubectl config set-context --namespace quota --current

kubectl create quota -h   #查看创建帮助

#创建quota my-quota
kubectl create quota my-quota --hard=cpu=1,memory=1G,pods=2,services=3,replicationcontrollers=2,resourcequotas=1,secrets=5,persistentvolumeclaims=10

 

  也可以通过yaml方式创建:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: quota
spec:
  hard:
    persistentvolumeclaims: "10"
    pods: "5"
    requests.cpu: "2"
    limits.cpu: "4"
    requests.memory: 2Gi
    limits.memory: 4Gi
    secrets: "5"
    services: "3"

 

  pvc限制示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storagequota
spec:
  hard:
    persistentvolumeclaims: "5"
    requests.storage: "5Gi"

 

  查看创建的quota

kubectl get resourcequotas
kubectl describe resourcequotas my-quota

示例:

  创建一个quota对deployment pod数量进行限制,上限为5副本

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: quota
spec:
  hard:
    persistentvolumeclaims: "10"
    pods: "5"
    secrets: "5"
    services: "3"

 

创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        imagePullPolicy: IfNotPresent

 

水平伸缩扩展deployment为5副本

水平伸缩扩展deployment为6和7副本

提示创建错误超出pod数量限制为5个上线

Request 和 Limits

  pod.containers.resources定义包含两部分:requests和limits。

  • requests,指明pod运行需要的最少计算资源。调度器查找具有充足计算资源的nodes。
  • limits,指明pod运行可以获得节点最多计算资源,用于阻止pod占用node太多计算资源。node使用Linux内核功能cgroup,限制pod资源使用。

 

Request

  示例:限制cpu和内存

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: quota
spec:
  hard:
    cpu: "1"
    memory: "2G"
    persistentvolumeclaims: "10"
    pods: "5"
    secrets: "5"
    services: "3"

 

  cpu: 1核等于1000M资源申请

  创建deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            memory: "256Mi"
            cpu: "500m"

 

Limits:

  示例:限制cpu和内存的上限

  quota限制namespace下的资源上限cpu不得超过1核,内存不得超过2G

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: quota
spec:
  hard:
    limits.cpu: "1"
    limits.memory: "2G"
cpu: "500M"
    memory: "1G"
    persistentvolumeclaims: "10"
    pods: "5"
    secrets: "5"
    services: "3"

 

  deployment需要指定pods的cpu和内存最大使用上限

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            memory: "256Mi"
            cpu: "500m"
          limits:
            memory: "256Mi"
            cpu: "500m"

 

 

Limit Range

  limit range是解决使用quota资源配额时,控制器或者pod没有指定resource,而服务成功创建pod,必须使用limit range来指定默认配额,从而达到quota和limit range搭配使用。

  如果namespace设置了quota配额,那么创建不指定资源请求和资源限制的pod是不允许的。kubernetes中pod默认不指定资源请求和计算资源。为了在设定配额的namespace中使用pod,namespace还需要为pod资源请求设定默认范围。

 

  1、如果运行的容器没有定义资源(memory、CPU)等限制,但是在namespace定义了LimitRange限制,那么该容器会继承LimitRange中的默认限制。

  2、如果namespace没有定义LimitRange限制,那么该容器可以只要宿主机的最大可用资源,直到无资源可用而触发宿主机(OOM Killer)。

 

  https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/ CPU

  以核心为单位进行限制,单位可以是整核、浮点核心数或毫核(m/milli):2=2核心=200%  0.5=500m=50%  1.2=1200m=120%

 

  https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/

  memory以字节为单位,单位可以是E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki 1536Mi=1.5Gi

 

  requests(请求)为kubernetes scheduler执行pod调度时node节点至少需要拥有的资源。

  limits(限制)为pod运行成功后最多可以使用的资源上限。

 

  LimitRange类型资源,也称为limits,定义了单个pod的资源请求和资源限制default minimum maximum值。pod的资源请求是其中所有容器请求的总和

 

  默认情况下,Kubernetes集群上的容器运行使用的计算资源没有限制。 使用资源配额,集群管理员可以以名字空间为单位,限制其资源的使用与创建。在命名空间中,一个Pod或Container最多能够使用命名空间的资源配额所定义的 CPU和内存用量。 有人担心,一个Pod或Container会垄断所有可用的资源。LimitRange是在命名空间内限制资源分配(给多个Pod或Container)的策略对象。

 

       参考官网文档:

       https://kubernetes.io/zh-cn/docs/concepts/policy/limit-range/

一个LimitRange(限制范围)对象提供的限制能够做到:

  • 在一个命名空间中实施对每个Pod或Container最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个PersistentVolumeClaim能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个Container中。
  • 如果项目中请求一个未提供计算资源的对象,那么此时namespace将使用limit范围default值创建该对象。
  • 如果项目中请求一个计算资源的对象,请求的资源小于项目limit最小值,那么该资源无法创建。
  • 如果项目中请求一个计算资源的对象,请求的资源大于项目limit最大值,那么该资源也无法创建。

 

  能够使用限制范围创建的策略示例有:

  在一个有两个节点,8GiB内存与16个核的集群中,限制一个命名空间的Pod申请100m单位,最大500m单位的CPU,以及申请200Mi,最大600Mi的内存。

  为spec中没有cpu和内存需求值的Container定义默认CPU限制值与需求值150m,内存默认需求值300Mi。

  在命名空间的总限制值小于Pod或Container的限制值的总和的情况下,可能会产生资源竞争。在这种情况下,将不会创建Container或Pod。

 

限定资源类型

Type

Resource Name

Description

container

cpu、memory

限定容器cpu、memroy

Pod

cpu、memory

限定Pod中所有容器cpu、memroy的总和

PVS

storage

限定PVS申请的存储空间大小

 

pvc限制示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: storagelimits
  namespace: test
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 2Gi
    min:
      storage: 1Gi

 

  所有类型示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: limitrange
  namespace: test
spec:
  limits:
  - type: Container       #限制的资源类型
    max:
      cpu: "2"            #限制单个容器的最大CPU
      memory: "2Gi"       #限制单个容器的最大内存
    min:
      cpu: "500m"         #限制单个容器的最小CPU
      memory: "512Mi"     #限制单个容器的最小内存
    default:
      cpu: "500m"         #默认单个容器的CPU限制
      memory: "512Mi"     #默认单个容器的内存限制
    defaultRequest:
      cpu: "500m"         #默认单个容器的CPU创建请求
      memory: "512Mi"     #默认单个容器的内存创建请求
    maxLimitRequestRatio:
      cpu: 2              #限制CPU limit/request比值最大为2  
      memory: 2         #限制内存limit/request比值最大为2
  - type: Pod
    max:
      cpu: "4"            #限制单个Pod的最大CPU
      memory: "4Gi"       #限制单个Pod最大内存
  - type: PersistentVolumeClaim
    max:
      storage: 50Gi        #限制PVC最大的requests.storage
    min:
      storage: 30Gi        #限制PVC最小的requests.storage

 

limit-range配置:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo-lr
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "1Gi"
    defaultRequest:
      cpu: "200m"
      memory: "450Mi"
    max:
      cpu: "2"
      memory: "2Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    type: Container

 

  创建出来的 pod resources与limit ranage指定的相关默认值一致。

 

说明:

  name:只能使用小写字母,数字,'-' 和 '.',而且只能是数字或字母开头和结尾。

  default:即该namespace配置resourceQuota时,创建container的默认limit上限

  defaultRequest:即该namespace配置resourceQuota时,创建container的默认request上限

  max:即该namespace下创建container的资源最大值

  min:即该namespace下创建container的资源最小值

 

其中:min <= defaultRequest <= default <= max

 

标签:限制,Kubernetes,namespace,Namespace,quota,memory,Container,pod,cpu
来源: https://www.cnblogs.com/punchlinux/p/16625590.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有