Kubernetes K8S之CPU和内存资源限制详解
Kubernetes K8S之CPU和内存资源限制详解
Pod资源限制
备注:CPU单位换算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超过 1m。1000m CPU = 1 CPU。
官网地址:
1 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/
2 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/
Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU和各种设备都有对应的cgroup。
默认情况下,Pod运行没有CPU和内存的限额。这意味着系统中的任何Pod将能够像执行Pod所在节点机器一样,可以消耗足够多的CPU和内存。一般会针对某些应用的Pod资源进行资源限制,这个资源限制是通过resources的requests【要分配的资源】和limits【最大使用资源】来实现的。
1 # cat cpu-request-limit.yaml
2 apiVersion: v1
3 kind: Pod
4 metadata:
5 name: cpu-demo
6 namespace: cpu-example
7 spec:
8 containers:
9 - name: cpu-demo-ctr
10 image: vish/stress
11 resources:
12 limits:
13 cpu: "1"
14 requests:
15 cpu: "0.5"
16 args:
17 - -cpus
18 - "2"
配置文件的 args 部分提供了容器启动时的参数。-cpus “2”
参数告诉容器尝试使用 2 个 CPU。
1 # memory-request-limit.yaml
2 apiVersion: v1
3 kind: Pod
4 metadata:
5 name: memory-demo
6 namespace: mem-example
7 spec:
8 containers:
9 - name: memory-demo-ctr
10 image: polinux/stress
11 resources:
12 limits:
13 memory: "200Mi"
14 requests:
15 memory: "100Mi"
16 command: ["stress"]
17 args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
配置文件的 args 部分提供了容器启动时的参数。 "--vm-bytes", "150M"
参数告知容器尝试分配 150 MiB 内存。不允许args中的启动内存大于limits限制内存。
namespace资源限制
备注:CPU单位换算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超过 1m。1000m CPU = 1 CPU。
官网地址:
https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/
为命名空间配置内存和 CPU 配额
怎么为命名空间设置容器可用的内存和 CPU 总量。你可以通过 ResourceQuota 对象设置配额,使用 ResourceQuota 限制命名空间中所有容器的内存请求总量、内存限制总量、CPU 请求总量和CPU 限制总量。
如果你想对单个容器而不是所有容器进行限制,就请使用 LimitRange。
示例:
1 # cat quota-mem-cpu.yaml
2 apiVersion: v1
3 kind: ResourceQuota
4 metadata:
5 name: mem-cpu-demo
6 spec:
7 hard:
8 requests.cpu: "1"
9 requests.memory: 1Gi
10 limits.cpu: "2"
11 limits.memory: 2Gi
应用如下【命名空间quota-mem-cpu-example已提前创建完毕】:
kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
查看 ResourceQuota 详情:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
输出部分结果如下:
1 spec:
2 hard:
3 limits.cpu: "2"
4 limits.memory: 2Gi
5 requests.cpu: "1"
6 requests.memory: 1Gi
7 status:
8 hard:
9 limits.cpu: "2"
10 limits.memory: 2Gi
11 requests.cpu: "1"
12 requests.memory: 1Gi
13 used:
14 limits.cpu: "0"
15 limits.memory: "0"
16 requests.cpu: "0"
17 requests.memory: "0"
ResourceQuota 在 quota-mem-cpu-example 命名空间中设置了如下要求:
- 每个容器必须有内存请求和限制,以及 CPU 请求和限制。
- 所有容器的内存请求总和不能超过1 GiB。
- 所有容器的内存限制总和不能超过2 GiB。
- 所有容器的 CPU 请求总和不能超过1 cpu。
- 所有容器的 CPU 限制总和不能超过2 cpu。
为命名空间配置默认的内存请求和限制
示例:
1 # cat memory-defaults.yaml
2 apiVersion: v1
3 kind: LimitRange
4 metadata:
5 name: mem-limit-range
6 spec:
7 limits:
8 - default:
9 memory: 512Mi
10 defaultRequest:
11 memory: 256Mi
12 type: Container
default类似于之前的limit;defaultRequest类似于之前的request。
应用如下:
kubectl create -f memory-defaults.yaml --namespace=default-mem-example
命名空间default-mem-example已提前创建完毕
现在,如果在 default-mem-example 命名空间创建容器,并且该容器没有声明自己的内存请求和限制值,那么它将被指定一个默认的内存请求256 MiB和一个默认的内存限制512 Mib。
为命名空间配置默认的CPU请求和限制
示例:
1 # cpu-defaults.yaml
2 apiVersion: v1
3 kind: LimitRange
4 metadata:
5 name: cpu-limit-range
6 spec:
7 limits:
8 - default:
9 cpu: 1
10 defaultRequest:
11 cpu: 0.5
12 type: Container
应用如下:
kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example
其中default-cpu-example名称空间已被提前创建
现在如果在 default-cpu-example 命名空间创建一个容器,该容器没有声明自己的 CPU 请求和限制时,那么将会给它指定默认的 CPU 请求0.5和默认的 CPU 限制值1。
配置命名空间的最小和最大内存约束
示例:
1 # cat memory-constraints.yaml
2 apiVersion: v1
3 kind: LimitRange
4 metadata:
5 name: mem-min-max-demo-lr
6 spec:
7 limits:
8 - max:
9 memory: 1Gi
10 min:
11 memory: 500Mi
12 type: Container
应用如下:
kubectl create -f memory-constraints.yaml --namespace=constraints-mem-example
其中constraints-mem-example名称空间已被提前创建
查看 LimitRange 的详情:
kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml
输出显示预期的最小和最大内存约束。但请注意,即使您没有在 LimitRange 的配置文件中指定默认值,默认值也会被自动创建。
1 limits:
2 - default:
3 memory: 1Gi
4 defaultRequest:
5 memory: 1Gi
6 max:
7 memory: 1Gi
8 min:
9 memory: 500Mi
10 type: Container
现在,只要在 constraints-mem-example 命名空间中创建容器,Kubernetes 就会执行下面的步骤:
- 如果 Container 未指定自己的内存请求和限制,将为它指定默认的内存请求和限制。
- 验证 Container 的内存请求是否大于或等于500 MiB【超出范围容器创建失败】。
- 验证 Container 的内存限制是否小于或等于1 GiB【超出范围容器创建失败】。
配置命名空间的最小和最大CPU约束
示例:
1 # cpu-constraints.yaml
2 apiVersion: v1
3 kind: LimitRange
4 metadata:
5 name: cpu-min-max-demo-lr
6 spec:
7 limits:
8 - max:
9 cpu: "800m"
10 min:
11 cpu: "200m"
12 type: Container
应用如下:
kubectl create -f cpu-constraints.yaml --namespace=constraints-cpu-example
其中constraints-cpu-example名称空间已被提前创建
查看 LimitRange 详情:
kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example
输出结果显示 CPU 的最小和最大限制符合预期。但需要注意的是,尽管你在 LimitRange 的配置文件中你没有声明默认值,默认值也会被自动创建。
1 limits:
2 - default:
3 cpu: 800m
4 defaultRequest:
5 cpu: 800m
6 max:
7 cpu: 800m
8 min:
9 cpu: 200m
10 type: Container
现在不管什么时候在 constraints-cpu-example 命名空间中创建容器,Kubernetes 都会执行下面这些步骤:
- 如果容器没有声明自己的 CPU 请求和限制,将为容器指定默认 CPU 请求和限制。
- 核查容器声明的 CPU 请求确保其大于或者等于200 millicpu。
- 核查容器声明的 CPU 限制确保其小于或者等于800 millicpu。
配置命名空间下pod总数
示例:
1 # cat quota-pod.yaml
2 apiVersion: v1
3 kind: ResourceQuota
4 metadata:
5 name: pod-demo
6 spec:
7 hard:
8 pods: "2"
应用如下【命名空间quota-pod-example已提前创建完毕】:
kubectl apply -f quota-pod.yaml --namespace=quota-pod-example
查看资源配额的详细信息:
kubectl get resourcequota pod-demo --namespace=quota-pod-example --output=yaml
从输出的信息我们可以看到,该命名空间下pod的配额是2个,目前创建的pods数为0,配额使用率为0。
1 spec:
2 hard:
3 pods: "2"
4 status:
5 hard:
6 pods: "2"
7 used:
8 pods: "0"
相关阅读
完毕!
———END———
如果觉得不错就关注下呗 (-^O^-) !
Kubernetes K8S之CPU和内存资源限制详解的更多相关文章
- Kubernetes K8S之Taints污点与Tolerations容忍详解
Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...
- Kubernetes K8S之affinity亲和性与反亲和性详解与示例
Kubernetes K8S之Node节点亲和性与反亲和性以及Pod亲和性与反亲和性详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...
- W3wp.exe占用CPU及内存资源
问题背景 最近使用一款系统,但是经常出现卡顿或者用户账号登录不了系统.后来将问题定位在了服务器中的“w3wp.exe”这个进程.在我们的用户对系统进行查询.修改等操作后,该进程占用大量的CPU以及内存 ...
- docker高级应用之cpu与内存资源限制(转)
时间:2015-06-09 14:01:52 阅读:1581 评论:0 收藏:0 [点我收藏+] 标签:docker资源限制 docker cpu限制 ...
- delphi 资源文件详解
delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...
- Java内存模型(JMM)详解
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...
- Java程序在内存中运行详解
目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...
- 【转贴】内存重要参数详解 RAS CAS
内存重要参数详解 RAS CAS 分类: LINUX 2014-09-12 09:41:58 原文地址:内存重要参数详解 RAS CAS 作者:Reny http://blog.chinaunix.n ...
- CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分
CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分 <CDA LEVEL 1描述性分析典型例题讲解> 主讲人:CDA命题组委会 傅老师 ▏2017 CDA L1备考资源习题 ...
随机推荐
- PHP代码审计分段讲解(6)
14 intval函数四舍五入 <?php if($_GET[id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_M ...
- 定位方式 及CSS高级技巧
定位 background-position 背景位置 浮动,在一个浮字上面,我们的定位,在一个位上.CSS离不开定位,特别是后面的JS特效,天天和定位打交道. 为什么要使用定位? 元素的定位属性 元 ...
- .NET 开源导入导出库 Magicodes.IE 2.5发布
今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...
- 蒲公英 · JELLY技术周刊 Vol.33: 前端基础课堂开课啦~
蒲公英 · JELLY技术周刊 Vol.33 页面文件太大?图片过大了吧:页面加载白屏?很有可能是字体文件还没加载完:页面加载时间过长?多半是主进程被阻塞--该怎么办呢?快来小葵,咳咳,「蒲公英」前端 ...
- 微信开发中,不同手机系统遇到的bug(不定时更新)
Ios系统 1.body上绑定click事件失效. 解决:body标签下面,用个div,当做包裹所有内容的大容器.给这个div,绑定click事件. 2.不支持 YYYY-MM-DD 的时间格式. 用 ...
- CSS知识点记录
1.浏览器style中显示的样式 这里面的样式,是行内样式或者是使用js添加的样式
- mybaties 使用注解注入动态sql (if-else)-转义字符
看到网上使用注解动态注入sql都是判断参数是否为空,我做项目的时候需要判断参数是否为字符串,需要对引号进行转义,所以把代码贴过来了. 注意:test表达式不能引用传入的参数,直接使用参数即可----- ...
- 处理fMRI数据的一些常用Matlab命令
背景 处理fMRI数据常常用到MATLAB,在此记录一些常用代码及功能. 1.读取原始DICOM数据 1-1 读入dicom图像并绘图: Image = dicomread('fMRI.dcm'); ...
- Python循环语句代码详解:while、for、break
1 while循环 循环语句是程序设计中常用的语句之一.任何编程语言都有while循环,Python也不例外.while循环的格式如下所示. while(表达式): - else: ...
- C# 中国日历 农历 阳历 星座 二十四节气 二十八星宿 节日 天干地支
using System; namespace DotNet.Utilities { /// <summary> /// 农历属性 /// </summary> public ...