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字节
五、单位规范
资源类型 | 合法单位示例 | 说明 |
---|---|---|
CPU | 100m , 0.5 , 1 | m 表示毫核,1 表示 1 个 CPU 核心 |
内存 | 512Ki , 1024Mi , 2Gi | Ki = 千字节,Mi = 兆字节,Gi = 吉字节 |
存储 | 100Mi , 1Gi , 10Ti | 与内存单位相同 |
六、验证方法
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
七、最佳实践
- 始终显式指定单位:避免因默认单位导致的资源分配错误。
- 内存:使用
Mi
(兆字节)或Gi
(吉字节)。 - CPU:使用
m
(毫核)。
- 内存:使用
- 使用标准单位:优先使用
m
(CPU)、Mi
/Gi
(内存),提高可读性。 - 测试配置:在生产环境部署前,先在测试环境验证资源配置。
通过严格遵循单位规范,可以避免因资源配置错误导致的 Pod 启动失败或性能问题。