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 设置默认值,既能满足配额要求,又能简化容器配置(无需逐个指定资源参数)。

相关推荐
Linux-18743 小时前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
BullSmall7 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
heimeiyingwang8 小时前
【架构实战】可观测性三支柱:日志、指标、链路的融合
elasticsearch·架构·kubernetes
阿里云云原生10 小时前
阿里云 AgentTeams 7月第二周产品动态
云原生
CodexDave13 小时前
数据库连接池耗尽:排查顺序与三层兜底
服务器·前端·数据库·git·云原生·容器·kubernetes
java_logo14 小时前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL14 小时前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
辰同学ovo15 小时前
用“舞台换景”讲清 Docker 的 Restart 与 Recreate
运维·docker·容器
名字还没想好☜15 小时前
Kubernetes Ingress 实战:域名路由、TLS 证书与 502/404 排查
运维·云原生·容器·kubernetes·ingress
Zhu75816 小时前
在k8s部署alist 3.62.0
云原生·容器·kubernetes