K8s 系列 | 第 21 天:资源配额与 LimitRange:多租户资源管控


title: “K8s 系列 | 第 21 天:资源配额与 LimitRange:多租户资源管控”
tags:
– Kubernetes
– K8s系列
– DevOps
– 资源配额
– 多租户
– ResourceQuota
– LimitRange
– 云原生


K8s 系列 | 第 21 天:资源配额与 LimitRange:多租户资源管控

第 21/30 天


一、引言

在真实的 Kubernetes 生产环境中,多个团队、多个应用常常共享同一个集群。如果没有资源管控机制,一个”喧闹邻居”(Noisy Neighbor)应用可能耗尽集群资源,导致其他关键服务不可用。Kubernetes 提供了 ResourceQuotaLimitRange 两个核心资源管控机制,实现多租户隔离与资源公平分配。

本文深入讲解 ResourceQuota 和 LimitRange 的原理、配置实战以及生产环境最佳实践,帮助你构建健壮的多租户 K8s 集群。


二、核心概念

2.1 ResourceQuota(资源配额)

ResourceQuota 是一个命名空间级别的资源限制策略,用于约束该命名空间内所有 Pod 的资源总和上限。它限制两类资源:

  • 计算资源:CPU、内存的 requests 和 limits 总和上限
  • 存储资源:PVC 的存储请求总和上限
  • 对象数量:Pod、Service、ConfigMap、PVC 等 K8s 对象的最大数量

2.2 LimitRange(限制范围)

LimitRange 同样是命名空间级别的策略,但作用在单个 Pod 或容器级别。它解决以下问题:

  • 为未显式设置资源 requests/limits 的 Pod 设置默认值
  • 约束单个 Pod/容器能使用的最大/最小资源量
  • 约束 PVC 的存储请求范围

2.3 两者的关系

维度 ResourceQuota LimitRange
作用范围 命名空间内所有资源总和 单个 Pod / 容器 / PVC
主要目的 防止资源耗尽 防止单个 Pod 过度占用
默认值设置 ❌ 不支持 ✅ 支持默认 requests/limits

两者配合使用效果最佳。ResourceQuota 设定总量上限,LimitRange 确保每个 Pod 的资源配置合理。


三、实战步骤

3.1 创建测试命名空间

kubectl create namespace quota-demo

3.2 配置 ResourceQuota

创建 resource-quota.yaml

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-quota
  namespace: quota-demo
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "10"
    pods: "20"
    services: "10"
    configmaps: "10"
    secrets: "20"

应用配额并查看状态:

kubectl apply -f resource-quota.yaml

# 查看配额详情
kubectl get resourcequota team-quota -n quota-demo -o yaml

# 查看配额使用情况
kubectl describe quota team-quota -n quota-demo

输出示例:

Name:         team-quota
Namespace:    quota-demo
Resource      Used  Hard
--------      ---   ---
configmaps    0     10
limits.cpu    0     8
limits.memory 0     16Gi
pods          0     20
persistentvolumeclaims 0 10
requests.cpu  0     4
requests.memory 0   8Gi
secrets       0     20
services      0     10

3.3 配置 LimitRange

创建 limit-range.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: team-limits
  namespace: quota-demo
spec:
  limits:
    - default:
        cpu: "500m"
        memory: "512Mi"
      defaultRequest:
        cpu: "200m"
        memory: "256Mi"
      max:
        cpu: "2"
        memory: "4Gi"
      min:
        cpu: "50m"
        memory: "64Mi"
      type: Container
  • default:容器未设置 limits 时的默认值
  • defaultRequest:容器未设置 requests 时的默认值
  • max:单个容器允许的最大资源限制
  • min:单个容器允许的最小资源请求
kubectl apply -f limit-range.yaml
kubectl describe limitrange team-limits -n quota-demo

3.4 验证资源管控效果

部署一个测试 Pod 验证配额限制:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: quota-demo
spec:
  containers:
    - name: nginx
      image: nginx:latest
      resources:
        requests:
          cpu: "1"
          memory: "1Gi"
        limits:
          cpu: "2"
          memory: "2Gi"

尝试创建一个超出配额限制的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: oversized-pod
  namespace: quota-demo
spec:
  containers:
    - name: nginx
      image: nginx:latest
      resources:
        requests:
          cpu: "8"    # 超出团队配额 (4 CPU requests)
          memory: "10Gi"  # 超出团队配额 (8Gi memory requests)
kubectl apply -f oversized-pod.yaml
# 预期输出:Error from server (Forbidden): ... exceeds quota

3.5 存储配额实战

限制命名空间内的存储使用:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-quota
  namespace: quota-demo
spec:
  hard:
    requests.storage: "100Gi"
    persistentvolumeclaims: "10"
    ssd.storageclass.storage.k8s.io/requests.storage: "50Gi"
    standard.storageclass.storage.k8s.io/requests.storage: "50Gi"

这限制了不同 StorageClass 的存储用量上限,确保某一类存储不会被单个团队消耗殆尽。


四、常见问题与最佳实践

