管理 Namespace 中的资源配额
当多个团队或用户共享同一个 Kubernetes 集群时,资源竞争问题不可避免。为了确保资源的合理分配和使用,需要对不同团队或用户的资源使用配额进行限制。
资源配额控制策略
Kubernetes 提供了两种主要的资源分配管理控制策略:
ResourceQuota
用于限制 namespace 中所有 Pod 占用的总资源 request 和 limit,包括:
- 计算资源配额:CPU、内存等
- 存储资源配额:持久化卷声明等
- 对象数量配额:Pod、Service、ConfigMap 等 Kubernetes 对象的数量
LimitRange
用于设置 namespace 中 Pod 的默认资源 request 和 limit 值,以及单个资源对象的使用范围限制。
启用资源配额功能
在现代 Kubernetes 集群中,ResourceQuota 和 LimitRange 准入控制器通常默认启用。如果需要手动启用,可以在 API Server 的启动参数中添加:
--enable-admission-plugins=ResourceQuota,LimitRange
实战示例
以下示例展示如何为 spark-cluster
namespace 配置资源配额和限制。
计算资源配额配置
创建 spark-compute-resources.yaml
:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: spark-cluster
spec:
hard:
pods: "20" # 最多创建 20 个 Pod
requests.cpu: "20" # CPU 请求总量不超过 20 核
requests.memory: 100Gi # 内存请求总量不超过 100Gi
limits.cpu: "40" # CPU 限制总量不超过 40 核
limits.memory: 200Gi # 内存限制总量不超过 200Gi
应用配置:
kubectl apply -f spark-compute-resources.yaml
查看资源配额状态:
kubectl -n spark-cluster describe resourcequota compute-resources
对象数量限制配置
创建 spark-object-counts.yaml
:
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: spark-cluster
spec:
hard:
configmaps: "10" # 最多 10 个 ConfigMap
persistentvolumeclaims: "4" # 最多 4 个 PVC
replicationcontrollers: "20" # 最多 20 个 RC
secrets: "10" # 最多 10 个 Secret
services: "10" # 最多 10 个 Service
services.loadbalancers: "2" # 最多 2 个 LoadBalancer 类型的 Service
LimitRange 配置
创建 spark-limit-range.yaml
:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: spark-cluster
spec:
limits:
- default: # 默认限制值(Pod 中容器的 limit)
memory: 50Gi
cpu: 5
defaultRequest: # 默认请求值(Pod 中容器的 request)
memory: 1Gi
cpu: 1
type: Container
应用所有配置:
kubectl apply -f spark-object-counts.yaml
kubectl apply -f spark-limit-range.yaml
验证配置效果
查看 namespace 的资源配额使用情况:
# 查看所有资源配额
kubectl -n spark-cluster get resourcequota
# 查看 LimitRange
kubectl -n spark-cluster get limitrange
# 详细信息
kubectl -n spark-cluster describe namespace spark-cluster
最佳实践
- 合理规划资源配额:根据团队实际需求和集群总容量合理分配
- 设置合适的默认值:通过 LimitRange 为容器设置合理的默认 request 和 limit
- 监控资源使用:定期检查资源配额使用情况,及时调整
- 逐步实施:在生产环境中逐步引入资源限制,避免影响现有工作负载