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

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

此页面展示了如何为 命名空间 配置默认 CPU 请求和限制。

Kubernetes 集群可以划分为命名空间。如果您在一个具有默认 CPU 限制 的命名空间内创建 Pod,并且该 Pod 中的任何容器都没有指定自己的 CPU 限制,那么 控制平面 会将默认 CPU 限制分配给该容器。

Kubernetes 会分配一个默认 CPU 请求,但仅在本文档后面解释的某些特定情况下。

准备工作

您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes Playground 中的任何一个:

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

如果您还不熟悉 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 请求为 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 的唯一容器具有 500m cpu 的 CPU 请求(可以理解为“500 毫芯”),以及 1 cpu 的 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 限制相匹配。请注意,该容器未分配 0.5 cpu 的默认 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 资源配额限制的命名空间中运行。

清理

删除您的命名空间

kubectl delete namespace default-cpu-example

后续步骤

针对集群管理员

针对应用程序开发人员

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 短代码而不是 code 短代码 (e8b136c3b3)