在Kubernetes中,Namespace的资源限制主要通过两种资源对象实现:
ResourceQuota(资源配额)和LimitRange(限制范围)。它们共同作用于Namespace级别,用于控制资源使用、防止资源滥用,并确保集群资源的合理分配。
1. ResourceQuota(资源配额)
ResourceQuota 用于限制整个Namespace可使用的总资源量和对象数量,防止单个Namespace过度占用集群资源。它可以限制的内容包括:
- 计算资源总量(CPU、内存的请求和限制)
- 存储资源总量(PVC的存储请求)
- 可创建的对象数量(如Pod、Service、ConfigMap等)
配置示例(ResourceQuota)
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: ns-resource-quota
namespace: my-namespace # 目标Namespace
spec:
hard: # 硬限制(不可突破)
# 计算资源总限制
requests.cpu: "1" # 所有Pod的CPU请求总和≤1核
requests.memory: "1Gi" # 所有Pod的内存请求总和≤1Gi
limits.cpu: "2" # 所有Pod的CPU限制总和≤2核
limits.memory: "2Gi" # 所有Pod的内存限制总和≤2Gi
# 存储资源限制
requests.storage: "5Gi" # 所有PVC的存储请求总和≤5Gi
persistentvolumeclaims: "3" # 最多创建3个PVC
# 对象数量限制
pods: "10" # 最多创建10个Pod
services: "5" # 最多创建5个Service
configmaps: "10" # 最多创建10个ConfigMap
2. LimitRange(限制范围)
LimitRange 用于为Namespace内的单个资源对象(如Pod、Container)设置默认的资源请求(requests)和限制(limits),以及最小/最大值约束。它解决的问题是:
- 当用户创建Pod时未指定资源配置,自动应用默认值
- 防止单个Pod/容器请求过小(无法正常运行)或过大(浪费资源)
配置示例(LimitRange)
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: ns-limit-range
namespace: my-namespace # 目标Namespace
spec:
limits:
- type: Container # 对容器的限制
default: # 容器未指定时的默认limits
cpu: "500m" # 默认CPU限制:0.5核
memory: "512Mi" # 默认内存限制:512Mi
defaultRequest: # 容器未指定时的默认requests
cpu: "100m" # 默认CPU请求:0.1核
memory: "128Mi" # 默认内存请求:128Mi
min: # 容器资源的最小值(不能低于此值)
cpu: "50m"
memory: "64Mi"
max: # 容器资源的最大值(不能超过此值)
cpu: "1000m"
memory: "1Gi"
- type: Pod # 对Pod的限制(所有容器的资源总和)
max:
cpu: "2000m" # 单个Pod的总CPU限制≤2核
memory: "2Gi" # 单个Pod的总内存限制≤2Gi
核心概念:资源请求(requests)与限制(limits)
- requests:容器需要的最小资源量(Kubernetes调度时保证分配)
- limits:容器允许使用的最大资源量(超出可能被限流或终止)
ResourceQuota 限制的是Namespace内所有对象的requests和limits总和;LimitRange 限制的是单个对象的requests和limits的默认值、最小值和最大值。
使用流程
1.创建目标Namespace:
kubectl create namespace my-namespace
2.应用ResourceQuota:
kubectl apply -f resource-quota.yaml
3.应用LimitRange:
kubectl apply -f limit-range.yaml
4.查看配置:
# 查看资源配额
kubectl get resourcequota -n my-namespace
kubectl describe resourcequota ns-resource-quota -n my-namespace
# 查看限制范围
kubectl get limitrange -n my-namespace
kubectl describe limitrange ns-limit-range -n my-namespace
注意事项
- 若仅配置
ResourceQuota而无LimitRange,用户创建Pod时必须显式指定资源requests和limits,否则会被拒绝(无法满足配额约束)。 LimitRange的默认值仅对新创建的对象生效,不影响已存在的对象。- 资源限制需根据集群实际容量和业务需求合理配置,避免过松(资源滥用)或过紧(业务无法运行)。
通过这两种机制,可以实现Namespace级别的精细化资源管控,确保Kubernetes集群的稳定性和资源利用率。