一 限制范围

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

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

在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

二 启用 LimitRange

对 LimitRange 的支持自 Kubernetes 1.10 版本默认启用。

LimitRange 支持在很多 Kubernetes 发行版本中也是默认启用的。

LimitRange 的名称必须是合法的 DNS 子域名。

三 限制范围总览

管理员在一个命名空间内创建一个 LimitRange 对象。
用户在命名空间内创建 Pod ,Container 和 PersistentVolumeClaim 等资源。
LimitRanger 准入控制器对所有没有设置计算资源需求的 Pod 和 Container 设置默认值与限制值, 并跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 对象中的最小、最大资源使用量以及使用量比值。
若创建或更新资源(Pod、 Container、PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 FORBIDDEN 与描述哪一项约束被违反的消息。
若命名空间中的 LimitRange 启用了对 cpu 和 memory 的限制, 用户必须指定这些值的需求使用量与限制使用量。否则,系统将会拒绝创建 Pod。
LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。

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

在一个有两个节点,8 GiB 内存与16个核的集群中,限制一个命名空间的 Pod 申请 100m 单位,最大 500m 单位的 CPU,以及申请 200Mi,最大 600Mi 的内存。
为 spec 中没有 cpu 和内存需求值的 Container 定义默认 CPU 限制值与需求值 150m,内存默认需求值 300Mi。

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

竞争和对 LimitRange 的改变都不会影响任何已经创建了的资源。

四 k8s容器资源限制

1 内存限制示例

[root@server2 ~]# mkdir limit
[root@server2 ~]# cd limit/
[root@server2 limit]# vi pod.yaml
[root@server2 limit]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: memory-demo
spec:containers:- name: memory-demoimage: stressargs:- --vm- "1"- --vm-bytes- 200Mresources:requests:memory: 50Milimits:memory: 100Mi[root@server2 limit]# kubectl apply -f pod.yaml
pod/memory-demo created
[root@server2 limit]# kubectl get pod
NAME          READY   STATUS              RESTARTS   AGE
memory-demo   0/1     ContainerCreating   0          16s
[root@server2 limit]# kubectl logs memory-demo
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: FAIL: [1] (416) <-- worker 6 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s

创建失败,因为在pod.yaml对内存上限作出了限制,所以出现了错误
如果容器超过其内存限制,则会被终止。如果可重新启动,则与所有其他类型的运行时故障一样,kubelet 将重新启动它。

现在修改限制:

[root@server2 limit]# vim pod.yaml
[root@server2 limit]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: memory-demo
spec:containers:- name: memory-demoimage: stressargs:- --vm- "1"- --vm-bytes- 200Mresources:requests:memory: 50Milimits:memory: 300Mi[root@server2 limit]# kubectl apply -f pod.yaml
pod/memory-demo created
[root@server2 limit]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
memory-demo   1/1     Running   0          8s
#修改限制后,容器可以正常运行了

2 CPU限制

[root@server2 limit]# vi pod1.yaml
[root@server2 limit]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: cpu-demo
spec:containers:- name: cpu-demoimage: stressresources:limits:cpu: "10"requests:cpu: "5"args:- -c- "2"[root@server2 limit]# kubectl apply -f pod1.yaml
pod/cpu-demo created
[root@server2 limit]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
cpu-demo      0/1     Pending   0          6s
#调度失败是因为申请的CPU资源超出集群节点所能提供的资源
#但CPU 使用率过高,不会被杀死

修改限制:

[root@server2 limit]# vim pod1.yaml
[root@server2 limit]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: cpu-demo
spec:containers:- name: cpu-demoimage: stressresources:limits:cpu: "1"requests:cpu: "0.5"args:- -c- "2"[root@server2 limit]# kubectl apply -f pod1.yaml
pod/cpu-demo created
[root@server2 limit]# kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
cpu-demo   1/1     Running   0          28s
[root@server2 limit]# kubectl describe pod cpu-demo
Name:         cpu-demo
Namespace:    default
Priority:     0
Node:         server4/172.25.7.4
Start Time:   Tue, 03 Aug 2021 04:21:31 -0400
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.4.6
IPs:IP:  10.244.4.6
Containers:cpu-demo:Container ID:  docker://2e42a39e6a0977cfdc6b7f15a69b0ab7fdd73e0b6a3d6654ca72a3c1127697bbImage:         stressImage ID:      docker-pullable://stress@sha256:48a71454d405dbe1c756dd728cadeb577f429f61313ac62b413b52fbaa8a3b44Port:          <none>Host Port:     <none>Args:-c2State:          RunningStarted:      Tue, 03 Aug 2021 04:21:32 -0400Ready:          TrueRestart Count:  0Limits:cpu:  1Requests:cpu:        500mEnvironment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mqkp8 (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True
Volumes:kube-api-access-mqkp8:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  46s   default-scheduler  Successfully assigned default/cpu-demo to server4Normal  Pulling    46s   kubelet            Pulling image "stress"Normal  Pulled     45s   kubelet            Successfully pulled image "stress" in 131.534603msNormal  Created    45s   kubelet            Created container cpu-demoNormal  Started    45s   kubelet            Started container cpu-demo

3 为namespace设置资源限制

[root@server2 limit]# vi namespace.yaml
[root@server2 limit]# cat namespace.yaml
apiVersion: v1
kind: LimitRange
metadata:name: limitrange-memory
spec:limits:- default:cpu: 0.5memory: 512MidefaultRequest:cpu: 0.1memory: 256Mimax:cpu: 1memory: 1Gimin:cpu: 0.1memory: 100Mitype: Container[root@server2 limit]# kubectl apply -f namespace.yaml
limitrange/limitrange-memory created
[root@server2 limit]# kubectl describe limitranges
Name:       limitrange-memory
Namespace:  default
Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---  ---------------  -------------  -----------------------
Container   memory    100Mi  1Gi  256Mi            512Mi          -
Container   cpu       100m   1    100m             500m           -

LimitRange 在 namespace 中施加的最小和最大内存限制只有在创建和更新 Pod 时才会被应用。改变 LimitRange 不会对之前创建的 Pod 造成影响。

为namespace设置资源配额:

[root@server2 limit]# vi namespace.yaml
[root@server2 limit]# cat namespace.yaml
apiVersion: v1
kind: LimitRange
metadata:name: limitrange-memory
spec:limits:- default:cpu: 0.5memory: 512MidefaultRequest:cpu: 0.1memory: 256Mimax:cpu: 1memory: 1Gimin:cpu: 0.1memory: 100Mitype: Container---
apiVersion: v1
kind: ResourceQuota
metadata:name: mem-cpu-demo
spec:hard:requests.cpu: "1"requests.memory: 1Gilimits.cpu: "2"limits.memory: 2Gi[root@server2 limit]# kubectl apply -f namespace.yaml
limitrange/limitrange-memory created
resourcequota/mem-cpu-demo created
[root@server2 limit]# kubectl describe resourcequotas
Name:            mem-cpu-demo
Namespace:       default
Resource         Used  Hard
--------         ----  ----
limits.cpu       0     2
limits.memory    0     2Gi
requests.cpu     0     1
requests.memory  0     1Gi

4 创建pod容器后查看

[root@server2 limit]# kubectl describe resourcequotas
Name:            mem-cpu-demo
Namespace:       default
Resource         Used  Hard
--------         ----  ----
limits.cpu       0     2
limits.memory    0     2Gi
requests.cpu     0     1
requests.memory  0     1Gi
[root@server2 limit]# vi pod.yaml
[root@server2 limit]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: memory-demo
spec:containers:- name: memory-demoimage: nginxargs:- --vm- "1"- --vm-bytes- 200Mresources:requests:memory: 500Milimits:memory: 1000Mi[root@server2 limit]# kubectl apply -f pod.yaml
pod/memory-demo created
[root@server2 limit]# kubectl describe resourcequotas
Name:            mem-cpu-demo
Namespace:       default
Resource         Used    Hard
--------         ----    ----
limits.cpu       500m    2
limits.memory    1000Mi  2Gi
requests.cpu     100m    1
requests.memory  500Mi   1Gi

5 总结

创建的ResourceQuota对象将在default名字空间中添加以下限制:
每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit)。
所有容器的内存请求总额不得超过1 GiB。
所有容器的内存限额总额不得超过2 GiB。
所有容器的CPU请求总额不得超过1 CPU。
所有容器的CPU限额总额不得超过2 CPU。

