系统相关
首页 > 系统相关> > Kubernetes Container、Pod、Namespace内存及CPU限制

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

作者:互联网

Quota资源限制

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

 

配额类型

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

 

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

 

对象数量:

 

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

资源名称

描述

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。

 

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(限制范围)对象提供的限制能够做到:

 

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

  在一个有两个节点,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