为命名空间配置最小和最大 CPU 约束
本页面介绍如何为 命名空间 中的容器和 Pod 使用的 CPU 资源设置最小值和最大值。您可以在 LimitRange 对象中指定最小和最大 CPU 值。如果 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 中的每个容器指定的 CPU 请求是否大于或等于 200 毫核。
验证该 Pod 中的每个容器指定的 CPU 限制是否小于或等于 800 毫核。
注意
创建LimitRange
对象时,您也可以指定对巨页或 GPU 的限制。但是,如果同时为这些资源指定了 default
和 defaultRequest
,则这两个值必须相同。这是一个包含一个容器的 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 的唯一容器的 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 请求和限制,所以控制平面应用了此命名空间的 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 约束
仅当创建或更新 Pod 时,才会强制执行 LimitRange 对命名空间施加的最大和最小 CPU 约束。如果您更改 LimitRange,它不会影响以前创建的 Pod。
最小和最大 CPU 约束的动机
作为集群管理员,您可能希望对 Pod 可以使用的 CPU 资源施加限制。例如
集群中的每个节点都有 2 个 CPU。您不想接受任何请求超过 2 个 CPU 的 Pod,因为集群中的任何节点都无法支持该请求。
您的生产部门和开发部门共享一个集群。您希望允许生产工作负载最多消耗 3 个 CPU,但希望将开发工作负载限制为 1 个 CPU。您要为生产和开发创建单独的命名空间,并对每个命名空间应用 CPU 约束。
清理
删除您的命名空间
kubectl delete namespace constraints-cpu-example