From 37dd442dfa8bf9017b6ee006eeab15e1be40b495 Mon Sep 17 00:00:00 2001 From: song Date: Sat, 14 May 2022 21:50:52 +0800 Subject: [PATCH] [zh] sync manage-resources/*.md Signed-off-by: song --- .../manage-resources/cpu-default-namespace.md | 152 ++++++++++++------ .../memory-constraint-namespace.md | 135 +++++++++------- 2 files changed, 180 insertions(+), 107 deletions(-) diff --git a/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md index cc516e24cd..c00fa48828 100644 --- a/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md +++ b/content/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace.md @@ -2,6 +2,8 @@ title: 为命名空间配置默认的 CPU 请求和限制 content_type: task weight: 20 +description: >- + 为命名空间定义默认的 CPU 资源限制,在该命名空间中每个新建的 Pod 都会被配置上 CPU 资源限制。 --- -本章介绍怎样为命名空间配置默认的 CPU 请求和限制。 -一个 Kubernetes 集群可被划分为多个命名空间。如果在配置了 CPU 限制的命名空间创建容器, -并且该容器没有声明自己的 CPU 限制,那么这个容器会被指定默认的 CPU 限制。 -Kubernetes 在一些特定情况还会指定 CPU 请求,本文后续章节将会对其进行解释。 +本章介绍如何为{{< glossary_tooltip text="命名空间" term_id="namespace" >}}配置默认的 CPU 请求和限制。 + +一个 Kubernetes 集群可被划分为多个命名空间。 +如果你在具有默认 CPU[限制](/zh/docs/concepts/configuration/manage-resources-containers/#requests-and-limits) +的命名空间内创建一个 Pod,并且这个 Pod 中任何容器都没有声明自己的 CPU 限制, +那么{{< glossary_tooltip text="控制面" term_id="control-plane" >}}会为容器设定默认的 CPU 限制。 + +Kubernetes 在一些特定情况还可以设置默认的 CPU 请求,本文后续章节将会对其进行解释。 ## {{% heading "prerequisites" %}} -{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +{{< include "task-tutorial-prereqs.md" >}} + + +在你的集群里你必须要有创建命名空间的权限。 + +如果你还不熟悉 Kubernetes 中 1.0 CPU 的含义, +请阅读 [CPU 的含义](/zh/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu)。 @@ -46,12 +72,13 @@ kubectl create namespace default-cpu-example ## 创建 LimitRange 和 Pod -这里给出了 LimitRange 对象的配置文件。该配置声明了一个默认的 CPU 请求和一个默认的 CPU 限制。 +以下为 {{< glossary_tooltip text="LimitRange" term_id="limitrange" >}} 的示例清单。 +清单中声明了默认 CPU 请求和默认 CPU 限制。 {{< codenew file="admin/resource/cpu-defaults.yaml" >}} @@ -65,18 +92,19 @@ kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --name ``` -现在如果在 default-cpu-example 命名空间创建一个容器,该容器没有声明自己的 CPU 请求和限制时, -将会给它指定默认的 CPU 请求0.5和默认的 CPU 限制值1. +现在如果你在 default-cpu-example 命名空间中创建一个 Pod, +并且该 Pod 中所有容器都没有声明自己的 CPU 请求和 CPU 限制, +控制面会将 CPU 的默认请求值 0.5 和默认限制值 1 应用到 Pod 上。 -这里给出了包含一个容器的 Pod 的配置文件。该容器没有声明 CPU 请求和限制。 +以下为只包含一个容器的 Pod 的清单。该容器没有声明 CPU 请求和限制。 {{< codenew file="admin/resource/cpu-defaults-pod.yaml" >}} @@ -99,10 +127,12 @@ kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example ``` -输出显示该 Pod 的容器有一个500 millicpus的 CPU 请求和一个1 cpu的 CPU 限制。这些是 LimitRange 声明的默认值。 +输出显示该 Pod 的唯一的容器有 500m `cpu` 的 CPU 请求和 1 `cpu` 的 CPU 限制。 +这些是 LimitRange 声明的默认值。 ```shell containers: @@ -117,14 +147,14 @@ containers: ``` ## 你只声明容器的限制,而不声明请求会怎么样? -这是包含一个容器的 Pod 的配置文件。该容器声明了 CPU 限制,而没有声明 CPU 请求。 +以下为只包含一个容器的 Pod 的清单。该容器声明了 CPU 限制,而没有声明 CPU 请求。 {{< codenew file="admin/resource/cpu-defaults-pod-2.yaml" >}} @@ -138,9 +168,10 @@ kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml ``` -查看 Pod 的声明: +查看你所创建的 Pod 的[规约](/zh/docs/concepts/overview/working-with-objects/kubernetes-objects/#object-spec-and-status): ``` kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example @@ -148,9 +179,9 @@ kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example -输出显示该容器的 CPU 请求和 CPU 限制设置相同。注意该容器没有被指定默认的 CPU 请求值0.5 cpu。 +输出显示该容器的 CPU 请求和 CPU 限制设置相同。注意该容器没有被指定默认的 CPU 请求值 0.5 `cpu`: ``` resources: @@ -161,14 +192,14 @@ resources: ``` ## 你只声明容器的请求,而不声明它的限制会怎么样? -这里给出了包含一个容器的 Pod 的配置文件。该容器声明了 CPU 请求,而没有声明 CPU 限制。 +这里给出了包含一个容器的 Pod 的示例清单。该容器声明了 CPU 请求,而没有声明 CPU 限制。 {{< codenew file="admin/resource/cpu-defaults-pod-3.yaml" >}} @@ -182,21 +213,22 @@ kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml ``` -查看 Pod 的规约: +查看所你创建的 Pod 的规约: ``` kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example ``` -结果显示该容器的 CPU 请求被设置为容器配置文件中声明的数值。 -容器的CPU限制被设置为 1 CPU,即该命名空间的默认 CPU 限制值。 +输出显示你所创建的 Pod 中,容器的 CPU 请求为 Pod 清单中声明的值。 +然而同一容器的 CPU 限制被设置为 1 `cpu`,此值是该命名空间的默认 CPU 限制值。 ``` resources: @@ -209,27 +241,41 @@ resources: ## 默认 CPU 限制和请求的动机 -如果你的命名空间有一个 -[资源配额](/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/), -那么有一个默认的 CPU 限制是有帮助的。这里有资源配额强加给命名空间的两条限制: +如果你的命名空间设置了 CPU {{< glossary_tooltip text="资源配额" term_id="resource-quota" >}}, +为 CPU 限制设置一个默认值会很有帮助。 +以下是 CPU 资源配额对命名空间的施加的两条限制: -* 命名空间中运行的每个容器必须有自己的 CPU 限制。 -* 命名空间中所有容器使用的 CPU 总和不能超过一个声明值。 +* 命名空间中运行的每个 Pod 中的容器都必须有 CPU 限制。 -如果容器没有声明自己的 CPU 限制,将会给它一个默认限制,这样它就能被允许运行在一个有配额限制的命名空间中。 +* CPU 限制用来在 Pod 被调度到的节点上执行资源预留。 + +预留给命名空间中所有 Pod 使用的 CPU 总量不能超过规定的限制。 + + +当你添加 LimitRange 时: + +如果该命名空间中的任何 Pod 的容器未指定 CPU 限制, +控制面将默认 CPU 限制应用于该容器, +这样 Pod 可以在受到 CPU ResourceQuota 限制的命名空间中运行。 -集群中每个节点必须至少要有 1 GiB 的内存。 +在你的集群里你必须要有创建命名空间的权限。 + +集群中的每个节点都必须至少有 1 GiB 的内存可供 Pod 使用。 @@ -51,11 +57,11 @@ kubectl create namespace constraints-mem-example ## 创建 LimitRange 和 Pod -下面是 LimitRange 的配置文件: +下面是 LimitRange 的示例清单: {{< codenew file="admin/resource/memory-constraints.yaml" >}} @@ -98,30 +104,31 @@ file for the LimitRange, they were created automatically. ``` -现在,只要在 constraints-mem-example 命名空间中创建容器,Kubernetes 就会执行下面的步骤: +现在,每当在 constraints-mem-example 命名空间中创建 Pod 时,Kubernetes 就会执行下面的步骤: -* 如果 Container 未指定自己的内存请求和限制,将为它指定默认的内存请求和限制。 +* 如果 Pod 中的任何容器未声明自己的内存请求和限制,将为该容器设置默认的内存请求和限制。 -* 验证 Container 的内存请求是否大于或等于500 MiB。 +* 确保该 Pod 中的每个容器的内存请求至少 500 MiB。 -* 验证 Container 的内存限制是否小于或等于1 GiB。 +* 确保该 Pod 中每个容器内存请求不大于 1 GiB。 -这里给出了包含一个 Container 的 Pod 配置文件。Container 声明了 600 MiB 的内存请求和 -800 MiB 的内存限制, 这些满足了 LimitRange 施加的最小和最大内存约束。 +以下为包含一个容器的 Pod 清单。该容器声明了 600 MiB 的内存请求和 800 MiB 的内存限制, +这些满足了 LimitRange 施加的最小和最大内存约束。 {{< codenew file="admin/resource/memory-constraints-pod.yaml" >}} @@ -135,9 +142,9 @@ kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod.y ``` -确认下 Pod 中的容器在运行: +确认 Pod 正在运行,并且其容器处于健康状态: ```shell kubectl get pod constraints-mem-demo --namespace=constraints-mem-example @@ -153,10 +160,12 @@ kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-e ``` -输出结果显示容器的内存请求为600 MiB,内存限制为800 MiB。这些满足了 LimitRange 设定的限制范围。 +输出结果显示该 Pod 的容器的内存请求为 600 MiB,内存限制为 800 MiB。 +这些满足这个命名空间中 LimitRange 设定的限制范围。 ```yaml resources: @@ -178,12 +187,12 @@ kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example ## 尝试创建一个超过最大内存限制的 Pod -这里给出了包含一个容器的 Pod 的配置文件。容器声明了800 MiB 的内存请求和1.5 GiB 的内存限制。 +以下为包含一个容器的 Pod 的清单。这个容器声明了 800 MiB 的内存请求和 1.5 GiB 的内存限制。 {{< codenew file="admin/resource/memory-constraints-pod-2.yaml" >}} @@ -197,10 +206,10 @@ kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-2 ``` -输出结果显示 Pod 没有创建成功,因为容器声明的内存限制太大了: +输出结果显示 Pod 没有创建成功,因为它定义了一个容器的内存请求超过了允许的值。 ``` Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml": @@ -210,12 +219,12 @@ pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container i ## 尝试创建一个不满足最小内存请求的 Pod -这里给出了包含一个容器的 Pod 的配置文件。容器声明了100 MiB 的内存请求和800 MiB 的内存限制。 +以下为只有一个容器的 Pod 的清单。这个容器声明了 100 MiB 的内存请求和 800 MiB 的内存限制。 {{< codenew file="admin/resource/memory-constraints-pod-3.yaml" >}} @@ -229,10 +238,10 @@ kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-3 ``` -输出结果显示 Pod 没有创建成功,因为容器声明的内存请求太小了: +输出结果显示 Pod 没有创建成功,因为它定义了一个容器的内存请求小于强制要求的最小值: ``` Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml": @@ -242,12 +251,12 @@ pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container i ## 创建一个没有声明内存请求和限制的 Pod -这里给出了包含一个容器的 Pod 的配置文件。容器没有声明内存请求,也没有声明内存限制。 +以下为只有一个容器的 Pod 清单。该容器没有声明内存请求,也没有声明内存限制。 {{< codenew file="admin/resource/memory-constraints-pod-4.yaml" >}} @@ -265,15 +274,15 @@ View detailed information about the Pod: --> 查看 Pod 详情: -``` +```shell kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml ``` -输出结果显示 Pod 的内存请求为1 GiB,内存限制为1 GiB。容器怎样获得哪些数值呢? +输出结果显示 Pod 的唯一容器内存请求为 1 GiB,内存限制为 1 GiB。容器怎样获得那些数值呢? ``` resources: @@ -284,15 +293,33 @@ resources: ``` -因为你的容器没有声明自己的内存请求和限制,它从 LimitRange 那里获得了 -[默认的内存请求和限制](/zh/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)。 +因为你的 Pod 没有为容器声明任何内存请求和限制,集群会从 LimitRange +获取[默认的内存请求和限制](/zh/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/)。 + 应用于容器。 +这意味着 Pod 的定义会显示这些值。你可以通过 `kubectl describe` 查看: + +```shell +# 查看输出结果中的 "Requests:" 的值 +kubectl describe pod constraints-mem-demo-4 --namespace=constraints-mem-example +``` + + -此时,你的容器可能运行起来也可能没有运行起来。 -回想一下我们本次任务的先决条件是你的每个节点都至少有1 GiB 的内存。 -如果你的每个节点都只有1 GiB 的内存,那将没有一个节点拥有足够的可分配内存来满足1 GiB 的内存请求。 +此时,你的 Pod 可能已经运行起来也可能没有运行起来。 +回想一下我们本次任务的先决条件是你的每个节点都至少有 1 GiB 的内存。 +如果你的每个节点都只有 1 GiB 的内存,那将没有一个节点拥有足够的可分配内存来满足 1 GiB 的内存请求。 删除你的 Pod: -``` +```shell kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example ``` @@ -331,18 +358,18 @@ LimitRange 为命名空间设定的最小和最大内存限制只有在 Pod 创 As a cluster administrator, you might want to impose restrictions on the amount of memory that Pods can use. For example: -* Each Node in a cluster has 2 GB of memory. You do not want to accept any Pod that requests - more than 2 GB of memory, because no Node in the cluster can support the request. +* Each Node in a cluster has 2 GiB of memory. You do not want to accept any Pod that requests +more than 2 GiB of memory, because no Node in the cluster can support the request. * A cluster is shared by your production and development departments. - You want to allow production workloads to consume up to 8 GB of memory, but - you want development workloads to be limited to 512 MB. You create separate namespaces +You want to allow production workloads to consume up to 8 GiB of memory, but +you want development workloads to be limited to 512 MiB. You create separate namespaces for production and development, and you apply memory constraints to each namespace. --> 作为集群管理员,你可能想规定 Pod 可以使用的内存总量限制。例如: -* 集群的每个节点有 2 GB 内存。你不想接受任何请求超过 2 GB 的 Pod,因为集群中没有节点可以满足。 -* 集群由生产部门和开发部门共享。你希望允许产品部门的负载最多耗用 8 GB 内存, +* 集群的每个节点有 2 GiB 内存。你不想接受任何请求超过 2 GiB 的 Pod,因为集群中没有节点可以满足。 +* 集群由生产部门和开发部门共享。你希望允许产品部门的负载最多耗用 8 GiB 内存, 但是开发部门的负载最多可使用 512 MiB。 这时,你可以为产品部门和开发部门分别创建名字空间,并为各个名字空间设置内存约束。