--- title: 分配 Pod 级别 CPU 和内存资源 content_type: task weight: 30 min-kubernetes-server-version: 1.32 --- {{< feature-state feature_gate_name="PodLevelResources" >}} 本页介绍除了容器级别的资源规约外,如何在 Pod 级别指定 CPU 和内存资源。 Kubernetes 节点基于 Pod 的资源请求分配资源。 这些请求可以在 Pod 级别定义,也可以逐个为 Pod 内的容器定义。 当两种级别的请求都存在时,Pod 级别的请求优先。 同样,Pod 的资源用量受限于限制值(limits),这些限制值也可以在 Pod 级别或为 Pod 内的容器逐个设置。 另外,当两种级别的限制值都存在时,Pod 级别的设置值优先。 这样可以灵活地管理资源,使你能够在 Pod 级别和容器级别控制资源分配。 要在 Pod 级别指定资源,必须启用 `PodLevelResources` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)。 对于 Pod 级别资源: * 优先级:当 Pod 级别和容器级别的资源被同时指定时,Pod 级别的资源优先。 * QoS:Pod 级别的资源在影响 Pod 的 QoS 类时优先。 * OOM 分数:OOM 分数调整计算会同时考虑 Pod 级别和容器级别的资源。 * 兼容性:Pod 级别的资源设计为与现有特性兼容。 ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} 你必须为集群中的控制平面和所有节点启用 `PodLevelResources` [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/)。 ## 创建命名空间 {#create-a-namespace} 创建一个命名空间,以便你在本次练习中所创建的资源与集群的其余部分隔离开来。 ```shell kubectl create namespace pod-resources-example ``` ## 创建具有 Pod 级别内存请求和限制的 Pod 要在 Pod 级别为 Pod 指定内存请求,可以在 Pod 规约清单中包含 `resources.requests.memory` 字段。 要指定内存限制,可以包含 `resources.limits.memory` 字段。 在本次练习中,你将创建包含一个容器的 Pod。 此 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。以下是 Pod 的配置文件: {{% code_sample file="pods/resource/pod-level-memory-request-limit.yaml" %}} 清单中的 `args` 部分在容器启动时为容器提供参数。 `"--vm-bytes", "150M"` 参数告知容器尝试分配 150 MiB 的内存。 创建 Pod: ```shell kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example ``` 验证 Pod 正在运行: ```shell kubectl get pod memory-demo --namespace=pod-resources-example ``` 查看 Pod 的详细信息: ```shell kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example ``` 输出显示 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。 ```yaml ... spec: containers: ... resources: requests: memory: 100Mi limits: memory: 200Mi ... ``` 运行 `kubectl top` 获取 Pod 的指标度量值: ```shell 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 162856960 ``` ## 创建具有 Pod 级别 CPU 请求和限制的 Pod 要为 Pod 指定 CPU 请求,可以在 Pod 规约清单中包含 `resources.requests.cpu` 字段。 要指定 CPU 限制,可以包含 `resources.limits.cpu` 字段。 在本次练习中,你将创建包含一个容器的 Pod。 此 Pod 的请求为 0.5 CPU,限制为 1 CPU。以下是 Pod 的配置文件: {{% code_sample file="pods/resource/pod-level-cpu-request-limit.yaml" %}} 配置文件的 `args` 部分在容器启动时为容器提供参数。 `-cpus "2"` 参数告知容器尝试使用 2 个 CPU。 创建 Pod: ```shell kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-cpu-request-limit.yaml --namespace=pod-resources-example ``` 验证 Pod 正在运行: ```shell kubectl get pod cpu-demo --namespace=pod-resources-example ``` 查看 Pod 的详细信息: ```shell kubectl get pod cpu-demo --output=yaml --namespace=pod-resources-example ``` 输出显示 Pod 的 CPU 请求为 500 milliCPU,CPU 限制为 1 CPU。 ```yaml spec: containers: ... resources: limits: cpu: "1" requests: cpu: 500m ``` 使用 `kubectl top` 获取 Pod 的指标度量值: ```shell kubectl top pod cpu-demo --namespace=pod-resources-example ``` 这个示例的输出显示 Pod 使用了 974 milliCPU,这略低于 Pod 配置中指定的 1 CPU 限制值。 ``` NAME CPU(cores) MEMORY(bytes) cpu-demo 974m ``` 请注意,通过设置 `-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 的配置文件: {{% code_sample file="pods/resource/pod-level-resources.yaml" %}} 创建 Pod: ```shell kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example ``` 验证 Pod 容器正在运行: ```shell kubectl get pod-resources-demo --namespace=pod-resources-example ``` 查看 Pod 的详细信息: ```shell kubectl get pod memory-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 限制。 ```yaml ... 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。 ## 清理 {#clean-up} 删除你的命名空间: ```shell kubectl delete namespace pod-resources-example ``` ## {{% heading "whatsnext" %}} ### 对于应用开发者 * [为容器和 Pod 分配内存资源](/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/) * [为容器和 Pod 分配 CPU 资源](/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/) ### 对于集群管理员 * [为命名空间配置默认内存请求和限制](/zh-cn/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) * [为命名空间配置默认 CPU 请求和限制](/zh-cn/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) * [为命名空间配置最小和最大内存约束](/zh-cn/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) * [为命名空间配置最小和最大 CPU 约束](/zh-cn/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) * [为命名空间配置内存和 CPU 配额](/zh-cn/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)