为命名空间配置默认 CPU 请求和限制
本页介绍如何为一个命名空间配置默认的 CPU 请求和限制。
一个 Kubernetes 集群可以划分为多个命名空间。如果你在一个已设置默认 CPU 限制的命名空间中创建 Pod,并且该 Pod 中的任何容器未指定自己的 CPU 限制,则控制平面会将默认的 CPU 限制分配给该容器。
Kubernetes 会分配一个默认的 CPU 请求,但仅在本文档稍后解释的特定条件下。
准备工作
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在至少有两个非控制平面主机的节点上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下任一 Kubernetes 游乐场:
你必须有权在集群中创建命名空间。
如果你还不熟悉 Kubernetes 中 1.0 CPU 的含义,请阅读CPU 的含义。
创建命名空间
创建一个命名空间,以便你在此练习中创建的资源与集群的其余部分隔离。
kubectl create namespace default-cpu-example
创建 LimitRange 和 Pod
这是一个示例 LimitRange 的清单。该清单指定了一个默认的 CPU 请求和一个默认的 CPU 限制。
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
在 default-cpu-example 命名空间中创建 LimitRange
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example
现在,如果你在 default-cpu-example 命名空间中创建一个 Pod,并且该 Pod 中的任何容器未指定自己的 CPU 请求和 CPU 限制值,则控制平面将应用默认值:CPU 请求为 0.5,默认 CPU 限制为 1。
这是一个只有一个容器的 Pod 的清单。该容器未指定 CPU 请求和限制。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo
spec:
containers:
- name: default-cpu-demo-ctr
image: nginx
创建 Pod。
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example
查看 Pod 的规约
kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example
输出显示 Pod 的唯一容器的 CPU 请求为 500m cpu
(你可以理解为“500 millicpu”),CPU 限制为 1 cpu
。这些是 LimitRange 指定的默认值。
containers:
- image: nginx
imagePullPolicy: Always
name: default-cpu-demo-ctr
resources:
limits:
cpu: "1"
requests:
cpu: 500m
如果你指定了容器的限制,但未指定其请求,会怎样?
这是一个只有一个容器的 Pod 的清单。该容器指定了 CPU 限制,但未指定请求。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo-2
spec:
containers:
- name: default-cpu-demo-2-ctr
image: nginx
resources:
limits:
cpu: "1"
创建 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example
查看你创建的 Pod 的规约
kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example
输出显示容器的 CPU 请求被设置为与其 CPU 限制相同。注意,该容器未被分配默认的 CPU 请求值 0.5 cpu
。
resources:
limits:
cpu: "1"
requests:
cpu: "1"
如果你指定了容器的请求,但未指定其限制,会怎样?
这是一个只有一个容器的 Pod 的示例清单。该容器指定了 CPU 请求,但未指定限制。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo-3
spec:
containers:
- name: default-cpu-demo-3-ctr
image: nginx
resources:
requests:
cpu: "0.75"
创建 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example
查看你创建的 Pod 的规约
kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example
输出显示容器的 CPU 请求被设置为你在创建 Pod 时指定的值(换句话说:与清单匹配)。然而,同一个容器的 CPU 限制被设置为 1 cpu
,这是该命名空间的默认 CPU 限制。
resources:
limits:
cpu: "1"
requests:
cpu: 750m
默认 CPU 限制和请求的动机
如果你的命名空间配置了 CPU 资源配额,那么为 CPU 限制设置默认值会很有帮助。以下是 CPU 资源配额对命名空间施加的两项限制:
- 在该命名空间中运行的每个 Pod,其每个容器都必须有 CPU 限制。
- CPU 限制在调度 Pod 的节点上应用资源预留。命名空间中所有 Pod 的总 CPU 预留量不得超过指定的限制。
当你添加 LimitRange 时
如果该命名空间中包含容器的任何 Pod 未指定自己的 CPU 限制,则控制平面会将默认 CPU 限制应用于该容器,并且该 Pod 可以在受 CPU ResourceQuota 限制的命名空间中运行。
清理
删除你的命名空间
kubectl delete namespace default-cpu-example