任务

任务
管理集群
管理集群
Debug DNS 方案
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
Set up High-Availability Kubernetes Masters (EN)
Storage Object in Use Protection
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 Calico 来提供 NetworkPolicy
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
使用 Romana 来提供 NetworkPolicy
使用 Weave 网络来提供 NetworkPolicy
关键插件 Pod 的调度保证
命名空间演练
在 Kubernetes 中配置私有 DNS 和上游域名服务器
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
应用资源配额和限额
开发云控制器管理器
控制节点上的 CPU 管理策略
改变默认 StorageClass
更改 PersistentVolume 的回收策略
设置 Pod CPU 和内存限制
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置命名空间下pod总数
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态 Pods
静态加密 Secret 数据
安装网络策略驱动
用插件扩展 kubectl
管理巨页(HugePages)
自动伸缩集群中的 DNS 服务
调度 GPUs

Edit This Page

将 CPU 资源分配给容器和 Pods

此页面讲述如何将 CPU 请求 和CPU 限制 分配给一个容器。保证容器具有所需的 CPU 数量, 但不允许使用超过其限制的 CPU。

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

为了检查版本, 输入 kubectl version.

在你集群中的每一个节点必须至少有一个 CPU。

下面是需要您在你的集群上运行metrics-server 服务的一些步骤。 如果您有 metrics-server 在运行,您可以跳过这些步骤。

如果你正在运行 minikube,执行以下命令去启动 metrics-server:

minikube addons enable metrics-server

查看 metrics-server (或者资源度量 API metrics.k8s.io 的不同提供者)是否正在运行,输入以下命令:

kubectl get apiservices

如果资源度量 API 可用,则输出将包含一个对 metrics.k8s.io 的引用。

NAME
v1beta1.metrics.k8s.io

创建一个命名空间

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

kubectl create namespace cpu-example

指定 CPU 请求和 CPU 限制

如果要为容器指定 CPU 请求,可以在容器资源清单中包含 resources:requests 字段。 如果要指定 CPU 限制,可以包含 resources:limits 字段。

在本次练习中,您将创建一个具有一个容器的 Pod。该容器的请求为 0.5 CPU,限制为 1 CPU。 这是此 Pod 的配置文件:

pods/resource/cpu-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
    - "2"

配置文件中的 args 部分提供了容器启动时的参数。这个 -cpus "2" 参数说明容器尝试使用 2 个 CPU。

创建 Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example

确认容器正在运行:

kubectl get pod cpu-demo --namespace=cpu-example

查看有关 Pod 的详细信息:

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

输出显示 Pod 中的一个容器的 CPU 请求为 500 milliCPU 且其 CPU 限制为 1 个 CPU。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 500m

使用 kubectl top 来获取 Pod 的度量值:

kubectl top pod cpu-demo --namespace=cpu-example

输出显示这个 Pod 使用的是 974 milliCPU,仅比 Pod 配置文件中指定的 1 个 CPU 限制少一点。

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

回想一下,通过设置 -cpu“ 2”,您配置容器尝试使用 2 个 CPU,但是这个容器只被允许使用大约 1 个 CPU。 因为容器正在尝试使用超出其限制的 CPU 资源,所以容器的 CPU 使用被限制。

Note: 注意:CPU 节流的另一个可能解释是节点可能没有足够的 CPU 资源可用。 回想一下,此练习的先决条件需要您的节点至少具有 1 个 CPU。如果您的容器在只有 1 个 CPU 的节点上运行, 则无论为容器指定的 CPU 限制如何,这个容器都不能使用超过 1 个 CPU 的资源。

CPU 单位

CPU 资源以 CPU 单元为度量单位。在 Kubernetes 中,一个 CPU 等效于:

允许使用小数值。保证 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,这可能会超出集群中任何节点的容量。

pods/resource/cpu-request-limit-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo-2
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

创建 Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example

查看 Pod 的状态:

kubectl get pod cpu-demo-2 --namespace=cpu-example

输出显示 Pod 状态为 Pending。也就是说,这个 Pod 还没有被调度到任何节点上运行,并且它将无限期地处于 Pending 状态:

kubectl get pod cpu-demo-2 --namespace=cpu-example
NAME         READY     STATUS    RESTARTS   AGE
cpu-demo-2   0/1       Pending   0          7m

查看有关 Pod 的详细信息,包括事件:

kubectl describe pod cpu-demo-2 --namespace=cpu-example

输出显示容器不能被调度,原因是节点上没有足够的 CPU 资源:

Events:
  Reason			Message
  ------			-------
  FailedScheduling	No nodes are available that match all of the following predicates:: Insufficient cpu (3).

删除你的 Pod:

kubectl delete pod cpu-demo-2 --namespace=cpu-example

如果您不指定 CPU 的限制数量

如果您没有为容器指定 CPU 限制,则会发生以下情况之一:

CPU请求和限制的动机

通过配置在集群中运行容器的 CPU 请求和限制,您可以有效地利用在集群节点上的可用 CPU 资源。 通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更好的被调度。通过设置 CPU 限制大于 CPU 请求,您可以实现达到以下两个目的:

清理

删除命名空间:

kubectl delete namespace cpu-example

接下来

对于应用程序开发人员

对于集群管理者

反馈