Kubernetes 实操:创建 CPU 约束的 LimitRange 与 Pod

Kubernetes 实操:创建 CPU 约束的 LimitRange 与 Pod

一、核心目标

在独立命名空间 constraints-cpu-example 中创建 LimitRange,为容器设置 CPU 资源的最小限制 (200m)和最大限制(800m),确保容器 CPU 使用在合理范围,避免单个容器过度占用 CPU 资源或请求过小导致资源碎片化。

二、前提条件

  1. 已安装并配置 kubectl 命令行工具,能连接到 Kubernetes 集群。

  2. 集群节点需满足:至少有一个节点的可用 CPU ≥ 200m(用于运行符合约束的 Pod)。

  3. 已创建命名空间 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: 800m

    requests:

    复制代码
    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: 800m

    requests:

    复制代码
    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
相关推荐
Zhu7587 小时前
在k8s环境部署Apache Kafka 集群架构,combined模式,无SSL配置
kafka·kubernetes·apache
天狼啸月19907 小时前
RagSEDE复现: Docker and Ragflow 关系
docker·容器·ragflow·ragsede
C137的本贾尼7 小时前
第十篇:Docker & K8s——标准化应用的“集装箱“和“码头调度中心“
docker·容器·kubernetes
增量星球8 小时前
《持续交付2.0系列一》从技术交付到业务引领
java·docker·容器·devops
Zhu7588 小时前
在k8s环境部署Apache kafka4.3.1
容器·kubernetes·apache
Demon_Hao9 小时前
Spring Boot 4、JDK 25 与 GraalVM:Java 云原生进化,能否撼动 Go 的地位?
java·spring boot·云原生
江畔柳前堤17 小时前
GO01-Go 语言与主流编程语言深度对比
开发语言·人工智能·后端·微服务·云原生·golang·go
探索云原生1 天前
终于搞懂 Kueue:5 个核心对象一次讲透
linux·docker·ai·云原生·kubernetes
众人皆醒我独醉1 天前
etcd,其实不是你以为的"数据库"——Kubernetes 大脑的六个反直觉真相
面试·kubernetes
月落星还在1 天前
Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
spring boot·spring·云原生·mvc