From 0c43fa9c6aaa061f43ce0b6acac2a1f7adbc6076 Mon Sep 17 00:00:00 2001 From: yuxiaobo96 <41496192+yuxiaobo96@users.noreply.github.com> Date: Sat, 12 Oct 2019 09:24:40 +0800 Subject: [PATCH] zh-translation:assign-cpu-resource.md (#16735) * zh-translation:assign-cpu-resource.md * Update assign-cpu-resource.md * Update assign-cpu-resource.md --- .../assign-cpu-resource.md | 495 ++++++++++++++++++ 1 file changed, 495 insertions(+) create mode 100644 content/zh/docs/tasks/configure-pod-container/assign-cpu-resource.md diff --git a/content/zh/docs/tasks/configure-pod-container/assign-cpu-resource.md b/content/zh/docs/tasks/configure-pod-container/assign-cpu-resource.md new file mode 100644 index 0000000000..a495d6af1d --- /dev/null +++ b/content/zh/docs/tasks/configure-pod-container/assign-cpu-resource.md @@ -0,0 +1,495 @@ +--- +title: 将 CPU 资源分配给容器和 Pods +content_template: templates/task +weight: 20 +--- + + +{{% capture overview %}} + + +此页面讲述如何将 CPU *请求* 和CPU *限制* 分配给一个容器。保证容器具有所需的 CPU 数量, +但不允许使用超过其限制的 CPU。 + +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + + +在你集群中的每一个节点必须至少有一个 CPU。 + +下面是需要您在你的集群上运行[metrics-server](https://github.com/kubernetes-incubator/metrics-server) 服务的一些步骤。 +如果您有 metrics-server 在运行,您可以跳过这些步骤。 + + +如果你正在运行 minikube,执行以下命令去启动 metrics-server: + +```shell +minikube addons enable metrics-server +``` + +查看 metrics-server (或者资源度量 API `metrics.k8s.io` 的不同提供者)是否正在运行,输入以下命令: + +```shell +kubectl get apiservices +``` + +如果资源度量 API 可用,则输出将包含一个对 `metrics.k8s.io` 的引用。 + +```shell +NAME +v1beta1.metrics.k8s.io +``` + +{{% /capture %}} + +{{% capture steps %}} + + +## 创建一个命名空间 + + +创建一个命名空间,以便在您在本练习中创建的资源与集群的其余部分隔离。 + +```shell +kubectl create namespace cpu-example +``` + + +## 指定 CPU 请求和 CPU 限制 + + +如果要为容器指定 CPU 请求,可以在容器资源清单中包含 `resources:requests` 字段。 +如果要指定 CPU 限制,可以包含 `resources:limits` 字段。 + +在本次练习中,您将创建一个具有一个容器的 Pod。该容器的请求为 0.5 CPU,限制为 1 CPU。 这是此 Pod 的配置文件: + +{{< codenew file="pods/resource/cpu-request-limit.yaml" >}} + + +配置文件中的 `args` 部分提供了容器启动时的参数。这个 `-cpus "2"` 参数说明容器尝试使用 2 个 CPU。 + +创建 Pod: + +```shell +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example +``` + +确认容器正在运行: + +```shell +kubectl get pod cpu-demo --namespace=cpu-example +``` + +查看有关 Pod 的详细信息: + +```shell +kubectl get pod cpu-demo --output=yaml --namespace=cpu-example +``` + + +输出显示 Pod 中的一个容器的 CPU 请求为 500 milliCPU 且其 CPU 限制为 1 个 CPU。 + +```yaml +resources: + limits: + cpu: "1" + requests: + cpu: 500m +``` + +使用 `kubectl top` 来获取 Pod 的度量值: + +```shell +kubectl top pod cpu-demo --namespace=cpu-example +``` + +输出显示这个 Pod 使用的是 974 milliCPU,仅比 Pod 配置文件中指定的 1 个 CPU 限制少一点。 + +``` +NAME CPU(cores) MEMORY(bytes) +cpu-demo 974m +``` + +回想一下,通过设置 `-cpu“ 2”`,您配置容器尝试使用 2 个 CPU,但是这个容器只被允许使用大约 1 个 CPU。 +因为容器正在尝试使用超出其限制的 CPU 资源,所以容器的 CPU 使用被限制。 + + + +{{< note >}} +**注意**:CPU 节流的另一个可能解释是节点可能没有足够的 CPU 资源可用。 +回想一下,此练习的先决条件需要您的节点至少具有 1 个 CPU。如果您的容器在只有 1 个 CPU 的节点上运行, +则无论为容器指定的 CPU 限制如何,这个容器都不能使用超过 1 个 CPU 的资源。 +{{< /note >}} + + + +## CPU 单位 + + +CPU 资源以 *CPU* 单元为度量单位。在 Kubernetes 中,一个 CPU 等效于: + +* 1 AWS vCPU +* 1 GCP Core +* 1 Azure vCore +* 一台配备英特尔处理器的具有超线程功能的裸机上的一个超线程 + +允许使用小数值。保证 CPU 为 0.5 的容器的 CPU 数量是请求一个 CPU 的容器的一半。您可以使用后缀 m 表示毫。例如 +100m CPU、100 milliCPU 和 0.1 CPU 都是相同的。精度不能超过 1m。 + +Kubernetes 只允许使用绝对数值来请求 CPU,而不是相对数量;在单核、双核或 48 核的计算机上,0.1 代表着相同的 CPU 数量。 + + + +## 指定超过节点能力的CPU请求 + + + +CPU 请求和限制是与容器相关联的,不过假定 Pod 也具有 CPU 请求和限制也是有用的想法。 +一个 Pod 的 CPU 请求是这个 Pod 中的所有容器的 CPU 请求之和。 +同样,一个 Pod 的 CPU 限制是这个 Pod 中所有容器的 CPU 限制数量之和。 + +Kubernetes 基于资源请求值来调度 Pod。仅当某节点具有足够的 CPU 资源可满足某 Pod 的 CPU 请求时,该 Pod 才可能被调度运行到该节点上。 + +在本练习中,您将创建一个 Pod,该 Pod 的 CPU 请求是如此的大以至于超过集群中任何节点的容量。 +这是仅有一个容器的 Pod 的配置文件。这个容器请求 100 个 CPU,这可能会超出集群中任何节点的容量。 + +{{< codenew file="pods/resource/cpu-request-limit-2.yaml" >}} + + +创建 Pod: + +```shell +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example +``` + +查看 Pod 的状态: + +```shell +kubectl get pod cpu-demo-2 --namespace=cpu-example +``` + + +输出显示 Pod 状态为 Pending。也就是说,这个 Pod 还没有被调度到任何节点上运行,并且它将无限期地处于 Pending 状态: + +```shell +kubectl get pod cpu-demo-2 --namespace=cpu-example +NAME READY STATUS RESTARTS AGE +cpu-demo-2 0/1 Pending 0 7m +``` + +查看有关 Pod 的详细信息,包括事件: + +```shell +kubectl describe pod cpu-demo-2 --namespace=cpu-example +``` + +输出显示容器不能被调度,原因是节点上没有足够的 CPU 资源: + +```shell +Events: + Reason Message + ------ ------- + FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3). +``` + + +删除你的 Pod: + +```shell +kubectl delete pod cpu-demo-2 --namespace=cpu-example +``` + + + +## 如果您不指定 CPU 的限制数量 + + +如果您没有为容器指定 CPU 限制,则会发生以下情况之一: + +* 容器在可以使用的 CPU 资源上没有上限。容器可以使用运行节点上的所有可用的 CPU 资源。 + +* 容器在具有默认 CPU 限制的命名空间中运行,并且系统会自动为容器分配默认限制。集群管理员可以使用 +[限制范围](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core/) +指定 CPU 限制的默认值。 + + + +## CPU请求和限制的动机 + + +通过配置在集群中运行容器的 CPU 请求和限制,您可以有效地利用在集群节点上的可用 CPU 资源。 +通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更好的被调度。通过设置 CPU 限制大于 CPU 请求,您可以实现达到以下两个目的: + +* 在 Pod 上突发大量活动期间,它可以利用节点上碰巧可用的 CPU 资源。 +* Pod 在突发负载期间可使用的 CPU 资源数量仍被限制为合理的数值。 + + +## 清理 + + +删除命名空间: + +```shell +kubectl delete namespace cpu-example +``` + +{{% /capture %}} + +{{% capture whatsnext %}} + + +### 对于应用程序开发人员 + + + +* [将内存资源分配给容器和 Pod]](/docs/tasks/configure-pod-container/assign-memory-resource/) + +* [配置 Pod 的服务质量](/docs/tasks/configure-pod-container/quality-service-pod/) + + +### 对于集群管理者 + + + +* [配置命名空间的默认内存请求和限制](/docs/tasks/administer-cluster/memory-default-namespace/) + +* [配置命名空间的默认 CPU 请求和限制](/docs/tasks/administer-cluster/cpu-default-namespace/) + +* [为命名空间配置最小和最大内存限制](/docs/tasks/administer-cluster/memory-constraint-namespace/) + +* [为命名空间配置最小和最大 CPU 约束](/docs/tasks/administer-cluster/cpu-constraint-namespace/) + +* [为命名空间配置内存和 CPU 配额](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) + +* [为命名空间配置 Pod 配额](/docs/tasks/administer-cluster/quota-pod-namespace/) + +* [配置 API 对象的配额](/docs/tasks/administer-cluster/quota-api-object/) + +{{% /capture %}}