Kubernetes 命名空间内存与 CPU 配额管理实战指南
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
前言
在 Kubernetes 集群管理中,资源配额(Resource Quota)是确保多租户环境下资源公平分配的关键机制。本文将深入讲解如何为命名空间配置内存和 CPU 配额,帮助管理员有效控制集群资源使用。
核心概念解析
什么是资源配额?
资源配额是 Kubernetes 提供的一种机制,用于限制命名空间可以使用的计算资源总量。通过 ResourceQuota 对象,管理员可以设置:
- 内存请求(requests.memory)和限制(limits.memory)
- CPU 请求(requests.cpu)和限制(limits.cpu)
- 其他资源类型的配额
为什么需要资源配额?
- 防止资源饥饿:避免单个命名空间占用过多资源
- 成本控制:在云环境中控制资源使用成本
- 多租户隔离:确保不同团队/项目间的资源公平使用
- 容量规划:帮助预测集群扩容需求
实战操作指南
环境准备
- 确保拥有创建命名空间的权限
- 集群节点至少需要 1GiB 内存
- 安装并配置好 kubectl 工具
步骤一:创建隔离命名空间
kubectl create namespace quota-mem-cpu-example
这个命名空间将作为我们的实验环境,与集群其他部分隔离。
步骤二:定义资源配额
创建 ResourceQuota 对象配置文件 quota-mem-cpu.yaml
:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
应用配额配置:
kubectl apply -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
配额参数详解
requests.cpu: "1"
:命名空间内所有 Pod 的 CPU 请求总和不超过 1 核requests.memory: 1Gi
:内存请求总和不超过 1GiBlimits.cpu: "2"
:CPU 限制总和不超过 2 核limits.memory: 2Gi
:内存限制总和不超过 2GiB
注意:Kubernetes 中 1 CPU 通常等于 1 个虚拟核(vCPU)或 1 个超线程
步骤三:创建第一个 Pod
创建示例 Pod 配置文件 quota-mem-cpu-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
应用 Pod 配置:
kubectl apply -f quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
步骤四:验证配额使用情况
查看配额详情:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
输出示例:
status:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
used:
limits.cpu: 800m
limits.memory: 800Mi
requests.cpu: 400m
requests.memory: 600Mi
步骤五:尝试突破配额限制
创建第二个 Pod 配置文件 quota-mem-cpu-pod-2.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
尝试创建时会收到错误,因为内存请求总和(600Mi + 700Mi)超过了 1GiB 的配额限制。
高级配置技巧
配额类型扩展
除了内存和 CPU,ResourceQuota 还支持限制:
- 存储资源(PersistentVolumeClaims)
- 对象数量(Pods、Services 等)
- 扩展资源(如 GPU)
配额作用域
可以为配额设置作用域,例如:
- Terminating:只应用于设置了 activeDeadlineSeconds 的 Pod
- NotTerminating:只应用于没有设置 activeDeadlineSeconds 的 Pod
- BestEffort:限制 BestEffort 服务质量级别的 Pod
- NotBestEffort:限制非 BestEffort 服务质量的 Pod
常见问题解答
Q:如何计算 CPU 的毫核(millicores)?
A:1 CPU = 1000m,因此 500m 表示 0.5 个 CPU 核心。
Q:为什么我的 Pod 创建失败但没有明显的配额错误?
A:可能是因为命名空间达到了其他类型的配额限制,如 Pod 数量限制。检查完整的配额详情。
Q:如何查看集群中所有命名空间的配额情况?
A:使用命令 kubectl get resourcequotas --all-namespaces
最佳实践建议
- 渐进式配额设置:初始设置较宽松的配额,根据实际使用情况逐步收紧
- 监控与调整:定期检查配额使用情况,及时调整
- 结合 LimitRange 使用:为单个容器设置默认值和限制范围
- 文档记录:记录各命名空间的配额设置及其业务依据
- 预留缓冲空间:不要将配额设置为集群总容量,保留一定缓冲
清理资源
完成实验后,删除命名空间以释放资源:
kubectl delete namespace quota-mem-cpu-example
总结
通过本文的实践,我们学习了如何在 Kubernetes 中为命名空间配置内存和 CPU 配额。资源配额是多租户集群管理的重要工具,合理使用可以确保集群资源的高效利用和公平分配。建议管理员结合业务需求,设计合理的配额策略,并持续监控优化。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考