配置命名空间的最小和最大 CPU 约束
本页面展示如何为 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 限制。
注意
创建LimitRange
对象时,你还可以指定大页或 GPU 的限制。但是,当这些资源同时指定 default
和 defaultRequest
时,这两个值必须相同。以下是包含一个容器的 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