K8s进阶之多租户场景下的资源配额(ResourceQuota)


概述

ResourceQuota官方文档:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/

在 Kubernetes(K8s)中,ResourceQuota(资源配额)是一种用于管理命名空间(Namespace)资源使用的核心机制。它通过限制命名空间内可消耗的资源总量,实现资源的精细化分配和隔离,避免单个命名空间过度占用集群资源,保障集群稳定性和多租户环境的公平性。

ResourceQuota 通常与 LimitRange 的配合使用:

  • ResourceQuota:限制命名空间级别的资源总量(如整个命名空间最多使用 2 核 CPU)。
  • LimitRange:限制单个 Pod / 容器的资源请求 / 限制范围(如单个 Pod 的 CPU 请求必须≥100m 且≤500m)。

关于LimitRange可以查看这篇文章:K8s进阶之LimitRange

应用场景

多租户资源隔离

场景:

在多租户集群中(如开发、测试、生产环境共用一个集群),不同租户或团队使用独立的命名空间。

作用:

为每个命名空间设置 CPU、内存、存储等资源的硬限制,防止某个租户滥用资源影响其他租户。

开发 / 测试环境资源管控

场景:

开发和测试环境通常需要快速迭代,但资源使用可能缺乏约束(如临时创建大量 Pod)。

作用:

限制命名空间内可创建的 Pod、服务、PersistentVolumeClaim(PVC)等对象的数量,避免资源浪费。

生产环境资源预留与保障

场景:

生产环境需要为关键应用预留资源,避免被非关键业务抢占。

作用:

为生产环境的命名空间设置较高的资源配额,同时限制非生产环境的资源上限。
结合LimitRange(资源限制范围),确保 Pod 的资源请求 / 限制符合配额要求。

防止集群资源耗尽

场景:

当集群资源有限时(如 CPU、内存总量固定),未限制的命名空间可能导致集群整体资源不足,影响所有业务。

作用:

通过全局配额(在default命名空间或所有命名空间启用),限制整个集群的资源使用上限,保障系统组件(如 kube-proxy、CoreDNS)和高优先级应用的资源可用性。

ResourceQuota支持的资源类型

计算资源

  • requests.cpu:所有 Pod 的 CPU 请求总量(以核心数为单位,如1表示 1 核,0.5或500m表示 0.5 核)
  • requests.memory:内存请求总量(如1Gi、512Mi)
  • limits.cpu:CPU 限制总量(Pod 可突发使用的最大 CPU)
  • limits.memory:内存限制总量(Pod 的 OOM 阈值)

存储资源

  • persistentvolumeclaims:PVC 数量上限
  • storageclass.storage:特定存储类的存储总量(如storageclass.storage.k8s.io/ssd=100Gi)

对象数量

  • pods:Pod 数量上限(包括运行中、已终止的 Pod)
  • services:服务数量上限
  • replicationcontrollers:复制控制器数量上限
  • secrets:Secret 数量上限
  • configmaps:ConfigMap 数量上限
  • deployments.apps:Deployment 数量上限(需启用apps API 组)
  • statefulsets.apps:StatefulSet 数量上限

ResourceQuota资源文件解析


   
apiVersion: v1
kind: ResourceQuota
metadata:
name: namespace-quota
namespace: my-namespace # 指定要应用配额的命名空间
spec:
hard:
# 计算资源配额
requests.cpu: "2" # CPU 总请求量上限
requests.memory: 4Gi # 内存总请求量上限
limits.cpu: "4" # CPU 总限制量上限
limits.memory: 8Gi # 内存总限制量上限
# 存储资源配额
requests.storage: 10Gi # 存储总请求量上限
persistentvolumeclaims: "2" # PVC 数量上限
# 对象数量配额
pods: "10" # Pod 数量上限
services: "5" # Service 数量上限
configmaps: "10" # ConfigMap 数量上限
secrets: "10" # Secret 数量上限
replicationcontrollers: "5" # ReplicationController 数量上限
services.loadbalancers: "2" # LoadBalancer 类型 Service 数量上限
services.nodeports: "2" # NodePort 类型 Service 数量上限

实战案例

创建命名空间并配置资源配额


   
# 创建命名空间
[root@master01 ~]# kubectl create namespace dev
namespace/dev created
# 查看命名空间是否创建成功
[root@master01 ~]# kubectl get ns dev
NAME STATUS AGE
dev Active 5s