kubernetes资源监控(一)——k8s容器资源限制相关推荐

  1. 企业项目实战k8s篇(十三)k8s容器资源限制

    k8s容器资源限制 一.k8s容器资源限制 二.内存限制 三.cpu限制 四.namespace限制 1.为namespace设置资源限制 2.为namespace设置资源配额 3. Namespac ...

  2. k8s容器资源限制(内存限制、CPU限制、namespace的资源限制与资源配额)

    文章目录 1.资源的限制类型 2. 内存限制 3. CPU限制 4. 为namespace设置资源限制 5. 为namespace设置资源配额 1.资源的限制类型 Kubernetes采用reques ...

  3. docker查看java资源_JDK11设置Docker容器资源感知

    深入浅出docker+docker实战云图书 105.8元 (需用券) 去购买 > 一.背景 对于Java8的一些较早的版本(8u131以前?),如果部署在docker容器中,由于JVM不能感知 ...

  4. 资源画像,看得见的容器资源优化助手

    作者:张佐玮(佑祎) 背景介绍 K8s 为集群资源提供了良好的抽象,用户可以直接根据应用的资源需求填写容器资源规格,这种方式有效提升了集群资源的管理效率.然而,一直以来,容器资源规格填写的难题一直都让 ...

  5. 详解GaussDB(DWS) 资源监控

    摘要:本文主要着重介绍资源池资源监控以及用户资源监控. 本文分享自华为云社区<GaussDB(DWS)资源监控之用户.队列资源监控>,作者: 一只菜菜鸟. GaussDB(DWS)资源监控 ...

  6. loadrunner如何监控windows系统的资源

    问题背景:对于将应用部署在Windows操作系统的性能测试,这时资源监控是Windows的资源,当然可以远程到该系统直接监控,但是loadrunner上也是可以通过添加Windows资源窗口进行监控的 ...

  7. Kubernetes (k8s)资源

    Kubernetes系统架构简介 : https://mp.weixin.qq.com/s/GDiKrdHNOt6n05Z0hPWRyQ k8s 安全配置指南 : https://neuvector. ...

  8. K8s 集群资源监控、高可用搭建、部署java项目 (下)

    目录 集群资源监控 监控指标和搭建方案 搭建监控平台(k8s部署) 部署守护进程 部署prometheus 部署Grafana 高可用k8s集群 系统初始化 master节点部署keepalived ...

  9. k8s资源监控和日志管理

    k8s资源监控和日志管理 k8s监控资源使用率 查看集群资源状态 kubectl get cs显示scheduler Unhealthy,controller-manager Unhealthy 监控 ...

