配置命名空间的默认 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 毫核”),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 限制匹配。请注意,该容器未被分配 0.5 cpu
的默认 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