为容器和 Pod 分配 CPU 资源

本页展示了如何为容器分配 CPU 请求和 CPU 限制。容器不能使用超过配置限制的 CPU。只要系统有空闲的 CPU 时间,容器就有保证地分配到其请求的 CPU 数量。

开始之前

你需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与你的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果你还没有集群,可以使用 minikube 或使用以下 Kubernetes 游乐场之一创建集群

要检查版本,请输入 kubectl version

你的集群必须至少有 1 个 CPU 可供使用以运行任务示例。

本页上的某些步骤需要你在集群中运行 metrics-server 服务。如果你正在运行 metrics-server,可以跳过这些步骤。

如果你正在运行 Minikube,请运行以下命令以启用 metrics-server

minikube addons enable metrics-server

要查看 metrics-server(或资源指标 API metrics.k8s.io 的另一个提供程序)是否正在运行,请键入以下命令

kubectl get apiservices

如果资源指标 API 可用,输出将包含对 metrics.k8s.io 的引用。

NAME
v1beta1.metrics.k8s.io

创建命名空间

创建一个 命名空间,以便在本练习中创建的资源与你的集群的其余部分隔离。

kubectl create namespace cpu-example

指定 CPU 请求和 CPU 限制

要为容器指定 CPU 请求,请在容器的资源清单中包含 resources.requests.cpu 字段。要指定 CPU 限制,请包含 resources.limits.cpu

在本练习中,你创建一个 Pod,该 Pod 具有一个容器。该容器的请求为 0.5 CPU,限制为 1 CPU。这是 Pod 的配置文件

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"
    args:
    - -cpus
    - "2"

配置文件的 args 部分为容器启动时提供参数。-cpus "2" 参数告诉容器尝试使用 2 个 CPU。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example

验证 Pod 是否正在运行

kubectl get pod cpu-demo --namespace=cpu-example

查看 Pod 的详细信息

kubectl get pod cpu-demo --output=yaml --namespace=cpu-example

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

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

使用 kubectl top 获取 Pod 的指标

kubectl top pod cpu-demo --namespace=cpu-example

此示例输出显示 Pod 正在使用 974 毫 CPU,略低于 Pod 配置中指定的 1 CPU 限制。

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

回想一下,通过设置 -cpu "2",你配置了容器尝试使用 2 个 CPU,但容器只能使用大约 1 个 CPU。容器的 CPU 使用受到限制,因为容器正在尝试使用比其限制更多的 CPU 资源。

CPU 单位

CPU 资源以 CPU 单位衡量。在 Kubernetes 中,一个 CPU 等效于

  • 1 个 AWS vCPU
  • 1 个 GCP 核心
  • 1 个 Azure vCore
  • 具有超线程技术的裸机 Intel 处理器上的 1 个超线程

允许使用小数。请求 0.5 CPU 的容器保证获得请求 1 CPU 的容器的一半 CPU 数量。你可以使用后缀 m 表示毫。例如,100m CPU、100 毫 CPU 和 0.1 CPU 都是一样的。不允许精度小于 1m。

CPU 始终以绝对数量请求,从不以相对数量请求;0.1 在单核、双核或 48 核机器上都是相同数量的 CPU。

删除您的 Pod

kubectl delete pod cpu-demo --namespace=cpu-example

指定对你的节点来说过大的 CPU 请求

CPU 请求和限制与容器相关联,但将 Pod 视为具有 CPU 请求和限制是有用的。Pod 的 CPU 请求是 Pod 中所有容器的 CPU 请求之和。同样,Pod 的 CPU 限制是 Pod 中所有容器的 CPU 限制之和。

Pod 调度基于请求。仅当节点具有足够的 CPU 资源来满足 Pod CPU 请求时,Pod 才会调度到节点上运行。

在本练习中,你创建一个 Pod,该 Pod 的 CPU 请求过大,超过了集群中任何节点的容量。这是具有一个容器的 Pod 的配置文件。该容器请求 100 个 CPU,这很可能超过集群中任何节点的容量。

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"

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example

查看 Pod 状态

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

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

NAME         READY     STATUS    RESTARTS   AGE
cpu-demo-2   0/1       Pending   0          7m

查看 Pod 的详细信息,包括事件

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

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

Events:
  Reason                        Message
  ------                        -------
  FailedScheduling      No nodes are available that match all of the following predicates:: Insufficient cpu (3).

删除您的 Pod

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

如果你没有指定 CPU 限制

如果你没有为容器指定 CPU 限制,则以下情况之一适用

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

  • 容器正在运行在具有默认 CPU 限制的命名空间中,并且容器自动分配了默认限制。集群管理员可以使用 LimitRange 指定 CPU 限制的默认值。

如果你指定了 CPU 限制但没有指定 CPU 请求

如果你为容器指定了 CPU 限制但没有指定 CPU 请求,Kubernetes 会自动分配与限制匹配的 CPU 请求。同样,如果容器指定了自己的内存限制,但没有指定内存请求,Kubernetes 会自动分配与限制匹配的内存请求。

CPU 请求和限制的动机

通过配置在集群中运行的容器的 CPU 请求和限制,您可以有效地利用集群节点上可用的 CPU 资源。通过将 Pod 的 CPU 请求量保持较低,您可以增加 Pod 被调度的机会。通过设置高于 CPU 请求量的 CPU 限制,您可以实现两件事

  • Pod 可以爆发活动,利用碰巧可用的 CPU 资源。
  • Pod 在爆发期间可以使用的 CPU 资源量限制在一个合理的范围内。

清理

删除您的命名空间

kubectl delete namespace cpu-example

接下来

针对应用开发者

针对集群管理员

最后修改时间为 2025 年 11 月 30 日下午 6:45 PST:解决评审意见 (3a07e89982)