Kubernetes 实操:创建 CPU 约束的 LimitRange 与 Pod
一、核心目标
在独立命名空间 constraints-cpu-example 中创建 LimitRange,为容器设置 CPU 资源的最小限制 (200m)和最大限制(800m),确保容器 CPU 使用在合理范围,避免单个容器过度占用 CPU 资源或请求过小导致资源碎片化。
二、前提条件
-
已安装并配置
kubectl命令行工具,能连接到 Kubernetes 集群。 -
集群节点需满足:至少有一个节点的可用 CPU ≥ 200m(用于运行符合约束的 Pod)。
-
已创建命名空间
constraints-cpu-example(若未创建,执行kubectl create namespace constraints-cpu-example)。
三、步骤 1:创建 CPU 约束的 LimitRange
1. LimitRange 配置文件(cpu-constraints.yaml)
该配置指定容器 CPU 的最小、最大值,K8s 会自动生成默认请求 / 限额(与最大值一致):
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo-lr # LimitRange 名称
spec:
limits:
- max:
cpu: "800m" # 容器 CPU 最大限制(不可超,1CPU=1000m)
min:
cpu: "200m" # 容器 CPU 最小限制(不可低)
type: Container # 规则作用对象:容器
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-constraints.yaml --namespace=constraints-cpu-example
3. 验证 LimitRange 配置
kubectl get limitrange cpu-min-max-demo-lr --namespace=constraints-cpu-example --output=yaml
4. 预期输出(关键部分)
K8s 自动补充默认 CPU 请求 / 限额(默认值 = 最大值 800m):
limits:
\- default:
cpu: 800m # 自动生成的默认 CPU 限额
defaultRequest:
cpu: 800m # 自动生成的默认 CPU 请求
max:
cpu: 800m # 手动配置的最大 CPU 限制
min:
cpu: 200m # 手动配置的最小 CPU 限制
type: Container
四、场景 1:创建符合 CPU 约束的 Pod
1. Pod 配置文件(cpu-constraints-pod.yaml)
容器 CPU 请求 500m、限额 800m(均在 200m~800m 范围内):
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" # 大于最小限制
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-constraints-pod.yaml --namespace=constraints-cpu-example
3. 验证 Pod 状态
kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example
- 预期状态:
Running(符合 CPU 约束,创建成功)。
4. 查看详细配置
kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example
-
关键输出(资源配置符合预期):
resources:
limits:
cpu: 800mrequests:
cpu: 500m
5. 清理资源
kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example
五、场景 2:创建超出最大 CPU 限制的 Pod(验证失败)
1. Pod 配置文件(cpu-constraints-pod-2.yaml)
容器 CPU 限额 1.5 核(1500m),超出 LimitRange 最大值 800m:
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" # 超出最大限制 800m
requests:
cpu: "500m"
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example
3. 预期结果(创建失败)
Error from server (Forbidden): error when creating "xxx/cpu-constraints-pod-2.yaml":
pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m.
- 原因:容器 CPU 限额超出 LimitRange 定义的最大值,K8s 拒绝创建。
六、场景 3:创建低于最小 CPU 限制的 Pod(验证失败)
1. Pod 配置文件(cpu-constraints-pod-3.yaml)
容器 CPU 请求 100m,低于 LimitRange 最小值 200m:
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-3
spec:
containers:
- name: constraints-cpu-demo-4-ctr
image: nginx
resources:
limits:
cpu: "800m"
requests:
cpu: "100m" # 低于最小限制 200m
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example
3. 预期结果(创建失败)
Error from server (Forbidden): error when creating "xxx/cpu-constraints-pod-3.yaml":
pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m.
- 原因:容器 CPU 请求低于 LimitRange 定义的最小值,K8s 拒绝创建。
七、场景 4:创建无 CPU 配置的 Pod(继承默认值)
1. Pod 配置文件(cpu-constraints-pod-4.yaml)
容器未指定任何 CPU 请求 / 限额:
apiVersion: v1
kind: Pod
metadata:
name: constraints-cpu-demo-4
spec:
containers:
- name: constraints-cpu-demo-4-ctr
image: vish/stress # 压力测试镜像,用于验证 CPU 限制
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example
3. 验证默认值生效
kubectl get pod constraints-cpu-demo-4 --output=yaml --namespace=constraints-cpu-example
-
关键输出(继承 LimitRange 自动生成的默认值):
resources:
limits:
cpu: 800mrequests:
cpu: 800m
4. 注意事项
-
若节点可用 CPU ,Pod 状态会变为
Pending(资源不足),需更换 CPU 配置更高的节点。 -
镜像
vish/stress会自动消耗 CPU 资源,可通过kubectl top pod constraints-cpu-demo-4 --namespace=constraints-cpu-example查看 CPU 使用率(不会超过 800m)。
5. 清理资源
kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example
八、核心规则与注意事项
1. 约束生效时机
- LimitRange 的 CPU 最小 / 最大限制仅在 Pod 创建或更新时 校验,修改 LimitRange 不会影响已创建的 Pod。
2. CPU 单位说明
-
Kubernetes 中 CPU 支持毫核(m)和核(CPU)两种单位,1CPU = 1000m(如 800m = 0.8 核)。
-
最小 CPU 限制 200m 表示容器至少需要 0.2 核 CPU 才能运行,避免资源分配不足导致服务异常。
3. 适用场景
-
多服务共享节点:限制单个容器的 CPU 最大使用量,避免某服务占用过多 CPU 导致其他服务卡顿;
-
资源规划:通过最小 CPU 限制确保容器获得足够资源运行,避免因请求过小被调度到资源不足的节点。
九、清理命名空间(可选)
若无需保留练习资源,可删除整个命名空间(会删除该空间下所有资源):
kubectl delete namespace constraints-cpu-example