当前位置: 首页 > java >正文

k8s pod request/limit 值不带单位会发生什么?

在 Kubernetes 中,Pod 的 resources.requests 和 limits 字段必须显式指定单位

一、未正确设置requests和limits字段的单位会产生影响?

 1. 资源分配严重不足

例如,以下配置存在严重错误

resources:requests:memory: 512  # 错误!实际为 512 字节,而非 512 MiBlimits:memory: 1024  # 错误!实际为 1024 字节,而非 1024 MiB
  • 实际效果
    • 容器仅被分配512 字节的内存请求和1024 字节的内存限制。
    • 即使节点有足够内存(如 32GiB),容器也会因资源不足无法正常运行。
2. 容器立即被 OOMKilled
  • 容器启动后,因内存不足(如一个简单的 Python 进程可能需要数十 MiB 内存),会被内核 OOM Killer 强制终止。
  • 事件日志会显示类似错误:
    Normal   Created    <time>                kubelet            Created container my-container
    Normal   Started    <time>                kubelet            Started container my-container
    Warning  OOMKilled  <time>                kubelet            Container my-container was OOMKilled
    
3. 调度器误判
  • Kubernetes 调度器会根据错误的内存请求(如 512 字节)进行调度,可能将 Pod 调度到资源实际不足的节点上。
  • 例如,节点剩余内存为 1GiB,但调度器认为 512 字节的请求可以满足,导致调度成功但容器立即崩溃。

二、CPU 资源(不带单位)

1. 行为规则

默认单位:CPU 资源的默认单位是核心数(cores,如不带单位则表示使用多少核。因此必须显式写 m(毫核)

示例错误

resources:requests:cpu: 100  # 错误!未指定单位limits:cpu: 200  # 错误!未指定单位
2. 错误类型

API 拒绝:Kubernetes API Server 会直接拒绝该 Pod 定义,报错信息类似:

error: error validating "pod.yaml": error validating data: ValidationError(Pod.spec.containers[0].resources.requests.cpu): invalid type for io.k8s.api.core.v1.ResourceRequirements.requests: got "integer", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false

三、内存资源(不带单位)

1. 行为规则

默认单位:内存资源的默认单位是字节(bytes,但必须显式写 Mi(兆字节)或 Gi(吉字节)

示例错误

resources:requests:memory: 512  # 错误!默认单位是 bytes,实际为 512 字节limits:memory: 1024  # 错误!默认单位是 bytes,实际为 1024 字节
2. 错误类型

资源分配异常

  • 若未指定单位,Kubernetes 会将值解释为字节,导致资源分配严重不足。例如:memory: 512 实际表示 512 字节,而非 512 MiB,容器可能因内存不足立即被 OOMKilled。
  • 容器频繁崩溃(OOMKilled)。
  • 调度器决策错误。

四、正确写法示例

1. CPU 资源
resources:requests:cpu: "250m"  # 250 毫核(即 0.25 核)limits:cpu: "500m"  # 500 毫核(即 0.5 核)
2. 内存资源
resources:requests:memory: "512Mi"  # 512 兆字节limits:memory: "1Gi"    # 1G字节

五、单位规范

资源类型合法单位示例说明
CPU100m0.51m 表示毫核,1 表示 1 个 CPU 核心
内存512Ki1024Mi2GiKi= 千字节,Mi= 兆字节,Gi= 吉字节
存储100Mi1Gi10Ti与内存单位相同

六、验证方法

1. 使用 kubectl create --dry-run 预检查
kubectl create -f pod.yaml --dry-run=client
# 若有错误,会输出类似:
# error: error validating "pod.yaml": error validating data: ValidationError(Pod.spec.containers[0].resources.requests.cpu): ...
2. 查看 API Server 拒绝日志
kubectl describe pod <pod-name>
# Events 字段可能显示:
# Warning  FailedCreate  <timestamp>  replicaset-controller  Error creating: pods "pod-name" is forbidden: failed quota: compute-resources: must specify requests.cpu, requests.memory

七、最佳实践

  1. 始终显式指定单位:避免因默认单位导致的资源分配错误。
    1. 内存:使用Mi(兆字节)或Gi(吉字节)。
    2. CPU:使用m(毫核)。
  2. 使用标准单位:优先使用 m(CPU)、Mi/Gi(内存),提高可读性。
  3. 测试配置:在生产环境部署前,先在测试环境验证资源配置。

通过严格遵循单位规范,可以避免因资源配置错误导致的 Pod 启动失败或性能问题。

http://www.xdnf.cn/news/4176.html

相关文章:

  • 浅谈 - GPTQ为啥按列量化
  • NGINX `ngx_http_browser_module` 深度解析与实战
  • 螺杆支撑座:数控机床高效稳定运行的关键支撑
  • MYSQL的DDL语言和单表查询
  • 完全免费的PDF电子发票批量辅助打印工具
  • vue3+ts继续学习
  • js var a=如果ForRemove=true,是“normal“,否则为“bold“
  • 2025-05-06 事业-独立开发项目-记录
  • 软件代码签名证书SSL如何选择?
  • C++复习2
  • Spring Boot之MCP Client开发全介绍
  • 二叉树—中序遍历—非递归
  • 两数之和(暴力+哈希查找)
  • Linux[Makefile]
  • ffmpeg录音测试
  • 爬虫程序中如何添加异常处理?
  • Vi/Vim 编辑器详细指南
  • Facebook如何运用AI实现元宇宙的无限可能?
  • DC-DC降压型开关电源(Buck Converter)设计中,开关频率(f sw​ )、滤波电感(L)和滤波电容(C out​ )的关系和取舍
  • uniapp 全局混入:监听路由变化,路由变化即执行
  • 嵌入式openharmony标准鸿蒙系统驱动开发基本原理与流程
  • openssl 生成自签名证书实现接口支持https
  • 【coze】手册小助手(提示词、知识库、交互、发布)
  • C++中指针使用详解(4)指针的高级应用汇总
  • 人工智能对人类的影响
  • 【Hive入门】Hive安全管理与权限控制:审计日志全解析,构建完善的操作追踪体系
  • kubeadm部署k8s
  • openwrt 使用quilt 打补丁(patch)
  • 基于图像处理的道路监控与路面障碍检测系统设计与实现 (源码+定制+开发) 图像处理 计算机视觉 道路监控系统 视频帧分析 道路安全监控 城市道路管理
  • 计算机视觉与深度学习 | 基于数字图像处理的裂缝检测与识别系统(matlab代码)