分配 Pod 级别的 CPU 和内存资源

特性状态: Kubernetes v1.34 [beta] (默认启用:true)

本页面展示了如何除了在容器级别指定资源外,还在 Pod 级别为 Pod 指定 CPU 和内存资源。Kubernetes 节点根据 Pod 的资源请求为 Pod 分配资源。这些请求可以在 Pod 级别或 Pod 内的各个容器中定义。当两者都存在时,Pod 级别的请求具有优先权。

同样,Pod 的资源使用受限于限制,这些限制也可以在 Pod 级别或 Pod 内的各个容器中设置。同样,当两者都存在时,Pod 级别的限制具有优先权。这允许灵活的资源管理,使您能够在 Pod 和容器级别控制资源分配。

为了在 Pod 级别指定资源,需要启用 PodLevelResources Feature Gate

针对 Pod 级别资源

  • 优先级:当 Pod 级别和容器级别资源都指定时,Pod 级别资源优先。
  • QoS:Pod 级别资源在影响 Pod 的 QoS 类别方面具有优先权。
  • OOM Score:OOM 分数调整计算同时考虑 Pod 级别和容器级别资源。
  • 兼容性:Pod 级别资源旨在与现有功能兼容。

准备工作

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

你的 Kubernetes 服务器版本必须是 1.34 或更高版本。

要检查版本,请输入 kubectl version

必须为你的控制平面和集群中的所有节点启用 PodLevelResources 功能门控

限制

对于 Kubernetes 1.34,调整 Pod 级别资源具有以下限制:

  • 资源类型: Pod 级别只能指定 CPU、内存和 Hugepages 资源。
  • 操作系统: Pod 级别资源不支持 Windows Pod。
  • 资源管理器: 拓扑管理器、内存管理器和 CPU 管理器不会根据 Pod 级别资源对 Pod 和容器进行对齐,因为这些资源管理器目前不支持 Pod 级别资源。
  • 原地扩缩容 不支持原地扩缩容 Pod 级别资源。修改 Pod 上的 Pod 级别资源限制或请求会导致 field.Forbidden 错误。错误消息明确指出:“具有 Pod 级别资源的 Pod 无法进行扩缩容。”

创建命名空间

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

kubectl create namespace pod-resources-example

创建一个具有 Pod 级别内存请求和限制的 Pod

要在 Pod 级别为 Pod 指定内存请求,请在 Pod 规格清单中包含 resources.requests.memory 字段。要指定内存限制,请包含 resources.limits.memory

在此练习中,你将创建一个包含一个容器的 Pod。该 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。以下是该 Pod 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: pod-resources-example
spec:
  resources:
    requests:
      memory: "100Mi"
    limits:
      memory: "200Mi"
  containers:
  - name: memory-demo-ctr
    image: nginx
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

清单中的 args 部分为容器启动时提供参数。"--vm-bytes", "150M" 参数指示容器尝试分配 150 MiB 内存。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example

验证 Pod 是否正在运行

kubectl get pod memory-demo --namespace=pod-resources-example

查看 Pod 的详细信息

kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example

输出显示 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。

...
spec: 
  containers:    
  ...
  resources:
    requests:
      memory: 100Mi
    limits:
      memory: 200Mi
...

运行 kubectl top 获取 Pod 的指标。

kubectl top pod memory-demo --namespace=pod-resources-example

输出显示 Pod 正在使用大约 162,900,000 字节的内存,大约 150 MiB。这大于 Pod 的 100 MiB 请求,但在 Pod 的 200 MiB 限制之内。

NAME                        CPU(cores)   MEMORY(bytes)
memory-demo                 <something>  162856960

创建一个具有 Pod 级别 CPU 请求和限制的 Pod

要在 Pod 级别为 Pod 指定 CPU 请求,请在 Pod 规格清单中包含 resources.requests.cpu 字段。要指定 CPU 限制,请包含 resources.limits.cpu

在此练习中,你将创建一个包含一个容器的 Pod。该 Pod 的请求为 0.5 CPU,限制为 1 CPU。以下是该 Pod 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: "0.5"
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    args:
    - -cpus
    - "2"

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

创建 Pod

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

验证 Pod 是否正在运行

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

查看 Pod 的详细信息

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

输出显示 Pod 的 CPU 请求为 500 milliCPU,CPU 限制为 1 CPU。

spec:
  containers:
  ...
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

使用 kubectl top 获取 Pod 的度量数据。

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

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

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

回想一下,通过设置 -cpu "2",你将容器配置为尝试使用 2 个 CPU,但容器只被允许使用大约 1 个 CPU。由于容器尝试使用的 CPU 资源超过了 Pod CPU 限制,因此容器的 CPU 使用受到了限制。

创建在 Pod 级别和容器级别都具有资源请求和限制的 Pod

要为 Pod 分配 CPU 和内存资源,你可以在 Pod 级别和容器级别同时指定它们。在 Pod 规格中包含 resources 字段,以定义整个 Pod 的资源。此外,在 Pod 清单中容器的规格内包含 resources 字段,以设置容器特定的资源要求。

在此练习中,你将创建一个包含两个容器的 Pod,以探索 Pod 级别和容器级别资源规范的交互。Pod 本身将定义 CPU 请求和限制,而其中一个容器将拥有自己的显式资源请求和限制。另一个容器将继承 Pod 级别设置的资源约束。以下是 Pod 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: pod-resources-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
      memory: "200Mi"
    requests:
      cpu: "1"
      memory: "100Mi"
  containers:
  - name: pod-resources-demo-ctr-1
    image: nginx
    resources:
      limits:
        cpu: "0.5"
        memory: "100Mi"
      requests:
        cpu: "0.5"
        memory: "50Mi"
  - name: pod-resources-demo-ctr-2
    image: fedora
    command:
    - sleep
    - inf 

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example

验证 Pod 容器是否正在运行

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

查看 Pod 的详细信息

kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example

输出显示,Pod 中的一个容器的内存请求为 50 MiB,CPU 请求为 0.5 核,内存限制为 100 MiB,CPU 限制为 0.5 核。Pod 本身的内存请求为 100 MiB,CPU 请求为 1 核,内存限制为 200 MiB,CPU 限制为 1 核。

...
containers:
  name: pod-resources-demo-ctr-1
  resources:
      requests:
        cpu: 500m
        memory: 50Mi
      limits:
        cpu: 500m
        memory: 100Mi
  ...
  name: pod-resources-demo-ctr-2
  resources: {}  
resources:
  limits:
      cpu: 1
      memory: 200Mi
    requests:
      cpu: 1
      memory: 100Mi
...

由于指定了 Pod 级别的请求和限制,Pod 中两个容器的请求保证都将等于 1 核 CPU 和 100Mi 内存。此外,两个容器的总资源使用量不能超过 Pod 级别限制中指定的值,确保它们总共不能超过 200 MiB 内存和 1 核 CPU。

清理

删除你的命名空间

kubectl delete namespace pod-resources-example

下一步

针对应用程序开发者

致集群管理员

上次修改于 2025 年 7 月 3 日太平洋标准时间上午 6:28:1.34 版本 Pod 级别资源文档更新 (b4175eb858)