为命名空间配置默认 CPU 请求和限制

为命名空间定义默认 CPU 资源限制,以便该命名空间中的每个新 Pod 都配置有 CPU 资源限制。

本页介绍如何为一个命名空间配置默认的 CPU 请求和限制。

一个 Kubernetes 集群可以划分为多个命名空间。如果你在一个已设置默认 CPU 限制的命名空间中创建 Pod,并且该 Pod 中的任何容器未指定自己的 CPU 限制,则控制平面会将默认的 CPU 限制分配给该容器。

Kubernetes 会分配一个默认的 CPU 请求,但仅在本文档稍后解释的特定条件下。

准备工作

你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在至少有两个非控制平面主机的节点上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下任一 Kubernetes 游乐场:

你必须有权在集群中创建命名空间。

如果你还不熟悉 Kubernetes 中 1.0 CPU 的含义,请阅读CPU 的含义

创建命名空间

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

kubectl create namespace default-cpu-example

创建 LimitRange 和 Pod

这是一个示例 LimitRange 的清单。该清单指定了一个默认的 CPU 请求和一个默认的 CPU 限制。

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

在 default-cpu-example 命名空间中创建 LimitRange

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example

现在,如果你在 default-cpu-example 命名空间中创建一个 Pod,并且该 Pod 中的任何容器未指定自己的 CPU 请求和 CPU 限制值,则控制平面将应用默认值:CPU 请求为 0.5,默认 CPU 限制为 1。

这是一个只有一个容器的 Pod 的清单。该容器未指定 CPU 请求和限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo
spec:
  containers:
  - name: default-cpu-demo-ctr
    image: nginx

创建 Pod。

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example

查看 Pod 的规约

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

输出显示 Pod 的唯一容器的 CPU 请求为 500m cpu(你可以理解为“500 millicpu”),CPU 限制为 1 cpu。这些是 LimitRange 指定的默认值。

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-cpu-demo-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

如果你指定了容器的限制,但未指定其请求,会怎样?

这是一个只有一个容器的 Pod 的清单。该容器指定了 CPU 限制,但未指定请求。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-2
spec:
  containers:
  - name: default-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1"

创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example

查看你创建的 Pod 的规约

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

输出显示容器的 CPU 请求被设置为与其 CPU 限制相同。注意,该容器未被分配默认的 CPU 请求值 0.5 cpu

resources:
  limits:
    cpu: "1"
  requests:
    cpu: "1"

如果你指定了容器的请求,但未指定其限制,会怎样?

这是一个只有一个容器的 Pod 的示例清单。该容器指定了 CPU 请求,但未指定限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-3
spec:
  containers:
  - name: default-cpu-demo-3-ctr
    image: nginx
    resources:
      requests:
        cpu: "0.75"

创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example

查看你创建的 Pod 的规约

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

输出显示容器的 CPU 请求被设置为你在创建 Pod 时指定的值(换句话说:与清单匹配)。然而,同一个容器的 CPU 限制被设置为 1 cpu,这是该命名空间的默认 CPU 限制。

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

默认 CPU 限制和请求的动机

如果你的命名空间配置了 CPU 资源配额,那么为 CPU 限制设置默认值会很有帮助。以下是 CPU 资源配额对命名空间施加的两项限制:

  • 在该命名空间中运行的每个 Pod,其每个容器都必须有 CPU 限制。
  • CPU 限制在调度 Pod 的节点上应用资源预留。命名空间中所有 Pod 的总 CPU 预留量不得超过指定的限制。

当你添加 LimitRange 时

如果该命名空间中包含容器的任何 Pod 未指定自己的 CPU 限制,则控制平面会将默认 CPU 限制应用于该容器,并且该 Pod 可以在受 CPU ResourceQuota 限制的命名空间中运行。

清理

删除你的命名空间

kubectl delete namespace default-cpu-example

下一步

面向集群管理员

面向应用开发者

最后修改于 2024 年 10 月 30 日下午 5:17 PST:KEP 2837: Pod Level Resources Alpha (0374213f57)