Kubernetes K8S之CPU和内存资源限制详解

K8S之CPU和内存资源限制详解
Pod资源限制
备注:CPU单位换算:100m CPU,100和 0.1 CPU 都相同;精度不能超过 1m 。1000m CPU = 1 CPU 。
官网地址:
https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/
对资源的限制实际上是通过来控制的,是容器的一组用来控制内核如何运行进程的相关属性集合 。针对内存、CPU和各种设备都有对应的 。
默认情况下,Pod运行没有CPU和内存的限额 。这意味着系统中的任何Pod将能够像执行Pod所在节点机器一样,可以消耗足够多的CPU和内存 。一般会针对某些应用的Pod资源进行资源限制,这个资源限制是通过的【要分配的资源】和【最大使用资源】来实现的 。
CPU资源限制示例
# cat cpu-request-limit.yamlapiVersion: v1kind: Podmetadata:name: cpu-demonamespace: cpu-examplespec:containers:- name: cpu-demo-ctrimage: vish/stressresources:limits:cpu: "1"requests:cpu: "0.5"args:- -cpus- "2"
配置文件的 args 部分提供了容器启动时的参数 。-cpus “2”参数告诉容器尝试使用 2 个 CPU 。
内存资源限制示例
# memory-request-limit.yamlapiVersion: v1kind: Podmetadata:name: memory-demonamespace: mem-examplespec:containers:- name: memory-demo-ctrimage: polinux/stressresources:limits:memory: "200Mi"requests:memory: "100Mi"command: ["stress"]args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
配置文件的 args 部分提供了容器启动时的参数 。"--vm-bytes", "150M" 参数告知容器尝试分配 150 MiB 内存 。不允许args中的启动内存大于限制内存 。
资源限制
备注:CPU单位换算:100m CPU,100和 0.1 CPU 都相同;精度不能超过 1m 。1000m CPU = 1 CPU 。
官网地址:
https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/
为命名空间配置内存和 CPU 配额
怎么为命名空间设置容器可用的内存和 CPU 总量 。你可以通过对象设置配额,使用限制命名空间中所有容器的内存请求总量、内存限制总量、CPU 请求总量和CPU 限制总量 。
如果你想对单个容器而不是所有容器进行限制,就请使用。
示例:
# cat quota-mem-cpu.yamlapiVersion: v1kind: ResourceQuotametadata:name: mem-cpu-demospec:hard:requests.cpu: "1"requests.memory: 1Gilimits.cpu: "2"limits.memory: 2Gi
应用如下【命名空间quota-mem-cpu-已提前创建完毕】:
kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
查看详情:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
输出部分结果如下:
spec:hard:limits.cpu: "2"limits.memory: 2Girequests.cpu: "1"requests.memory: 1Gistatus:hard:limits.cpu: "2"limits.memory: 2Girequests.cpu: "1"requests.memory: 1Giused:limits.cpu: "0"limits.memory: "0"requests.cpu: "0"requests.memory: "0"
在 quota-mem-cpu- 命名空间中设置了如下要求:
为命名空间配置默认的内存请求和限制
示例:
# cat memory-defaults.yamlapiVersion: v1kind: LimitRangemetadata:name: mem-limit-rangespec:limits:- default:memory: 512MidefaultRequest:memory: 256Mitype: Container
类似于之前的limit;类似于之前的 。
应用如下:
kubectl create -f memory-defaults.yaml --namespace=default-mem-example
命名空间-mem-已提前创建完毕
现在,如果在 -mem- 命名空间创建容器,并且该容器没有声明自己的内存请求和限制值,那么它将被指定一个默认的内存请求256 MiB和一个默认的内存限制512 Mib 。
为命名空间配置默认的CPU请求和限制
示例:
# cpu-defaults.yamlapiVersion: v1kind: LimitRangemetadata:name: cpu-limit-rangespec:limits:- default:cpu: 1defaultRequest:cpu: 0.5type: Container
应用如下:
kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example
其中-cpu-名称空间已被提前创建
现在如果在 -cpu- 命名空间创建一个容器,该容器没有声明自己的 CPU 请求和限制时,那么将会给它指定默认的 CPU 请求0.5和默认的 CPU 限制值1 。
配置命名空间的最小和最大内存约束
示例:
# cat memory-constraints.yamlapiVersion: v1kind: LimitRangemetadata:name: mem-min-max-demo-lrspec:limits:- max:memory: 1Gimin:memory: 500Mitype: Container
应用如下:
kubectl create -f memory-constraints.yaml --namespace=constraints-mem-example

Kubernetes K8S之CPU和内存资源限制详解

文章插图
其中-mem-名称空间已被提前创建
查看的详情:
kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml
输出显示预期的最小和最大内存约束 。但请注意,即使您没有在的配置文件中指定默认值,默认值也会被自动创建 。
limits:- default:memory: 1GidefaultRequest:memory: 1Gimax:memory: 1Gimin:memory: 500Mitype: Container
现在,只要在 -mem- 命名空间中创建容器,就会执行下面的步骤:
配置命名空间的最小和最大CPU约束
示例:
# cpu-constraints.yamlapiVersion: v1kind: LimitRangemetadata:name: cpu-min-max-demo-lrspec:limits:- max:cpu: "800m"min:cpu: "200m"type: Container
应用如下:
kubectl create -f cpu-constraints.yaml --namespace=constraints-cpu-example
其中-cpu-名称空间已被提前创建
查看详情:
kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example
输出结果显示 CPU 的最小和最大限制符合预期 。但需要注意的是,尽管你在的配置文件中你没有声明默认值,默认值也会被自动创建 。
limits:- default:cpu: 800mdefaultRequest:cpu: 800mmax:cpu: 800mmin:cpu: 200mtype: Container
现在不管什么时候在 -cpu- 命名空间中创建容器,都会执行下面这些步骤:
配置命名空间下pod总数
示例:
# cat quota-pod.yamlapiVersion: v1kind: ResourceQuotametadata:name: pod-demospec:hard:pods: "2"
应用如下【命名空间quota-pod-已提前创建完毕】:
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 。
【Kubernetes K8S之CPU和内存资源限制详解】spec:hard:pods: "2"status:hard:pods: "2"used:pods: "0"