为命名空间配置最小和最大 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 中的每个容器都指定了大于或等于 200 毫核的 CPU 请求。
验证该 Pod 中的每个容器都指定了小于或等于 800 毫核的 CPU 限制。
说明
创建LimitRange
对象时,你也可以指定对巨页(huge-pages)或 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 的唯一容器具有 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 约束
只有在创建或更新 Pod 时,才会强制执行 LimitRange 对命名空间施加的最大和最小 CPU 约束。如果更改 LimitRange,它不会影响先前创建的 Pod。
最小和最大 CPU 约束的动机
作为集群管理员,你可能希望对 Pod 可以使用的 CPU 资源施加限制。例如:
集群中的每个节点都有 2 个 CPU。你不想接受任何请求超过 2 个 CPU 的 Pod,因为集群中没有节点可以支持该请求。
一个集群由你的生产部门和开发部门共享。你希望允许生产工作负载消耗高达 3 个 CPU,但你希望将开发工作负载限制为 1 个 CPU。你为生产和开发创建单独的命名空间,并将 CPU 约束应用于每个命名空间。
清理
删除你的命名空间
kubectl delete namespace constraints-cpu-example