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

定义 Namespace 的有效 CPU 资源限制范围,以便该 Namespace 中的每个新 Pod 都落在你配置的范围内。

本页面展示如何为 namespace 中的容器和 Pod 使用的 CPU 资源设置最小和最大值。你在 LimitRange 对象中指定最小和最大 CPU 值。如果 Pod 不满足 LimitRange 施加的约束,则无法在 Namespace 中创建该 Pod。

准备工作

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

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

集群中的每个节点必须至少有 1.0 个 CPU 可用于 Pod。有关 Kubernetes 中“1 CPU”的含义,请参见 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 Namespace 中创建 Pod(或 Kubernetes API 的其他客户端创建等效 Pod)时,Kubernetes 会执行以下步骤

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

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

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

以下是包含一个容器的 Pod 的清单。容器清单指定 500 毫核的 CPU 请求和 800 毫核的 CPU 限制。这些值满足此 Namespace 的 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 唯一的容器的 CPU 请求为 500 毫核,CPU 限制为 800 毫核。这些值满足 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 的单个容器的 CPU 请求为 800 毫核,CPU 限制为 800 毫核。该容器是如何获得这些值的?

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

因为该容器未指定其自己的 CPU 请求和限制,所以控制平面应用了此 Namespace 的 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 对 Namespace 施加的最大和最小 CPU 约束仅在创建或更新 Pod 时强制执行。如果你更改 LimitRange,它不会影响以前创建的 Pod。

最小和最大 CPU 约束的动机

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

  • 集群中的每个节点都有 2 个 CPU。你不希望接受任何请求超过 2 个 CPU 的 Pod,因为集群中没有节点可以支持该请求。

  • 集群由生产部门和开发部门共享。你希望允许生产工作负载消耗最多 3 个 CPU,但希望开发工作负载限制为 1 个 CPU。你为生产和开发创建单独的 Namespace,并对每个 Namespace 应用 CPU 约束。

清理

删除你的命名空间

kubectl delete namespace constraints-cpu-example

下一步

致集群管理员

致应用开发者

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