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

特性状态: Kubernetes v1.32 [alpha] (默认启用: false)

本页介绍了如何在 Pod 级别指定 Pod 的 CPU 和内存资源,以及容器级别的资源规范。Kubernetes 节点根据 Pod 的资源请求为 Pod 分配资源。这些请求可以在 Pod 级别定义,也可以在 Pod 内的容器中单独定义。当两者都存在时,Pod 级别的请求优先。

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

为了在 Pod 级别指定资源,需要启用 PodLevelResources 特性门控

对于 Pod 级别资源

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

准备开始

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

您的 Kubernetes 服务器的版本必须为 1.32 或更高版本。要检查版本,请输入 kubectl version

必须为您的控制平面和集群中的所有节点启用 PodLevelResources 特性门控

创建命名空间

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

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 指定 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 和 100 MiB 内存。此外,两个容器加起来使用的资源不会超过 Pod 级别限制中指定的资源,确保它们不会超过 200 MiB 的总内存和 1 核 CPU。

清理

删除您的命名空间

kubectl delete namespace pod-resources-example

下一步

对于应用程序开发人员

对于集群管理员

上次修改时间:太平洋标准时间 2024 年 10 月 30 日下午 5:17:KEP 2837:Pod 级别资源 Alpha (0374213f57)