19.2.5 资源池与容量管理
资源池与容量管理以“统一入口、弹性供给、可度量”为目标,将计算、存储、网络与中间件资源抽象为可分配的资源池,并以容量模型驱动规划与调度。通过标准标签与资源分类(环境、业务线、地域、合规等级、性能等级)建立资源池边界,支持静态池(物理机/专用集群)与动态池(云资源/容器集群)并存,形成跨基础设施的统一视图。
原理草图(资源池与容量模型的流转关系):
容量模型从“存量—增量—峰值—冗余”四维展开:存量体现可用资源基线;增量评估增长趋势与扩容周期;峰值结合业务节律与营销活动;冗余用于高可用与容灾的安全裕度。为保证交付稳定性,定义容量预警阈值(如70%预警、85%限制、95%冻结),并将扩容策略与采购流程、自动化扩容(云与容器)对接。
关键指标体系包括:CPU/内存/磁盘/网络利用率、资源池碎片率、容量余量、资源交付周期、回收率、超配比(oversubscription)、中间件实例密度等。通过容量看板实现“按池—按业务—按集群”的多维可视化,支持历史趋势与预测分析,形成滚动容量规划(季度/年度)与短期弹性调度(日/周)。
在治理层面,建立容量配额与申请流程,避免无序占用;通过闲置检测与回收机制降低浪费;对高成本资源(SSD、GPU、许可型中间件)设立优先级与审批策略。结合成本治理,按业务线/项目输出成本分摊报告,推动容量使用与预算闭环。通过与编排系统联动,容量不足时自动触发扩容、迁移或降配策略,保障资源池稳定与业务连续性。
示例:基于标签与配额的资源池定义(示例配置与命令)
# 1) 准备资源池定义文件(示例路径)
cat > /etc/cmdb/pools/prod-core.yaml <<'EOF'
pool_name: prod-core
labels:
env: prod
region: cn-hz
compliance: level-3
perf: high
quota:
cpu_cores: 2000
memory_gb: 8000
disk_tb: 500
oversubscription:
cpu: 1.5
memory: 1.2
thresholds:
warn: 0.70
limit: 0.85
freeze: 0.95
EOF
# 2) 入库(示例:调用CMDB API,实际URL替换)
curl -s -X POST http://cmdb.example.com/api/pools \
-H "Content-Type: application/yaml" \
--data-binary @/etc/cmdb/pools/prod-core.yaml
命令解释:
- quota 定义资源池可分配上限;oversubscription 表示超配比。
- thresholds 设置容量阈值,对应预警、限制与冻结。
- curl 将资源池定义推送到 CMDB/资源编排平台。
示例:容量利用率与碎片率计算(脚本示例)
# /usr/local/bin/pool_capacity.sh
# 读取资源池的已用与总量,计算利用率与碎片率(示例数据源)
POOL=prod-core
TOTAL_CPU=2000
USED_CPU=$(curl -s http://cmdb.example.com/api/pools/$POOL/used | jq '.cpu_cores')
TOTAL_MEM=8000
USED_MEM=$(curl -s http://cmdb.example.com/api/pools/$POOL/used | jq '.memory_gb')
cpu_util=$(awk -v u=$USED_CPU -v t=$TOTAL_CPU 'BEGIN{printf "%.2f", u/t}')
mem_util=$(awk -v u=$USED_MEM -v t=$TOTAL_MEM 'BEGIN{printf "%.2f", u/t}')
# 简化碎片率:可用但不可用作大规格分配的比例(示例)
frag_rate=$(curl -s http://cmdb.example.com/api/pools/$POOL/fragmentation | jq '.rate')
echo "pool=$POOL cpu_util=$cpu_util mem_util=$mem_util frag_rate=$frag_rate"
预期效果:输出 cpu_util、mem_util 与 frag_rate,用于阈值检测与容量看板。
示例:阈值告警与自动扩容触发(伪流程+命令)
# 1) 查询当前利用率
util=$(curl -s http://cmdb.example.com/api/pools/prod-core/util | jq '.cpu_util')
# 2) 超过阈值触发扩容(示例调用编排接口)
if awk "BEGIN{exit !($util>0.85)}"; then
curl -s -X POST http://orchestrator.example.com/api/scale \
-H "Content-Type: application/json" \
-d '{"pool":"prod-core","add_cpu":200,"add_mem":800}'
fi
命令解释:当 CPU 利用率超过 85% 时触发编排系统扩容。
示例:Kubernetes 资源池容量查看与限额(与资源池管理联动)
# 1) 统计集群可分配资源
kubectl describe node | awk '/Allocatable/,/System Info/'
# 2) 查看命名空间配额
kubectl get resourcequota -n prod
kubectl describe resourcequota -n prod
# 3) 配置资源配额(示例文件)
cat > /etc/k8s/quota-prod.yaml <<'EOF'
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-prod
namespace: prod
spec:
hard:
requests.cpu: "200"
requests.memory: "400Gi"
limits.cpu: "300"
limits.memory: "600Gi"
EOF
kubectl apply -f /etc/k8s/quota-prod.yaml
命令解释:ResourceQuota 将资源池容量映射到命名空间配额,实现申请与交付的硬限制。
安装与集成建议(以监控与看板为例)
# Prometheus 安装(示例:基于二进制)
useradd -r -s /sbin/nologin prometheus
wget -O /tmp/prometheus.tar.gz https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz
tar -xf /tmp/prometheus.tar.gz -C /opt/
ln -s /opt/prometheus-2.49.1.linux-amd64 /opt/prometheus
cat > /etc/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus
After=network.target
[Service]
User=prometheus
ExecStart=/opt/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now prometheus
预期效果:Prometheus 启动并可采集资源池与容量指标。
排错清单(容量与资源池常见问题)
- 告警未触发:检查阈值配置、指标采集时间窗、Prometheus 报警规则是否更新。
- 扩容失败:检查编排接口返回码、权限令牌、云资源配额是否已耗尽。
- 碎片率过高:检查资源分配粒度与实例规格,考虑合并小规格或迁移负载。
- 超配争抢:核对超配比配置、业务优先级、回收策略是否生效。
练习题
1. 设计一个“生产-研发”双资源池的配额与阈值,写出 YAML 定义。
2. 使用脚本计算一个资源池的 CPU 利用率与碎片率,并输出到 Prometheus Pushgateway。
3. 在 Kubernetes 中创建命名空间配额,并验证超过配额的 Pod 无法创建。
4. 模拟容量不足时触发扩容,输出扩容前后利用率变化。