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【最大使用资源】来实现的。

CPU资源限制示例
 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"

相关阅读

1、官网:Pod的CPU资源分配限制

2、官网:Pod的内存资源分配限制

3、官网:管理内存、CPU 和 API 资源

完毕!


———END———
如果觉得不错就关注下呗 (-^O^-) !

Kubernetes K8S之CPU和内存资源限制详解的更多相关文章

  1. Kubernetes K8S之Taints污点与Tolerations容忍详解

    Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...

  2. Kubernetes K8S之affinity亲和性与反亲和性详解与示例

    Kubernetes K8S之Node节点亲和性与反亲和性以及Pod亲和性与反亲和性详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

  3. W3wp.exe占用CPU及内存资源

    问题背景 最近使用一款系统,但是经常出现卡顿或者用户账号登录不了系统.后来将问题定位在了服务器中的“w3wp.exe”这个进程.在我们的用户对系统进行查询.修改等操作后,该进程占用大量的CPU以及内存 ...

  4. docker高级应用之cpu与内存资源限制(转)

    时间:2015-06-09 14:01:52      阅读:1581      评论:0      收藏:0      [点我收藏+] 标签:docker资源限制   docker cpu限制    ...

  5. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

  6. Java内存模型(JMM)详解

    在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...

  7. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

  8. 【转贴】内存重要参数详解 RAS CAS

    内存重要参数详解 RAS CAS 分类: LINUX 2014-09-12 09:41:58 原文地址:内存重要参数详解 RAS CAS 作者:Reny http://blog.chinaunix.n ...

  9. CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分

    CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分 <CDA LEVEL 1描述性分析典型例题讲解> 主讲人:CDA命题组委会 傅老师 ▏2017 CDA L1备考资源习题 ...

随机推荐

  1. 团队作业part3--需求改进&系统设计

    一.需求&原型改进 1. 需求的修改 借鉴其他开发游戏的组的经验以及老师的建议,针对之前的需求分析,作出如下修改: 问题1:这款游戏对玩家的吸引力与驱动性有所不足. 修改1:增加成就系统与排行 ...

  2. 团队作业4-Day1

    团队作业4-Day1 1. 各个成员在 Alpha 阶段认领的任务 Alpha任务分配 人员 小程序样式实现 吴安冬+吴梓华 小程序js代码及云数据实现 庾艺锋+白军强 项目测试 王泽鑫+赵玮锋 2. ...

  3. jq中$(function(){})和js中window.onload区别

    先看下执行代码: $(function(){   console.log("jq");}) $(function(){   console.log("jq1") ...

  4. eclipse/myeclipse 使用技巧

    一.变量名自动补全 原理是:在输入变量名后,去掉按下空格或=后,代码上屏 以前只知道alt+/调出assist,后来发现可以所有字母都激活content assist(8.1里有写).用起来果然很爽, ...

  5. 【Cesium 颜狗初步】fabric 材质定义与自定义着色器实践

    fabric 材质定义:着色器实践 1. 示例代码 贴到沙盒里就可以运行: var viewer = new Cesium.Viewer("cesiumContainer"); v ...

  6. 深入解析 C# 的 String.Create 的方法

    作者:Casey McQuillan 译者:精致码农 原文:http://dwz.win/YVW 说明:原文比较长,翻译时精简了很多内容,对于不重要的细枝末节只用了一句话概括,但不并影响阅读. 你还记 ...

  7. Django中ORM的使用

    Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...

  8. Python 刷题笔记

    Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...

  9. C# 递归算法获取下级子级 2种方法

    第一种 直接实体添加Children 实体类 public class DepartmentItem { /// <summary> /// 部门Id /// </summary&g ...

  10. C#访问Access数据库提示未安装ISAM

    解决办法 1.在前面加上Jet OLEDB:,如: Jet OLEDB:Database Password='zt' <add name="ConStrOleDb" conn ...