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

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

本页展示了如何在 Pod 级别指定 CPU 和内存资源,除了容器级别的资源规范之外。Kubernetes 节点根据 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.34 版本或更高版本。

要检查版本,请输入 kubectl version

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

限制

对于 Kubernetes 1.35,Pod 级别资源具有以下限制

  • 资源类型: 只能在 Pod 级别指定 CPU、内存和 hugepages 资源。
  • 操作系统: Pod 级别资源不支持 Windows Pod。
  • 资源管理器: 拓扑管理器、内存管理器和 CPU 管理器不会根据 Pod 级别资源对 Pod 和容器进行对齐,因为这些资源管理器当前不支持 Pod 级别资源。
  • 原地调整大小: 原地调整大小 Pod 级别资源需要 InPlacePodLevelResourcesVerticalScaling 特性门控,该门控在 Kubernetes 1.35 中为 alpha 版本。有关更多详细信息,请参阅 调整 Pod CPU 和内存资源

创建命名空间

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

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 毫 CPU,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 毫 CPU,略低于 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 pod-resources-demo --namespace=pod-resources-example

查看 Pod 的详细信息

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

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

...
  containers:
  -
    name: pod-resources-demo-ctr-1
    resources:
      limits:
        cpu: 500m
        memory: 100Mi
      requests:
        cpu: 500m
        memory: 50Mi
...
  -
    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

接下来

针对应用程序开发人员

针对集群管理员