为命名空间配置默认 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 的唯一容器具有 500m cpu
的 CPU 请求(你可以将其解读为“500 毫核”),以及 1 cpu
的 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