[转帖]Kubernetes Container、Pod、Namespace内存及CPU限制

kubernetes,container,pod,namespace,内存,cpu,限制 · 浏览次数 : 0

小编点评

# Deployment ## 概述 * Deployment是创建容器的自动配置。 * 它需要配置以下参数: * replica数 * selector * container * 资源限制 ## 创建Deployment失败 * 如果 request大于defult limit值是不受限制的,则 request会大于limit range中的max limit值。 * 这会导致创建deployment失败,查看rs描述不得超过default limit值。 ## 创建成功 * 如果 request满足条件:memory: "1Gi",cpu: "1",则 request不会超过limit range中的max limit值。 * 这意味着创建deployment成功。 ## 资源限制 * Deployment只申请request值和大于defult limit值的limits值。 * 这意味着请求不会超过limits值中的max limit值。 ## 创建成功的结果 * 本文来自博客园,作者:PunchLinux,转载请注明原文链接:https://www.cnblogs.com/punchlinux/p/16625590.html。

正文

https://www.cnblogs.com/punchlinux/p/16625590.html

 

 

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

 

Pod未申请resource

  与quota搭配使用:注意limit-range中的default和defaultRequest不能超过quota中limit和requset的值,否则资源限制,导致错误无法创建pod

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

 

  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

 

  Depoloyment: 未申请resources

  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

 

 

 

 

 

Pod申请资源

  创建的容器requests值必须满足条件:min值<requests值<limits值。

 

  当只指定requests值时,limits值与default值保持一致。不得超过default limit值。

 

  Deployment只申请request值并且大于limit中的default limit值

  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: "1.5G"
  cpu: "600m"

 

  创建deployment失败,查看rs描述不得超过default limit值

  kubectl describe rs

 

  

  申请request和limit值,则request大于defult limit值是不受限制的,但不能大于limit range中的max limit值。

  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: "500Mi"
  cpu: "0.25"
  limits:
  memory: "1Gi"
  cpu: "1"

 

  创建成功

 

本文来自博客园,作者:PunchLinux,转载请注明原文链接:https://www.cnblogs.com/punchlinux/p/16625590.html

与[转帖]Kubernetes Container、Pod、Namespace内存及CPU限制相似的内容:

[转帖]Kubernetes Container、Pod、Namespace内存及CPU限制

https://www.cnblogs.com/punchlinux/p/16625590.html 阅读目录 配额类型 配额管理 Request 和 Limits limit-range配置: Pod未申请resource Pod申请资源 Quota资源限制 对每个命名空间的资源消耗总量提供限制(

[转帖]kubernetes限制pod的cpu和内存

http://www.5ityx.com/cate100/45070.html kubernetes限制pod的cpu和内存 1、在创建容器的配置文件中指定 spec: containers: - image: gcr.io/google_containers/serve_hostname imag

[转帖]kubernetes Flannel网络剖析

https://plantegg.github.io/2022/01/19/kubernetes_Flannel%E7%BD%91%E7%BB%9C%E5%89%96%E6%9E%90/ cni(Container Network Interface) CNI 全称为 Container Netwo

[转帖]Kubernetes 蓝绿发布、ABTest、滚动发布、灰度发布、金丝雀发布简介

蓝绿发布: 一些应用程序只需要部署一个新版本,并需要立即切到这个版本。因此,我们需要执行蓝/绿部署。在进行蓝/绿部署时,应用程序的一个新副本(绿)将与现有版本(蓝)一起部署。然后更新应用程序的入口/路由器以切换到新版本(绿)。然后,您需要等待旧(蓝)版本来完成所有发送给它的请求,但是大多数情况下,应

[转帖]kubernetes 资源管理概述

https://cizixs.com/2018/06/25/kubernetes-resource-management/ kubernetes 资源简介 什么是资源? 在 kubernetes 中,有两个基础但是非常重要的概念:node 和 pod。node 翻译成节点,是对集群资源的抽象;pod

[转帖]Kubernetes中的nodePort,targetPort,port的区别和意义(转)

原文https://blog.csdn.net/u013760355/article/details/70162242 https://blog.csdn.net/xinghun_4/article/details/50492041 1. nodePort 外部机器可访问的端口。 比如一个Web应用

[转帖]Kubernetes 集群无损升级实践

https://www.jianshu.com/p/182952a00efc 一、背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏。高频的版本发布带来了更多的新功能落地和 bug 及时修复,但是线上环境业务长期运行,任何变更出错都可能带来巨大的经济损失,

[转帖]Kubernetes 领进门 | 使用 Ingress-nginx 反向代理外部站点

https://cloud.tencent.com/developer/article/2187041 warning: 这篇文章距离上次修改已过204天,其中的内容可能已经有所变动。 本文旨在展示如何使用 ingress-nginx 作为反向代理加速集群外部服务原理。下文以反向代理 github

[转帖]kubernetes Tcp流量可视化

https://www.cnblogs.com/charlieroro/p/16771739.html 使用k8spacket和grafana的node graph插件可以查看kubernetes pod的TCP相关信息,如connection、bytes、和duration。下面是接收和响应的字节

[转帖]Kubernetes的垂直和水平扩缩容的性能评估

https://www.cnblogs.com/charlieroro/p/17009778.html 译自:Performance evaluation of the autoscaling strategies vertical and horizontal using Kubernetes 可