任务

任务
管理集群
Debug DNS 方案
Enabling Service Topology (EN)
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
关键插件 Pod 的调度保证
启用端点切片
命名空间演练
在 Kubernetes 集群中使用 NodeLocal DNSCache
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
开发云控制器管理器
控制节点上的 CPU 管理策略
控制节点上的拓扑管理策略
搭建高可用的 Kubernetes Masters
改变默认 StorageClass
更改 PersistentVolume 的回收策略
自定义 DNS 服务
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态加密 Secret 数据
用插件扩展 kubectl
管理巨页(HugePages)
调度 GPUs

Edit This Page

Assign CPU Resources to Containers and Pods

此页面显示如何将 CPU request 和 CPU limit 分配给一个容器。容器使用的 CPU 不能超过配额限制。 如果系统有空闲的 CPU 时间,则可以保证根据请求给容器分配尽可能多的 CPU 资源。

准备开始

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

要获知版本信息,请输入 kubectl version.

集群中的每个节点必须至少具有 1 个 CPU。

此页面上的一些步骤要求您在集群中运行metrics-server 服务。如果您的集群中已经有正在运行的 metrics-server 服务,那么您可以跳过这些步骤。

如果您正在运行MinikubeMinikube 是用来在本地运行 Kubernetes 的一种工具。 ,请运行以下命令启用 metrics-server:

minikube addons enable metrics-server

查看是 metrics-server(或者其他资源度量 API 服务提供者,metrics.k8s.io )是否正在运行,请键入以下命令:

kubectl get  API services

如果资源指标 API 可用,则会输出将包含一个参考信息 metrics.k8s.io

NAME
v1beta1.metrics.k8s.io

创建一个命名空间

创建一个命名空间 命名空间命名空间是 Kubernetes 为了在同一物理集群上支持多个虚拟集群而使用的一种抽象。 ,以便在本练习中创建的资源与集群的其余部分资源隔离。

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

验证上述创建的 Pod 处于 Running 状态

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

查看显示关于 Pod 的详细信息

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

输出显示 Pod 中的一个容器的 CPU 请求为 500 milli CPU,并且 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 资源。

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

CPU 单元

CPU 资源以 CPU 单位度量。Kubernetes中的一个 CPU 等同于:

  • 1 个 AWS vCPU
  • 1 个 GCP核心
  • 1 个 Azure vCore
  • 1 个具有超线程功能的裸机英特尔处理器上的超线程

允许使用小数值。要求 0.5 CPU 的容器保证一半 CPU 作为请求 1 个 CPU 的容器。 您可以使用后缀 m 表示毫。例如 100m CPU,100 milliCPU 和 0.1 CPU 都相同。 精度不能超过 1m。

始终要求 CPU 是绝对数量,而不是相对数量。0.1 在单核,双核或 48 核计算机上的 CPU 数量值是一样的。

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

对您的节点而言,设置一个 CPU 过大的请求

CPU 请求和限制与容器相关联,但是我们可以考虑一下 CPU 对应 Pod 的请求和限制这样的场景:Pod 对 CPU 使用量的请求等于 Pod 中所有容器的请求数量。 同样,CPU 对 Pod 请求资源的限制等于 Pod 中所有容器的请求的 CPU 资源限制数。

Pod 调度基于请求。仅在以下情况下,Pod 将会在节点上运行:节点具有足够的 CPU 资源可用于满足 Pod CPU 请求。

在本练习中,您将创建一个 Pod,该 Pod 的 CPU 请求对于集群中任何节点的容量而言都会过大。

这是 Pod 的配置文件,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 调度到任何节点上运行, 并且 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 限制的命名空间中运行,并且系统会自动为容器分配默认限制。集群管理员可以使用 LimitRange 指定 CPU 限制的默认值。

CPU 请求和限制的初衷

通过配置 CPU 请求和在您的容器中运行的容器的限制 集群,您可以有效利用集群上可用的 CPU 资源 节点。通过将 Pod CPU 请求保持在较低水平,可以使 Pod 成为 预定的。通过使 CPU 限制大于 CPU 请求,您可以完成两件事:

  • Pod 可能会有大量活动,它利用恰好可用的 CPU 资源。
  • Pod 在突发期间可以使用的 CPU 资源数量被限制为合理的数量。

清理

删除名称空间:

kubectl delete namespace cpu-example

title: 为容器和 Pods 分配 CPU 资源 content_template: templates/task

weight: 20

接下来

针对应用开发者

针对集群管理员

反馈