Kubernetes Container、Pod、Namespace内存及CPU限制
2022/8/27 5:25:54
本文主要是介绍Kubernetes Container、Pod、Namespace内存及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 Container、Pod、Namespace内存及CPU限制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23云原生周刊:利用 eBPF 增强 K8s
- 2024-12-20/kubernetes 1.32版本更新解读:新特性和变化一目了然
- 2024-12-19拒绝 Helm? 如何在 K8s 上部署 KRaft 模式 Kafka 集群?
- 2024-12-16云原生周刊:Kubernetes v1.32 正式发布
- 2024-12-13Kubernetes上运行Minecraft:打造开发者平台的例子
- 2024-12-12深入 Kubernetes 的健康奥秘:探针(Probe)究竟有多强?
- 2024-12-10运维实战:K8s 上的 Doris 高可用集群最佳实践
- 2024-12-022024年最好用的十大Kubernetes工具
- 2024-12-02OPA守门人:Kubernetes集群策略编写指南
- 2024-11-26云原生周刊:K8s 严重漏洞