K8s资源管理:高效管控CPU与内存

在 Kubernetes(k8s)中,资源管理是确保容器化应用高效、稳定运行的核心机制,主要通过对 CPU、内存等计算资源的分配、限制和调度进行管控,避免资源争抢、节点过载或资源浪费。

一、核心概念:资源请求(Requests)与资源限制(Limits)

Kubernetes 对容器的资源管理通过 resources 字段定义,包含两个关键配置:

1. 资源请求(Requests)
  • 定义 :容器运行时最低需求的资源量(如 CPU、内存),Kubernetes 调度器会根据此值将 Pod 调度到有足够空闲资源的节点上。
  • 作用:确保 Pod 能获得运行所需的最小资源,避免被调度到资源不足的节点而无法启动。
  • 示例 :cpu: 100m(100 毫核,即 0.1 CPU 核心)、memory: 128Mi(128 兆字节)。
2. 资源限制(Limits)
  • 定义 :容器运行时允许使用的最大资源量,防止单个容器过度占用资源,影响同一节点上的其他容器。
  • 作用:避免资源滥用导致节点崩溃(如内存泄漏导致节点 OOM 杀死进程)。
  • 示例 :cpu: 500m(最多使用 0.5 CPU 核心)、memory: 512Mi(最多使用 512MB 内存)。

二、配置示例:为容器设置资源请求与限制

在 Deployment、Pod 等资源的 YAML 配置中,通过 containers.resources 字段定义:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo-container
    image: nginx
    resources:
      requests:  # 资源请求(调度依据)
        cpu: "100m"    # 最低需要 0.1 CPU 核心
        memory: "128Mi"  # 最低需要 128MB 内存
      limits:    # 资源限制(上限)
        cpu: "500m"    # 最多使用 0.5 CPU 核心
        memory: "512Mi"  # 最多使用 512MB 内存

三、资源类型与单位

1. CPU 资源
  • 单位 :
    • m(毫核):1 核 = 1000m,例如 500m 表示 0.5 核。
    • 直接写数字:如 1 表示 1 核。
  • 特点:CPU 是 "可压缩资源",当容器使用超过限制时,会被 "限流"(throttled),但不会被杀死。
2. 内存资源
  • 单位 :
    • Mi(Mebibyte,2^20 字节,约 1.048MB)、Gi(Gibibyte,2^30 字节)。
    • M(Megabyte,10^6 字节)、G(Gigabyte,10^9 字节)(不推荐,易混淆)。
  • 特点:内存是 "不可压缩资源",当容器使用超过限制时,会被 OOM(Out Of Memory)杀死并重启(取决于重启策略)。

四、资源管理策略

1. 保证 QoS(服务质量等级)

Kubernetes 根据资源配置将 Pod 分为 3 类 QoS 等级,影响节点资源不足时的驱逐策略:

  • Guaranteed(保证级) :
    • 所有容器的 requests 与 limits 相等(且不为 0)。
    • 优先级最高,节点资源不足时最后被驱逐。
  • Burstable(可突发级) :
    • 至少一个容器设置了 requests 但 requests < limits。
    • 优先级中等,资源不足时可能被驱逐(早于 Guaranteed)。
  • BestEffort(尽力而为级) :
    • 未设置任何 requests 或 limits。
    • 优先级最低,资源不足时最先被驱逐。
2. 命名空间资源配额(Resource Quota)

通过 ResourceQuota 资源限制整个命名空间的资源使用上限,防止单个命名空间占用集群过多资源:

复制代码
apiVersion: v1
kind: ResourceQuota
metadata:
  name: namespace-quota
  namespace: my-namespace
spec:
  hard:
    pods: "10"  # 最多创建 10 个 Pod
    requests.cpu: "2"  # 所有 Pod 的 CPU 请求总和 ≤ 2 核
    requests.memory: "2Gi"  # 所有 Pod 的内存请求总和 ≤ 2Gi
    limits.cpu: "4"  # 所有 Pod 的 CPU 限制总和 ≤ 4 核
    limits.memory: "4Gi"  # 所有 Pod 的内存限制总和 ≤ 4Gi
3. 限制范围(LimitRange)

通过 LimitRange 为命名空间内未指定资源配置的容器 设置默认的 requests 和 limits,避免用户忘记配置资源:

复制代码
apiVersion: v1
kind: LimitRange
metadata:
  name: default-resources
  namespace: my-namespace
spec:
  limits:
  - default:  # 默认的 limits(若容器未指定则生效)
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:  # 默认的 requests(若容器未指定则生效)
      cpu: "100m"
      memory: "128Mi"
    type: Container  # 作用于容器

五、资源监控与调优

  1. 监控工具 :
    • Metrics Server :提供基础的 CPU / 内存指标(kubectl top pod 命令依赖它)。
    • Prometheus + Grafana:高级监控,可自定义资源使用仪表盘。
  2. 调优原则 :
    • 避免 requests 过高:导致资源闲置,调度效率下降。
    • 避免 limits 过低:导致应用因资源不足崩溃(如内存限制低于实际需求)。
    • 对核心服务使用 Guaranteed 级 QoS,确保稳定性。

总结

Kubernetes 的资源管理通过 "请求 - 限制" 机制、QoS 分级、命名空间配额等功能,实现了对容器资源的精细化管控。合理配置资源不仅能避免资源争抢和节点故障,还能提高集群整体的资源利用率,是保障应用稳定运行的关键实践。

相关推荐
猿究院_夏燊3 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog3 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿4 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河4 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年4 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Jlzn88884 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
Williamtym4 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
香吧香4 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
DongQiShanRen5 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室5 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python