zoukankan      html  css  js  c++  java
  • 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【最大使用资源】来实现的

    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^-) !

     

  • 相关阅读:
    细节决定成败
    关于结构体大小一篇很详细的文章
    Mysql Innodb cluster集群搭建
    Oracle:imp导入dmp文件
    alert弹出窗口,点击确认后关闭页面
    CAS总结之Ticket篇
    web.xml文件的作用
    单点登陆(SSO)
    session和cookie的区别
    oracle问题之数据库恢复(三)
  • 原文地址:https://www.cnblogs.com/zhanglianghhh/p/14259632.html
Copyright © 2011-2022 走看看