配置资源配额


   
# 定义资源配额
[root@master01 ~/quota]# cat dev-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
# 指定要应用配额的命名空间
namespace: dev
spec:
hard:
# 计算资源配额
# CPU 总请求量上限,1核心
requests.cpu: "1"
# 内存总请求量上限,1G
requests.memory: 1Gi
# CPU 总限制量上限,1核心
limits.cpu: "1"
# 内存总限制量上限,1G
limits.memory: 1Gi
# 存储资源配额
# 存储总请求量上限
requests.storage: 5Gi
# PVC 数量上限
persistentvolumeclaims: "2"
# 对象数量配额
# Pod 数量上限
pods: "10"
# Service 数量上限
services: "2"
# ConfigMap 数量上限
configmaps: "3"
# Secret 数量上限
secrets: "10"
# ReplicationController 数量上限
replicationcontrollers: "5"
# LoadBalancer 类型 Service 数量上限
services.loadbalancers: "2"
# NodePort 类型 Service 数量上限
services.nodeports: "2"
# Deployment 数量上限
apps/deployments: "3"
# replicasets 数量上限
apps/replicasets: "3"
# job的数量上限
batch/jobs: "2"
# cronjobs的数量上限
batch/cronjobs: "2"
# 创建资源配额
[root@master01 ~/quota]# kubectl apply -f dev-quota.yaml
resourcequota/dev-quota created

