当前位置:首页 > 运维 > 正文内容

简单理解k8s资源限制参数中cpu计量单位

MuWinds3周前 (01-18)运维20

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-ctr10     image: vish/stress11     resources:12       limits:13         cpu: "1"14       requests:15         cpu: "0.5"16     args:17     - -cpus18     - "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-ctr10     image: polinux/stress11     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: 1Gi10     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: 2Gi11     requests.cpu: "1"12     requests.memory: 1Gi13   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: 512Mi10     defaultRequest:11       memory: 256Mi12     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: 110     defaultRequest:11       cpu: 0.512     type: Container

 

应用如下:

kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example

其中default-cpu-example名称空间已被提前创建

现在如果在 default-cpu-example 命名空间创建一个容器,该容器没有声明自己的 CPU 请求和限制时,那么将会给它指定默认的 CPU 请求0.5和默认的 CPU 限制值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: 1Gi10     min:11       memory: 500Mi12     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 的配置文件中指定默认值,默认值也会被自动创建

 limits: 2 - default: 3     memory: 1Gi 4   defaultRequest: 5     memory: 1Gi 6   max: 7     memory: 1Gi 8   min: 9     memory: 500Mi10   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: 200m10   type: Container

现在不管什么时候在 constraints-cpu-example 命名空间中创建容器,Kubernetes 都会执行下面这些步骤:

  • 如果容器没有声明自己的 CPU 请求和限制,将为容器指定默认 CPU 请求和限制。

  • 核查容器声明的 CPU 请求确保其大于或者等于200 millicpu。

  • 核查容器声明的 CPU 限制确保其小于或者等于800 millicpu。

 

配置命名空间下pod总数

示例:

1 # cat quota-pod.yaml2 apiVersion: v13 kind: ResourceQuota4 metadata:5   name: pod-demo6 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"


标签: k8s

“简单理解k8s资源限制参数中cpu计量单位” 的相关文章

Zerotier配合Nginx实现内网穿透

之前博客网站一直用的家里机器配合香港Azure做frp内网穿透,用CF CDN进行数据分发,不提frp的虚拟局域网模式在跨国数据传输时面临的数据审查和路由方向会给速度及稳定性造成非常大的影响,其可能有的内存溢出和服务重启时的持续掉线问题也是很抓狂的,在这里,使用zerotier为两机打洞连接p2p,...

CentOS设置开机启动

AIO出现了硬盘问题,重启后发现离线下载服务没有开机自启,快速给开一下:先写一个开机自启的脚本:#!/bin/sh #chkconfig: 2345 80 90 #description:aria2开机自启 aria2c --conf-path=/e...

yarn构建提示Error: error:0308010C:digital envelope routines::unsupported的解决方法

这个是SSL套件的问题,输入下面的指令切换一下就好了:$env:NODE_OPTIONS = "--openssl-legacy-provider"...

雨云CDN清除指定文件的缓存

雨云的CDN并没有给用户清除缓存的选项,想清除缓存的话其实挺麻烦的。通过浏览器对网站的请求头我们可以看到,CDN的服务器是apache apisix通过查阅apisix有关缓存的文档,我们可以发现清除缓存的方法:https://apisix.apache.org/zh/docs/apisix/2.1...

在自己的家里建立属于自己的防火长城

终于明白了伟大的江泽民、胡锦涛与习近平元帅同志为啥要设立防火长城这个违背宪法中通信自由的东西了,我妈天天刷抖音快手,有的时候我一起来听到各种营销号对我耳朵的轰炸我又直接昏睡过去。以下说一下方法,我个人用的x86的openwrt,仅供参考:在百度、谷歌轮番搜索,搜到一个openwrt的过滤插件:FRO...

OpenWrt旁路由/独臂路由配置

在介绍旁路由配置之前,先说一下旁路由原理:你可以很清楚的看出:旁路由的网络接入与其他终端设备无异,你可以把他理解为一个普通的设备,这个设备负责数据交换的处理。大多数人装openwrt是为了翻墙,广告过滤,实际上这玩意儿行为管理的能力也不太行……那么,当我们把网关指向旁路由,我们的数据处理流程就是:客...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。