Kubernetes 实操:创建 LimitRange 和 Pod 并管理内存资源

Kubernetes 实操:创建 LimitRange 和 Pod 并管理内存资源

一、前言

在 Kubernetes 集群中,LimitRange 用于为命名空间内的容器设置默认资源请求(requests)和资源限额(limits),避免容器无限制占用资源。本文将通过实操演示如何创建 LimitRange、Pod,并验证不同资源配置场景下的默认值生效规则。

二、前提条件

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

  2. 已创建命名空间 default-mem-example(若未创建,可执行 kubectl create namespace default-mem-example)。

三、创建 LimitRange:设置默认内存资源规则

1. LimitRange 配置文件(memory-defaults.yaml)
复制代码
apiVersion: v1

kind: LimitRange

metadata:

name: mem-limit-range  # LimitRange 名称

spec:

limits:

- default:

    memory: 512Mi  # 容器默认内存限额(未指定时生效)

  defaultRequest:

    memory: 256Mi  # 容器默认内存请求(未指定时生效)

  type: Container  # 规则作用对象:容器
2. 执行创建命令
复制代码
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults.yaml --namespace=default-mem-example
  • 作用:在 default-mem-example 命名空间中创建 LimitRange,为所有未指定内存请求 / 限额的容器应用默认值(256Mi 请求,512Mi 限额)。

四、场景 1:创建无内存配置的 Pod

1. Pod 配置文件(memory-defaults-pod.yaml)

容器未指定任何内存请求或限额:

复制代码
apiVersion: v1

kind: Pod

metadata:

name: default-mem-demo  # Pod 名称

spec:

containers:

\- name: default-mem-demo-ctr  # 容器名称

  image: nginx  # 基础镜像(Nginx)
2. 执行创建命令
复制代码
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod.yaml --namespace=default-mem-example
3. 验证默认值生效

查看 Pod 详细配置,验证 LimitRange 的默认值是否被应用:

复制代码
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)

容器自动继承 LimitRange 的默认配置:

复制代码
containers:

\- image: nginx

imagePullPolicy: Always

name: default-mem-demo-ctr

resources:

  limits:

    memory: 512Mi  # 继承默认限额

  requests:

    memory: 256Mi  # 继承默认请求
5. 清理资源
复制代码
kubectl delete pod default-mem-demo --namespace=default-mem-example

五、场景 2:创建仅指定内存限额的 Pod

1. Pod 配置文件(memory-defaults-pod-2.yaml)

容器仅指定内存限额,未指定请求:

复制代码
apiVersion: v1

kind: Pod

metadata:

name: default-mem-demo-2  # Pod 名称

spec:

containers:

- name: defalt-mem-demo-2-ctr  # 容器名称

  image: nginx

  resources:

    limits:

      memory: "1Gi"  # 手动指定内存限额(1Gi)
2. 执行创建命令
复制代码
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod-2.yaml --namespace=default-mem-example
3. 验证资源配置
复制代码
kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)

内存请求会自动与限额相等,不继承 LimitRange 的默认请求值:

复制代码
resources:

limits:

  memory: 1Gi  # 手动指定的限额

requests:

  memory: 1Gi  # 自动匹配限额值(而非 256Mi)
5. 清理资源
复制代码
kubectl delete pod default-mem-demo-2 --namespace=default-mem-example

六、场景 3:创建仅指定内存请求的 Pod

1. Pod 配置文件(memory-defaults-pod-3.yaml)

容器仅指定内存请求,未指定限额:

复制代码
apiVersion: v1

kind: Pod

metadata:

name: default-mem-demo-3  # Pod 名称

spec:

containers:

\- name: default-mem-demo-3-ctr  # 容器名称

  image: nginx

  resources:

    requests:

      memory: "128Mi"  # 手动指定内存请求(128Mi)
2. 执行创建命令
复制代码
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod-3.yaml --namespace=default-mem-example
3. 验证资源配置
复制代码
kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)

内存限额会继承 LimitRange 的默认值(512Mi),请求值为手动指定:

复制代码
resources:

limits:

  memory: 512Mi  # 继承 LimitRange 的默认限额

requests:

  memory: 128Mi  # 手动指定的请求
5. 清理资源
复制代码
kubectl delete pod default-mem-demo-3 --namespace=default-mem-example

七、核心规则总结

容器资源配置场景 内存请求(requests) 内存限额(limits)
未指定请求和限额 继承 LimitRange 的 defaultRequest(256Mi) 继承 LimitRange 的 default(512Mi)
仅指定限额,未指定请求 自动匹配限额值(如 1Gi) 手动指定值(如 1Gi)
仅指定请求,未指定限额 手动指定值(如 128Mi) 继承 LimitRange 的 default(512Mi)

八、设置默认资源的核心动机

当命名空间配置了 资源配额(ResourceQuota) 时,默认资源规则尤为重要:

  1. 资源配额可能要求所有容器必须指定内存限额,否则无法运行;

  2. 资源配额会限制命名空间的总内存使用量,默认限额可避免单个容器过度占用资源。

    通过 LimitRange 设置默认值,既能满足配额要求,又能简化容器配置(无需逐个指定资源参数)。

相关推荐
code_slave(码畜)4 小时前
微服务架构落地:消息队列架构设计(下篇)——消息堆积、死信治理与集群监控告警实战
spring boot·spring cloud·微服务·云原生·中间件·架构
灯澜忆梦4 小时前
【docker】#2 | 基础命令
docker·容器·eureka
sbjdhjd7 小时前
云安全 | 从特权容器到旧版 runC:Docker 宿主机访问与运行时缺陷复盘
运维·网络安全·docker·云原生·kubernetes·云计算·云安全
Pocker_Spades_A9 小时前
Penpot自托管设计协作:Docker部署、MCP接入与Codex生成UI实操记录
ui·docker·容器
蜡笔婧萱18 小时前
Docker介绍及其基础简介(一)
云原生·eureka
谢亮_vipxieliang21 小时前
Kubernetes 的“操作系统化”:从容器编排到 AI 基础设施控制平面
人工智能·平面·kubernetes
sbjdhjd1 天前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
热爱Liunx的丘丘人1 天前
1、什么是K8s
云原生·容器·kubernetes