查看一下详细信息


   
# 查看quota
[root@master01 ~/quota]# kubectl get quota -n dev
NAME AGE REQUEST LIMIT
dev-quota 59s apps/deployments: 0/3, apps/replicasets: 0/3, batch/cronjobs: 0/2, batch/jobs: 0/2, configmaps: 1/3, persistentvolumeclaims: 0/2, pods: 0/10, replicationcontrollers: 0/5, requests.cpu: 0/1, requests.memory: 0/1Gi, requests.storage: 0/5Gi, secrets: 0/10, services: 0/2, services.loadbalancers: 0/2, services.nodeports: 0/2 limits.cpu: 0/1, limits.memory: 0/1Gi
# 查看详细信息
[root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
Name: dev-quota
Namespace: dev
Resource Used Hard
-------- ---- ----
apps/deployments 0 3
apps/replicasets 0 3
batch/cronjobs 0 2
batch/jobs 0 2
configmaps 1 3
limits.cpu 0 1
limits.memory 0 1Gi
persistentvolumeclaims 0 2
pods 0 10
replicationcontrollers 0 5
requests.cpu 0 1
requests.memory 0 1Gi
requests.storage 0 5Gi
secrets 0 10
services 0 2
services.loadbalancers 0 2
services.nodeports 0 2

验证ResourceQuota

验证计算资源

当我们创建Pod时不指定CPU和memory的资源会发生什么呢?

创建Pod时会报错,错误信息提示我们需要指定request和limit,当在ResourceQuota限制的命名空间内,创建Pod时,需要配置对应的资源限额,这是一个强制性的诉求


   
[root@master01 ~/quota]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
spec:
containers:
- name: nginx-container-1
image: nginx:latest
[root@master01 ~/quota]# kubectl apply -f pod.yaml
Error from server (Forbidden): error when creating "pod.yaml": pods "nginx-pod" is forbidden: failed quota: dev-quota: must specify limits.cpu for: nginx-container-1; limits.memory for: nginx-container-1; requests.cpu for: nginx-container-1; requests.memory for: nginx-container-1

创建出一个符合规则约束的Pod,看看会发生什么


   
[root@master01 ~/quota]# cat pod-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-1
namespace: dev
spec:
containers:
- name: nginx-container-1
image: nginx:latest
# 定义资源限制
resources:
requests:
cpu: "0.5"
memory: "500Mi"
limits:
cpu: "0.5"
memory: "500Mi"
[root@master01 ~/quota]# kubectl apply -f pod-1.yaml
pod/nginx-pod-1 created
# 查看quota,发现Used列产生了数据
[root@master01 ~/quota]# kubectl describe quota -n dev
Name: dev-quota
Namespace: dev
Resource Used Hard
-------- ---- ----
apps/deployments 0 3
apps/replicasets 0 3
batch/cronjobs 0 2
batch/jobs 0 2
configmaps 1 3
limits.cpu 500m 1
limits.memory 500Mi 1Gi
persistentvolumeclaims 0 2
pods 1 10
replicationcontrollers 0 5
requests.cpu 500m 1
requests.memory 500Mi 1Gi
requests.storage 0 5Gi
secrets 0 10
services 0 2
services.loadbalancers 0 2
services.nodeports 0 2

在创建一个Pod,将CPU和memory分别设置为0.8和800Mi

发现在我们创建时,提示报错了,为什么呢?因为我们创建的Pod资源请求超出了规定的配额


   
[root@master01 ~/quota]# cat pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-2
namespace: dev
spec:
containers:
- name: nginx-container-2
image: nginx:latest
resources:
requests:
cpu: "0.8"
memory: "800Mi"
limits:
cpu: "0.8"
memory: "800Mi"
[root@master01 ~/quota]# kubectl apply -f pod-2.yaml
Error from server (Forbidden): error when creating "pod-2.yaml": pods "nginx-pod-2" is forbidden: exceeded quota: dev-quota, requested: limits.cpu=800m,limits.memory=800Mi,requests.cpu=800m,requests.memory=800Mi, used: limits.cpu=500m,limits.memory=500Mi,requests.cpu=500m,requests.memory=500Mi, limited: limits.cpu=1,limits.memory=1Gi,requests.cpu=1,requests.memory=1Gi

验证service资源

我们先创建两个service,类型分别是nodePort和loadBalancer


   
[root@master01 ~/quota]# cat service-1.yaml
# NodePort类型的service
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
namespace: dev
spec:
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
---
# LoadBalancer类型service
apiVersion: v1
kind: Service
metadata:
name: nginx-loadbalancer
namespace: dev
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
# 创建
[root@master01 ~/quota]# kubectl apply -f service-1.yaml
service/nginx-nodeport created
service/nginx-loadbalancer created
# 查看
[root@master01 ~/quota]# kubectl get service -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-loadbalancer LoadBalancer 10.96.1.23 <pending> 80:30531/TCP 5s
nginx-nodeport NodePort 10.96.1.11 <none> 80:30080/TCP 5s

查看一下quota详细信息


   
[root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
Name: dev-quota
Namespace: dev
Resource Used Hard
-------- ---- ----
apps/deployments 0 3
apps/replicasets 0 3
batch/cronjobs 0 2
batch/jobs 0 2
configmaps 1 3
limits.cpu 500m 1
limits.memory 500Mi 1Gi
persistentvolumeclaims 0 2
pods 1 10
replicationcontrollers 0 5
requests.cpu 500m 1
requests.memory 500Mi 1Gi
requests.storage 0 5Gi
secrets 0 10
services 2 2
services.loadbalancers 1 2
services.nodeports 2 2

这里nodeports的数量为2,为什么呢?因为loadbalancer类型的service底层使用的就是nodeport。所以创建loadbalancer类型的service时会自动创建一个nodeport。

关于service可以学习这篇文章:K8s新手系列之Service资源

这个时候我们在创建一个clusterip类型的service,看看会发生什么?
再继续创建的话,会报错,提示我们service的数量已经不够了


   
[root@master01 ~/quota]# cat service-3.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
namespace: dev
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@master01 ~/quota]# kubectl apply -f service-3.yaml
Error from server (Forbidden): error when creating "service-3.yaml": services "nginx-clusterip" is forbidden: exceeded quota: dev-quota, requested: services=1, used: services=2, limited: services=2

验证其它资源

这里大家可以根据上面的案例自行测试,

ResourceQuota管理

查看ResourceQuota


   
kubectl get quota <quota-name> -n <namespace>
# 查看详细信息
kubectl describe quota <quota-name> -n <namespace>

删除ResourceQuota


   
kubectl delete quota <quota-name> -n <namespace>

修改已经定义好的ResourceQuota

方式一,直接修改资源清单文件,重新应用即可

示例:


   
[root@master01 ~/quota]# cat dev-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
# 指定要应用配额的命名空间
namespace: dev
spec:
hard:
# 修改为10
requests.cpu: "10"
# 修改为10G
requests.memory: 10Gi
limits.cpu: "1"
limits.memory: 10Gi
# 修改为50G
requests.storage: 50Gi
persistentvolumeclaims: "2"
pods: "10"
services: "2"
configmaps: "3"
secrets: "10"
replicationcontrollers: "5"
services.loadbalancers: "2"
services.nodeports: "2"
apps/deployments: "3"
apps/replicasets: "3"
batch/jobs: "2"
batch/cronjobs: "2"
# 重新应用
[root@master01 ~/quota]# kubectl apply -f dev-quota.yaml
resourcequota/dev-quota configured
# 查看更新后的资源
[root@master01 ~/quota]# kubectl describe quota dev-quota -n dev
Name: dev-quota
Namespace: dev
Resource Used Hard
-------- ---- ----
apps/deployments 0 3
apps/replicasets 0 3
batch/cronjobs 0 2
batch/jobs 0 2
configmaps 1 3
limits.cpu 500m 1
limits.memory 500Mi 10Gi # 已更新
persistentvolumeclaims 0 2
pods 1 10
replicationcontrollers 0 5
requests.cpu 500m 10
requests.memory 500Mi 10Gi # 已更新
requests.storage 0 50Gi # 已更新
secrets 0 10
services 2 2
services.loadbalancers 1 2
services.nodeports 2 2
方式二:使用kubectl edit 命令直接编辑保存即可
原创作者: huangSir-devops 转载于: https://www.cnblogs.com/huangSir-devops/p/18895344
<think>嗯,用户让我详细解释KubernetesResourceQuota使用场景、生产实践和全面介绍。首先,我需要确保自己理解ResourceQuota的基本概念。ResourceQuotaKubernetes中用来限制命名空间资源使用的一个机制,对吧?它可以帮助集群管理员控制每个命名空间的资源消耗,防止某个命名空间占用过多资源影响其他应用。 接下来,用户可能想知道为什么需要ResourceQuota。在生产环境中,可能会有多个团队或项目共享同一个集群,如果没有资源配额,某个团队部署的应用可能会消耗大量CPU或内存,导致其他应用无法正常运行。这时候,ResourceQuota就能派上用场了,确保资源分配的公平性。 然后,使用场景方面,用户可能需要具体的例子。比如多租户集群、资源成本控制、防止资源饥饿、合规性要求等。这些场景需要详细说明,让用户明白在什么情况下应该使用ResourceQuota。 生产实践部分,可能需要包括如何规划配额、监控和调整、结合LimitRange使用、处理配额冲突、配额更新策略等。这些内容需要结合实际操作经验,给出可行的建议。比如,如何根据历史数据设置初始配额,如何监控资源使用情况,如何逐步调整配额以避免影响应用运行。 另外,用户可能还关心ResourceQuota的配置示例,比如如何限制CPU、内存、存储、对象数量等。需要给出具体的YAML示例,并解释每个字段的作用。比如,限制命名空间的Pod数量、PVC数量,或者设置请求和限制的总量。 同时,可能要注意到ResourceQuota的一些限制,比如它只作用于命名空间级别,不能限制单个Pod或容器,这时候需要结合LimitRange来使用。此外,资源配额的冲突处理也很重要,比如当用户创建资源时,如果超过配额,如何处理错误信息,如何调整资源请求。 还需要提到一些高级功能,比如作用域机制(Scope),比如BestEffort、Terminating、NotTerminating等,这些作用域可以更精细地控制配额的应用范围。比如,限制所有BestEffort类型的Pod,或者仅限制非终止状态的资源。 最后,总结部分需要强调ResourceQuota资源管理和多租户环境中的重要性,提醒用户合理规划配额,并结合监控和LimitRange来优化资源使用。可能还需要提到实际使用中的注意事项,比如配额设置过严可能导致部署失败,需要根据实际情况调整。 现在需要检查是否有遗漏的部分,比如ResourceQuota支持哪些资源类型,除了CPU、内存,还有存储、对象数量等。另外,配额分为requests和limits,需要解释清楚两者的区别。可能还需要提到ResourceQuota的优先级,以及如何查看当前配额的使用情况。 确保回答结构清晰,分点说明,使用示例代码时用$$...$$格式,行内公式用$...$。比如,在提到资源计算公式时,可能需要用LaTeX表达,但用户的问题是关于Kubernetes的,可能公式较少,但如果有涉及计算的地方要注意格式。 总之,整理思路,分步骤介绍ResourceQuota的概念、使用场景、生产实践、配置示例、注意事项等,确保内容全面且易于理解。</think>以下是对 Kubernetes ResourceQuota 的全面介绍,分场景解析与生产实践指南: --- ### 一、ResourceQuota 核心概念 **定义**:ResourceQuotaKubernetes 中限制命名空间(Namespace)级别资源总量的机制,通过约束 CPU、内存、存储、对象数量等维度,实现多租户环境下的资源隔离与公平分配。 **核心公式**(资源总量约束): $$ \sum_{i=1}^{n} \text{Resource}_{\text{request/limit}} \leq \text{Quota}_{\text{max}} $$ --- ### 二、六大典型使用场景 1. **多团队共享集群** - 每个团队分配独立 Namespace - 避免单个团队过度消耗资源(如:`dev-team` 占用全部 CPU 导致生产服务崩溃) 2. **成本管控** - 限制资源使用量,防止超额支出(如:严格限制非生产环境的 GPU 配额) 3. **防资源枯竭** - 防御恶意/异常 Pod 消耗资源(如:限制单个 Namespace 最多创建 50 个 Pod) 4. **合规性要求** - 满足审计要求(如:强制所有工作负载设置资源请求/限制) 5. **混合环境治理** - 分级管控开发/测试/生产环境资源(如:生产环境享有更高配额优先级) 6. **存储管控** - 限制 PVC 数量与存储总量(如:`logs` Namespace 最多申请 10 个 100GB 卷) --- ### 三、生产环境最佳实践 #### 1. 配额规划策略 - **渐进式调整**:初始按历史峰值的 120% 设置,逐步优化 - **分类管控**:按环境分级(示例): ```yaml # 生产环境配额 (prod-quota.yaml) apiVersion: v1 kind: ResourceQuota metadata: name: prod-quota namespace: prod spec: hard: requests.cpu: "16" requests.memory: 64Gi limits.cpu: "32" limits.memory: 128Gi persistentvolumeclaims: "20" ``` #### 2. 监控与调优 - **关键指标监控**: ```bash kubectl describe resourcequota -n <namespace> ``` - `Used` 持续接近 `Hard` 时触发告警 - 推荐配置:当使用率 >85% 时自动通知 #### 3. 与 LimitRange 协同 - **组合策略**:ResourceQuota 控制总量,LimitRange 约束单 Pod 资源 ```yaml # LimitRange 示例 (pod-limits.yaml) apiVersion: v1 kind: LimitRange metadata: name: pod-limiter spec: limits: - default: cpu: "1" memory: "1Gi" defaultRequest: cpu: "0.5" memory: "512Mi" type: Container ``` #### 4. 配额冲突处理 - **典型错误**: ```log Error creating: pods "web-123" is forbidden: exceeded quota: dev-quota, requested: limits.memory=2Gi, used: limits.memory=14Gi, limited: limits.memory=15Gi ``` - **应对步骤**: 1. 分析现有资源分布:`kubectl top pods -n <namespace>` 2. 清理僵尸资源(如已完成的 Job) 3. 申请配额扩容或优化应用资源需求 #### 5. 高级作用域控制 - **Scope 类型**: ```yaml spec: scopeSelector: matchExpressions: - operator: In scopeName: PriorityClass values: ["high-priority"] ``` - 按优先级(PriorityClass)、QoS 等级(BestEffort)等细分控制 --- ### 四、配置示例全解 #### 1. 计算资源配额 ```yaml apiVersion: v1 kind: ResourceQuota metadata: name: compute-quota spec: hard: requests.cpu: "10" # CPU请求总量 ≤ 10核 requests.memory: 20Gi # 内存请求总量 ≤ 20GiB limits.cpu: "20" # CPU限制总量 ≤ 20核 limits.memory: 40Gi # 内存限制总量 ≤ 40GiB ``` #### 2. 对象数量配额 ```yaml hard: pods: "50" # 最多50个Pod services: "10" # 最多10个Service configmaps: "30" # 最多30个ConfigMap persistentvolumeclaims: "15" # 最多15个PVC ``` #### 3. 存储配额 ```yaml hard: requests.storage: "1Ti" # 存储请求总量 ≤ 1TB ssd.storageclass.storage.k8s.io/requests.storage: "500Gi" # SSD专用配额 ``` --- ### 五、注意事项 1. **删除资源不释放配额**? - 某些资源(如 PVC)需手动删除后才释放配额 2. **配额优先级**: - 同时存在多个 ResourceQuota 时,所有约束需同时满足 3. **特殊资源限制**: - GPU 等扩展资源需显式声明(如 `nvidia.com/gpu: "4"`) --- ### 六、总结 ResourceQuotaKubernetes 多租户管理的基石工具,通过合理规划配额策略、持续监控优化、结合 LimitRange 细粒度控制,可显著提升集群稳定性与资源利用率。建议定期审查配额使用情况,建立弹性调整机制以适应业务变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值