kubernetes资源监控(一)——k8s容器资源限制
一 限制范围
默认情况下, 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容器资源限制相关推荐
- 企业项目实战k8s篇(十三)k8s容器资源限制
k8s容器资源限制 一.k8s容器资源限制 二.内存限制 三.cpu限制 四.namespace限制 1.为namespace设置资源限制 2.为namespace设置资源配额 3. Namespac ...
- k8s容器资源限制(内存限制、CPU限制、namespace的资源限制与资源配额)
文章目录 1.资源的限制类型 2. 内存限制 3. CPU限制 4. 为namespace设置资源限制 5. 为namespace设置资源配额 1.资源的限制类型 Kubernetes采用reques ...
- docker查看java资源_JDK11设置Docker容器资源感知
深入浅出docker+docker实战云图书 105.8元 (需用券) 去购买 > 一.背景 对于Java8的一些较早的版本(8u131以前?),如果部署在docker容器中,由于JVM不能感知 ...
- 资源画像,看得见的容器资源优化助手
作者:张佐玮(佑祎) 背景介绍 K8s 为集群资源提供了良好的抽象,用户可以直接根据应用的资源需求填写容器资源规格,这种方式有效提升了集群资源的管理效率.然而,一直以来,容器资源规格填写的难题一直都让 ...
- 详解GaussDB(DWS) 资源监控
摘要:本文主要着重介绍资源池资源监控以及用户资源监控. 本文分享自华为云社区<GaussDB(DWS)资源监控之用户.队列资源监控>,作者: 一只菜菜鸟. GaussDB(DWS)资源监控 ...
- loadrunner如何监控windows系统的资源
问题背景:对于将应用部署在Windows操作系统的性能测试,这时资源监控是Windows的资源,当然可以远程到该系统直接监控,但是loadrunner上也是可以通过添加Windows资源窗口进行监控的 ...
- Kubernetes (k8s)资源
Kubernetes系统架构简介 : https://mp.weixin.qq.com/s/GDiKrdHNOt6n05Z0hPWRyQ k8s 安全配置指南 : https://neuvector. ...
- K8s 集群资源监控、高可用搭建、部署java项目 (下)
目录 集群资源监控 监控指标和搭建方案 搭建监控平台(k8s部署) 部署守护进程 部署prometheus 部署Grafana 高可用k8s集群 系统初始化 master节点部署keepalived ...
- k8s资源监控和日志管理
k8s资源监控和日志管理 k8s监控资源使用率 查看集群资源状态 kubectl get cs显示scheduler Unhealthy,controller-manager Unhealthy 监控 ...
最新文章
- 初中英语八下单词表(SuperMemo QA文本格式)
- IOS代码添加控件,控件移动,放大,缩小,旋转
- Acwing第 9 场周赛【未完结】
- ASP.Net MVC 在ajax接收controller返回值为Json数据
- nopCommerce的源代码结构和架构
- 常见笔顺错误的字_最全汉字书写笔顺规则
- PHP超链接传数据库值格式,php – 使用超链接更新数据库
- Session持久化
- 垃圾处理设备远程调试远程运维方案
- JSON时间转换格式化
- c#程序设计实训报告心得体会_C#.NET程序设计实验一实验报告
- Codeforces 919C--Seat Arrangements
- Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)
- Vue3生命周期函数的那些事
- Opencv不显示图片
- 职场PUA:为什么你就不能逼自己一把呢?
- 逻辑备份和物理备份表级恢复
- 利用CheatEngine工具Ultimap功能对抗游戏数据加密以及拓展
- touchstart ,touchmove, touchend 页面随手指滑动
- iOS之AFNetworking在POST时以二进制形式传输
热门文章
- 如何将bing设置为chrome默认浏览器
- 各种CAD工艺流程图分享/锅炉、反渗透、磷铁矿选矿、水处理、SCR法处理硝酸尾气、选煤厂、焦煤矿选煤、电镀污水处理、聚丙烯腈原丝生产、合成氨脱硫工段、纯水系统、烟气脱硫、饮料车间设计……工艺流程图
- 仿制斯坦福机械狗——组装与电路控制
- [附源码]Nodejs计算机毕业设计绝味鸭脖连锁店信息系统Express(程序+LW)
- Python学习笔记——Flask数据库
- android 截屏keycode,如果你的安卓手机支持〔电源〕键+〔音量减〕键截屏,你可以代码...
- MySql列的插入,修改和删除
- VRML ASP教程
- 平面设计从混沌中走出
- aoi服务器图标删除后怎么找回,回收站图标没了是怎么回事?如何找回回收站图标?...