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

发布于:2025-09-05 ⋅ 阅读:(11) ⋅ 点赞:(0)

在 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 分级、命名空间配额等功能,实现了对容器资源的精细化管控。合理配置资源不仅能避免资源争抢和节点故障,还能提高集群整体的资源利用率,是保障应用稳定运行的关键实践。


网站公告

今日签到

点亮在社区的每一天
去签到