为命名空间配置最小和最大 CPU 约束

为命名空间定义一系列有效的 CPU 资源限制,以便该命名空间中的每个新 Pod 都在您配置的范围内。

此页面介绍了如何在 命名空间 中设置容器和 Pod 使用的 CPU 资源的最小值和最大值。您在 LimitRange 对象中指定最小值和最大值。如果 Pod 不满足 LimitRange 强加的约束,则它无法在命名空间中创建。

开始之前

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

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

集群中的每个节点至少需要有 1.0 个 CPU 可用于 Pod。请参阅 CPU 的含义 了解 Kubernetes 如何定义“1 个 CPU”。

创建命名空间

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

kubectl create namespace constraints-cpu-example

创建 LimitRange 和 Pod

这是一个示例 LimitRange 的清单。

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container

创建 LimitRange

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

查看有关 LimitRange 的详细信息

kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example

输出显示了预期的最小值和最大值 CPU 约束。但请注意,即使您在 LimitRange 的配置文件中没有指定默认值,它们也会自动创建。

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container

现在,无论何时您在 constraints-cpu-example 命名空间中创建 Pod(或 Kubernetes API 的其他客户端创建等效的 Pod),Kubernetes 都将执行以下步骤

  • 如果该 Pod 中的任何容器未指定自己的 CPU 请求和限制,则控制平面将为该容器分配默认的 CPU 请求和限制。

  • 验证该 Pod 中的每个容器是否都指定了大于或等于 200 毫芯的 CPU 请求。

  • 验证该 Pod 中的每个容器是否都指定了小于或等于 800 毫芯的 CPU 限制。

这是一个具有一个容器的 Pod 的清单。容器清单指定了 500 毫芯的 CPU 请求和 800 毫芯的 CPU 限制。这些满足了 LimitRange 对该命名空间强加的最小值和最大值 CPU 约束。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo
spec:
  containers:
  - name: constraints-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "500m"

创建 Pod

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

验证 Pod 是否正在运行,以及其容器是否健康

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

查看有关 Pod 的详细信息

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

输出显示 Pod 的唯一容器具有 500 毫芯的 CPU 请求和 800 毫芯的 CPU 限制。这些满足了 LimitRange 强加的约束。

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 500m

删除 Pod

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

尝试创建超出最大 CPU 约束的 Pod

这是一个具有一个容器的 Pod 的清单。容器指定了 500 毫芯的 CPU 请求和 1.5 个 CPU 的 CPU 限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-2
spec:
  containers:
  - name: constraints-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1.5"
      requests:
        cpu: "500m"

尝试创建 Pod

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

输出显示 Pod 未创建,因为它定义了一个不可接受的容器。该容器不可接受,因为它指定的 CPU 限制过大

Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml":
pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m.

尝试创建不满足最小 CPU 请求的 Pod

这是一个具有一个容器的 Pod 的清单。容器指定了 100 毫芯的 CPU 请求和 800 毫芯的 CPU 限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-3
spec:
  containers:
  - name: constraints-cpu-demo-3-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "100m"

尝试创建 Pod

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

输出显示 Pod 未创建,因为它定义了一个不可接受的容器。该容器不可接受,因为它指定的 CPU 请求低于强制执行的最小值

Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml":
pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m.

创建未指定任何 CPU 请求或限制的 Pod

这是一个具有一个容器的 Pod 的清单。容器未指定 CPU 请求,也未指定 CPU 限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-4
spec:
  containers:
  - name: constraints-cpu-demo-4-ctr
    image: vish/stress

创建 Pod

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

查看有关 Pod 的详细信息

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

输出显示 Pod 的唯一容器具有 800 毫芯的 CPU 请求和 800 毫芯的 CPU 限制。该容器如何获得这些值?

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 800m

由于该容器未指定自己的 CPU 请求和限制,因此控制平面应用了该命名空间的 LimitRange 中的 默认 CPU 请求和限制

此时,您的 Pod 可能正在运行,也可能没有运行。请记住,本任务的先决条件是您的节点必须至少有 1 个 CPU 可供使用。如果每个节点都只有 1 个 CPU,则任何节点上可能都没有足够的可用 CPU 来满足 800 毫芯的请求。如果您碰巧使用的是具有 2 个 CPU 的节点,则您可能拥有足够的 CPU 来满足 800 毫芯的请求。

删除您的 Pod

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

强制执行最小值和最大值 CPU 约束

LimitRange 对命名空间强加的最大值和最小值 CPU 约束仅在创建或更新 Pod 时才强制执行。如果您更改 LimitRange,它不会影响之前创建的 Pod。

最小值和最大值 CPU 约束的动机

作为集群管理员,您可能希望对 Pod 可以使用的 CPU 资源施加限制。例如

  • 集群中的每个节点都有 2 个 CPU。您不想接受任何请求超过 2 个 CPU 的 Pod,因为集群中的任何节点都无法支持该请求。

  • 生产部门和开发部门共享一个集群。您希望允许生产工作负载消耗高达 3 个 CPU,但希望开发工作负载限制为 1 个 CPU。您可以为生产和开发创建单独的命名空间,并对每个命名空间应用 CPU 约束。

清理

删除您的命名空间

kubectl delete namespace constraints-cpu-example

下一步

针对集群管理员

针对应用开发人员

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample shortcode 代替 code shortcode (e8b136c3b3)