diff --git a/content/zh-cn/docs/tasks/configure-pod-container/assign-pod-level-resources.md b/content/zh-cn/docs/tasks/configure-pod-container/assign-pod-level-resources.md new file mode 100644 index 0000000000000..8ceb7fb0d0b35 --- /dev/null +++ b/content/zh-cn/docs/tasks/configure-pod-container/assign-pod-level-resources.md @@ -0,0 +1,429 @@ +--- +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/)