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 更新机制
本规范每半年回顾一次,根据技术发展和团队反馈进行更新。