Kubernetes为容器和 Pods 分配 CPU 资源

Kubernetes为容器和 Pods 分配 CPU 资源

一、指定CPU请求和CPU限制

1、创建一个命名空间(namespace)

[root@master ~]# kubectl create namespace cpu-example
namespace/cpu-example created

2、编写yaml文件
要为容器指定CPU请求,需要在容器资源清单中包含resource: requests字段。要指定CPU限制,请包含resource: limits。
本次例子中年,将创建一个具有一个容器的Pod。容器将请求0.5个CPU,而且最多限制使用1个CPU。

[root@master cpu-request-limit]# vim cpu-request-limit.yaml 
[root@master cpu-request-limit]# cat cpu-request-limit.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    # - cpus "2"表示容器尝试使用两个CPU
    args:
    - -cpus
    - "2"
  
  
[root@master cpu-request-limit]# kubectl apply -f cpu-request-limit.yaml 
pod/cpu-demo created

配置文件中args部分提供了容器启动时的参数。-cpus “2” 参数表示容器尝试使用2个CPU。

3、验证所创建的Pod

验证所创建的Pod是否处于Running状态

[root@master cpu-request-limit]# kubectl get pod cpu-demo --namespace cpu-example
NAME       READY   STATUS    RESTARTS   AGE
cpu-demo   1/1     Running   0          8m23s

查看显示关于Pod的详细信息

[root@master cpu-request-limit]# kubectl get pod cpu-demo -o yaml -n cpu-example

显示输出Pod中的一个容器的CPU请求为500milliCPU,并且CPU限制为1个CPU。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 500m

使用kubectl top命令来获取该Pod的指标

[root@master cpu-request-limit]# kubectl top pod cpu-demo --namespace=cpu-example    

此示例输出显示Pod所使用的是1001milliCPU,略低于Pod配置中指定的1个(1024milli)CPU的限制。

W0325 21:15:28.747704   14860 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME       CPU(cores)   MEMORY(bytes)   
cpu-demo   1001m        1Mi         

如果说设置 -cpu “2”,你将容器配置为尝试使用2个CPU,但是容器只被允许使用大约1个CPU。容器的CPU用量受到限制,因为该容器正尝试使用超出其限制的CPU资源。

说明:CPU使用率低于1.0的另一种可能的解释是,节点可能没有足够的CPU资源可用。此案例的先决条件需要你的集群至少具有一个CPU可用。如果你的容器在只有一个CPU的节点上运行,则容器无论为容器指定的CPU限制如何,都不能使用超过1个CPU。

额外知识
CPU资源以CPU单位度量,Kubernetes中的一个CPU等同于:

  • 1个AWS vCPU
  • 1个GCP核心
  • 1个Azure vCore
  • 裸机上具有超线程能力的英特尔处理器的1个超线程
    小数值是可以使用的。一个请求0.5CPU的容器保证会获得请求1个CPU的容器的CPU的一半。你可以使用后缀m表示毫。例如100mCPU、100milliCPU都相同。精度不能超过1m。
    CPU请求只能使用绝对数量,而不是相对数量。0.1在单核、双核或48核计算机上的数量值是一样的。

删除容器

[root@master cpu-request-limit]# kubectl delete -f cpu-request-limit.yaml 
pod "cpu-demo" deleted

二、设置超过节点能力的CPU请求

CPU请求和限制都与容器相关,但是我们可以考虑一下Pod具有对应的CPU请求和限制这样的场景。Pod对CPU用量的请求等于Pod中所有容器的请求数量之和。同样,Pod的CPU资源限制等于Pod中所有容器CPU资源限制数之和。

Pod调度是基于资源请求值来进行的。仅在某节点具有足够的CPU资源来满足Pod CPU请求时,Pod 将会在对应节点上运行:

在本案例中,你将创建一个 Pod,该 Pod 的 CPU 请求对于集群中任何节点的容量而言都会过大。 下面是 Pod 的配置文件,其中有一个容器。容器请求 100 个 CPU,这可能会超出集群中任何节点的容量。

[root@master cpu-request-limit]# vim cpu-request-limit2.yaml
[root@master cpu-request-limit]# cat cpu-request-limit2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo-2
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

1、创建Pod

[root@master cpu-request-limit]# kubectl create -f cpu-request-limit2.yaml 
pod/cpu-demo-2 created

2、查看Pod的状态

输出显示 Pod 状态为 Pending。也就是说,Pod 未被调度到任何节点上运行, 并且 Pod 将无限期地处于 Pending 状态:

[root@master cpu-request-limit]# kubectl get pod cpu-demo-2 -n cpu-example
NAME         READY   STATUS    RESTARTS   AGE
cpu-demo-2   0/1     Pending   0          53s

查看有关 Pod 的详细信息,包含事件

kubectl describe pod cpu-demo-2 --namespace=cpu-example

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  2m    default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Warning  FailedScheduling  119s  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.

输出显示由于节点上的 CPU 资源不足,无法调度容器:

在这里插入图片描述
3、删除Pod

[root@master cpu-request-limit]# kubectl delete -f cpu-request-limit2.yaml 
pod "cpu-demo-2" deleted

如果不指定 CPU 限制

1、如果你没有为容器指定 CPU 限制,则会发生以下情况之一:

容器在可以使用的 CPU 资源上没有上限。因而可以使用所在节点上所有的可用 CPU 资源。

容器在具有默认 CPU 限制的名字空间中运行,系统会自动为容器设置默认限制。 集群管理员可以使用 LimitRange 指定 CPU 限制的默认值。

如果你设置了 CPU 限制但未设置 CPU 请求

如果你为容器指定了 CPU 限制值但未为其设置 CPU 请求,Kubernetes 会自动为其 设置与 CPU 限制相同的 CPU 请求值。类似的,如果容器设置了内存限制值但未设置 内存请求值,Kubernetes 也会为其设置与内存限制值相同的内存请求。

CPU 请求和限制的初衷

通过配置你的集群中运行的容器的 CPU 请求和限制,你可以有效利用集群上可用的 CPU 资源。 通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更有机会被调度。 通过使 CPU 限制大于 CPU 请求,你可以完成两件事:

Pod 可能会有突发性的活动,它可以利用碰巧可用的 CPU 资源。

Pod 在突发负载期间可以使用的 CPU 资源数量仍被限制为合理的数量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跑不完的脚本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值