4.1 常见问题

Q1:ResourceQuota 和 LimitRange 必须同时配置吗?

不是必须,但强烈建议配合使用。只配置 ResourceQuota 而不配 LimitRange 时,未设置资源 requests 的 Pod 可能导致配额计算混乱。LimitRange 提供了默认值兜底,确保每个 Pod 都有明确的资源声明。

Q2:为命名空间设置 ResourceQuota 后,为什么 Pod 创建失败?

最常见的原因是 Pod 没有设置资源 requests/limits,而 LimitRange 也未配置默认值。Kubernetes 要求配额生效时,所有 Pod 都必须有显式的资源声明。

Q3:如何为不同团队设置不同的资源配额?

为每个团队创建独立的 Namespace,然后为每个 Namespace 应用不同的 ResourceQuota 和 LimitRange。这是最常用的多租户隔离模式。

Q4:配额可以动态调整吗?

可以。直接修改 ResourceQuota 对象的 spec.hard 字段即可,修改会立即生效。但需要注意,如果新配额低于当前使用量,已运行的 Pod 不会被驱逐,但新的 Pod 创建将被拒绝,直到资源释放。

4.2 生产最佳实践

  1. 配额分层设计:根据不同团队/业务的重要性设置不同配额 — 核心业务分配更多资源,开发/测试环境分配较少资源
  2. 监控告警联动:结合 Prometheus 监控配额使用率,当使用量达到 80% 时发出告警,避免业务突增时被拒绝
  3. LimitRange 兜底策略:始终为每个命名空间配置 LimitRange 的默认值,防止未设置资源限制的 Pod 逃逸管控
  4. 范围限定配额:使用 scopes 字段可以针对特定状态的 Pod 设置配额,如 TerminatingNotTerminating
  5. 定期审计:通过 kubectl describe quota 定期检查各命名空间的资源使用情况,及时调整配额分配

4.3 多租户资源隔离架构

┌─────────────────────────────────────────────────────┐
│                    K8s 集群                           │
│                                                      │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐        │
│  │ Team A    │  │ Team B    │  │ Team C    │        │
│  │ Namespace │  │ Namespace │  │ Namespace │        │
│  │           │  │           │  │           │        │
│  │ Quota:    │  │ Quota:    │  │ Quota:    │        │
│  │ 4 CPU     │  │ 8 CPU     │  │ 2 CPU     │        │
│  │ 8Gi Mem   │  │ 16Gi Mem  │  │ 4Gi Mem   │        │
│  │ 20 Pods   │  │ 40 Pods   │  │ 10 Pods   │        │
│  └───────────┘  └───────────┘  └───────────┘        │
│                                                      │
│  ┌──────────────────────────────────────────────┐    │
│  │  Cluster Autoscaler: 集群资源不足时自动扩容     │    │
│  └──────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

五、总结

ResourceQuota 和 LimitRange 是 Kubernetes 多租户资源管控的基石。ResourceQuota 从”总量”角度防止单个 Namespace 恶性消耗集群资源,LimitRange 从”单个”维度确保每个 Pod 的资源配置合理且有默认值兜底。

通过合理配置这两个机制,你可以:
– ✅ 防止”喧闹邻居”影响其他服务
– ✅ 实现多团队公平的资源分配
– ✅ 避免因未设置资源限制导致的节点 OOM
– ✅ 精确控制集群资源利用率

下期预告:第 22 天 — 监控体系搭建:Prometheus + Grafana + Kube-state-metrics

我们将深入 K8s 生产运维的核心 — 监控体系。从 Prometheus Operator 部署到 Grafana 面板配置,再到 Kube-state-metrics 为集群状态监控提供的强大指标,带你构建一套完整的 K8s 监控告警体系。


系列目录:
第 1 天:Kubernetes 核心概念与架构
第 2 天:kubeadm 搭建集群
第 3 天:Pod 详解
第 4 天:Deployment 与 ReplicaSet
第 5 天:Service 与网络基础
第 6 天:Namespace 与资源配额
第 7 天:ConfigMap 与 Secret
第 8 天:Volume 与 PersistentVolume
第 9 天:StorageClass 与动态存储供给
第 10 天:StatefulSet
第 11 天:Ingress 与 Ingress Controller
第 12 天:NetworkPolicy
第 13 天:Headless Service
第 14 天:CSI 存储插件
第 15 天:污点与容忍度
第 16 天:Node Affinity 与 Pod Affinity
第 17 天:HPA 水平自动扩缩
第 18 天:VPA 与 Cluster Autoscaler
第 19 天:Job 与 CronJob
第 20 天:PriorityClass 与抢占式调度
→ 第 21 天:资源配额与 LimitRange(本文)
第 22 天:监控体系搭建
第 23 天:日志收集实战
第 24 天:RBAC 权限控制
第 25 天:Helm Charts
第 26 天:集群备份与恢复
第 27 天:滚动更新与回滚
第 28 天:集群升级实战
第 29 天:多集群管理
第 30 天:生产环境踩坑实录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容