Kubernetes 资源限制设置规范手册
1. 引言
1.1 目的
本规范旨在统一团队对 Kubernetes 资源限制的理解和设置,避免因单位混淆导致的性能问题、资源浪费或应用异常。
1.2 适用范围
适用于所有在 Kubernetes 集群中部署的应用的资源配置。
1.3 背景
由于历史原因,计算机领域存在二进制和十进制单位的混用,Kubernetes 采用了明确但容易混淆的单位体系。本规范将消除团队在此问题上的困惑。
2. CPU 资源限制规范
2.1 基本单位定义
yaml
# ✅ 正确的 CPU 单位表示
resources:
requests:
cpu: "500m" # 500 milliCPU = 0.5 个 CPU 核心
limits:
cpu: "2" # 2 个完整的 CPU 核心
2.2 CPU 单位详解
| 表示方法 | 含义 | 等效值 | 使用场景 |
|---|---|---|---|
"1" |
1 个 CPU 核心 | 1 CPU | 计算密集型应用 |
"1000m" |
1000 milliCPU | 1 CPU | 与 "1" 等效 |
"500m" |
500 milliCPU | 0.5 CPU | 推荐使用,精确控制 |
"250m" |
250 milliCPU | 0.25 CPU | 轻量级任务 |
"0.1" |
0.1 个 CPU 核心 | 0.1 CPU | 可用,但推荐使用 milli 形式 |
2.3 CPU 设置最佳实践
yaml
# ✅ 推荐配置示例
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: web-app
resources:
requests:
cpu: "250m" # 保证的最小 CPU 资源
limits:
cpu: "1000m" # 最大可用的 CPU 资源
3. 内存资源限制规范
3.1 内存单位定义标准
核心原则:统一使用二进制单位 (MiB/GiB)
yaml
# ✅ 正确的内存单位表示
resources:
requests:
memory: "256Mi" # 256 Mebibytes = 268,435,456 字节
limits:
memory: "2Gi" # 2 Gibibytes = 2,147,483,648 字节
3.2 内存单位对照表
| 正确单位 | 错误单位 | 实际字节数 | 差异说明 |
|---|---|---|---|
"1Ki" |
"1K" |
1,024 字节 | +2.4% |
"1Mi" |
"1M" |
1,048,576 字节 | +4.9% |
"1Gi" |
"1G" |
1,073,741,824 字节 | +7.4% |
"512Mi" |
"512M" |
536,870,912 字节 vs 512,000,000 字节 | +4.9% |
3.3 内存设置计算公式
bash
# 内存需求计算方法
应用常驻内存 × 1.2 (20%缓冲) = memory requests
应用峰值内存 × 1.5 (50%缓冲) = memory limits
# 示例:应用常驻 200MB,峰值 300MB
requests = 200Mi × 1.2 = 240Mi
limits = 300Mi × 1.5 = 450Mi
4. 完整资源配置示例
4.1 Web 应用配置
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-application
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:1.20
resources:
requests:
cpu: "100m" # ✅ 0.1 CPU 核心
memory: "128Mi" # ✅ 134,217,728 字节
limits:
cpu: "500m" # ✅ 0.5 CPU 核心
memory: "256Mi" # ✅ 268,435,456 字节
ports:
- containerPort: 80
4.2 数据库应用配置
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
spec:
serviceName: "postgresql"
replicas: 1
template:
spec:
containers:
- name: postgres
image: postgres:13
resources:
requests:
cpu: "1000m" # ✅ 1 CPU 核心
memory: "4Gi" # ✅ 4,294,967,296 字节
limits:
cpu: "2000m" # ✅ 2 CPU 核心
memory: "8Gi" # ✅ 8,589,934,592 字节
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
4.3 批处理任务配置
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: data-processor
spec:
template:
spec:
containers:
- name: processor
image: data-processor:latest
resources:
requests:
cpu: "500m" # ✅ 0.5 CPU 核心
memory: "1Gi" # ✅ 1,073,741,824 字节
limits:
cpu: "1000m" # ✅ 1 CPU 核心
memory: "2Gi" # ✅ 2,147,483,648 字节
command: ["/app/process-data.sh"]
restartPolicy: Never
5. 资源监控与优化指南
5.1 监控指标解读
bash
# 使用 kubectl top 监控资源使用
kubectl top pod -n <namespace>
# 输出示例:
NAME CPU(cores) MEMORY(bytes)
web-app-xxxxx-yyyy 125m 180Mi
db-app-xxxxx-yyyy 850m 3.2Gi
# 指标说明:
# CPU(cores): 显示的是核心数,125m = 0.125 核心
# MEMORY(bytes): 显示的是字节数,180Mi ≈ 188,743,680 字节
5.2 资源使用率建议
| 资源类型 | 请求(request)使用率 | 限制(limit)使用率 | 优化建议 |
|---|---|---|---|
| CPU | 70-80% | 不超过 90% | 适当提高 limits 或优化代码 |
| 内存 | 60-70% | 不超过 85% | 注意 OOM Kill 风险 |
5.3 资源调整流程
bash
1. 监控分析 (1-2周)
kubectl top pods
Prometheus 监控数据
2. 基准测试
压力测试确定峰值资源需求
3. 渐进调整
每次调整不超过 20%
4. 验证稳定性
观察 24-48 小时业务表现
6. 常见问题与解决方案
6.1 单位混淆问题
问题: "1G" 和 "1Gi" 混用
解决方案: 在代码审查中严格检查,使用自动化工具验证
bash
# 使用 kube-score 自动检查
kube-score score my-deployment.yaml
# 输出会提示不规范的资源单位使用
6.2 资源设置不合理问题
症状: CPU Throttling 或 OOM Kill
解决方案:
yaml
# 调整前(问题配置)
resources:
limits:
cpu: "100m" # ❌ 设置过小
memory: "128M" # ❌ 使用错误单位
# 调整后(正确配置)
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
6.3 资源浪费问题
症状: 资源使用率长期低于 30%
解决方案: 适当降低 requests,提高集群资源利用率
7. 工具与自动化
7.1 验证脚本
bash
#!/bin/bash
# validate-resources.sh
# 验证资源配置是否符合规范
kubectl get deployment -o json | jq -r '
.items[] | .metadata.name as $name |
.spec.template.spec.containers[] |
select(.resources.limits.memory | test("[0-9]+[KMGT]i?") ) |
"\($name): \(.resources.limits.memory)"'
7.2 Git Hooks 检查
在 .git/hooks/pre-commit 中添加资源单位检查,确保提交的 YAML 文件使用正确的单位格式。
8. 附则
8.1 规范生效
本规范自发布之日起生效,所有新部署的应用必须遵循此规范。
8.2 存量应用迁移
存量应用应在 3 个月内完成资源配置的规范化改造。
8.3 更新机制
本规范每半年回顾一次,根据技术发展和团队反馈进行更新。