最新文章

  1. 初中英语八下单词表(SuperMemo QA文本格式)
  2. IOS代码添加控件,控件移动,放大,缩小,旋转
  3. Acwing第 9 场周赛【未完结】
  4. ASP.Net MVC 在ajax接收controller返回值为Json数据
  5. nopCommerce的源代码结构和架构
  6. 常见笔顺错误的字_最全汉字书写笔顺规则
  7. PHP超链接传数据库值格式,php – 使用超链接更新数据库
  8. Session持久化
  9. 垃圾处理设备远程调试远程运维方案
  10. JSON时间转换格式化
  11. c#程序设计实训报告心得体会_C#.NET程序设计实验一实验报告
  12. Codeforces 919C--Seat Arrangements
  13. Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)
  14. Vue3生命周期函数的那些事
  15. Opencv不显示图片
  16. 职场PUA:为什么你就不能逼自己一把呢?
  17. 逻辑备份和物理备份表级恢复
  18. 利用CheatEngine工具Ultimap功能对抗游戏数据加密以及拓展
  19. touchstart ,touchmove, touchend 页面随手指滑动
  20. iOS之AFNetworking在POST时以二进制形式传输

热门文章

  1. 如何将bing设置为chrome默认浏览器
  2. 各种CAD工艺流程图分享/锅炉、反渗透、磷铁矿选矿、水处理、SCR法处理硝酸尾气、选煤厂、焦煤矿选煤、电镀污水处理、聚丙烯腈原丝生产、合成氨脱硫工段、纯水系统、烟气脱硫、饮料车间设计……工艺流程图
  3. 仿制斯坦福机械狗——组装与电路控制
  4. [附源码]Nodejs计算机毕业设计绝味鸭脖连锁店信息系统Express(程序+LW)
  5. Python学习笔记——Flask数据库
  6. android 截屏keycode,如果你的安卓手机支持〔电源〕键+〔音量减〕键截屏,你可以代码...
  7. MySql列的插入,修改和删除
  8. VRML ASP教程
  9. 平面设计从混沌中走出
  10. aoi服务器图标删除后怎么找回,回收站图标没了是怎么回事?如何找回回收站图标?...