You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署前验证OpenShift Pod内存与CPU资源可用性的方法

部署前验证OpenShift资源可用性的实现方案

完全可以通过Azure DevOps的Bash任务配合OpenShift的oc命令实现部署前的资源验证,以下是具体实现步骤:

核心思路

从Deployment Config YAML中提取资源请求/限制配置,再通过oc命令获取目标项目或节点的可用资源,最后对比两者数值,若请求资源超过可用量则终止部署流程。


1. 解析Deployment Config中的资源配置

使用yq(轻量YAML处理工具)或原生命令从YAML中提取CPU、内存的请求与限制值,并统一单位方便计算:

# 替换为你的Deployment Config文件名
DC_YAML_PATH="your-deployment-config.yaml"

# 提取资源配置
CPU_REQUEST=$(yq e '.spec.template.spec.containers[0].resources.requests.cpu' $DC_YAML_PATH)
MEMORY_REQUEST=$(yq e '.spec.template.spec.containers[0].resources.requests.memory' $DC_YAML_PATH)
CPU_LIMIT=$(yq e '.spec.template.spec.containers[0].resources.limits.cpu' $DC_YAML_PATH)
MEMORY_LIMIT=$(yq e '.spec.template.spec.containers[0].resources.limits.memory' $DC_YAML_PATH)

# 单位转换:将CPU m单位转为核,内存Mi转为Gi
# CPU转核
if [[ $CPU_REQUEST =~ m$ ]]; then
  CPU_REQUEST_CORE=$(echo "$CPU_REQUEST" | sed 's/m//' | awk '{print $1/1000}')
else
  CPU_REQUEST_CORE=$CPU_REQUEST
fi

# 内存转Gi
if [[ $MEMORY_REQUEST =~ Mi$ ]]; then
  MEMORY_REQUEST_GI=$(echo "$MEMORY_REQUEST" | sed 's/Mi//' | awk '{print $1/1024}')
elif [[ $MEMORY_REQUEST =~ Gi$ ]]; then
  MEMORY_REQUEST_GI=$(echo "$MEMORY_REQUEST" | sed 's/Gi//')
fi

2. 获取OpenShift目标环境的可用资源

根据你的资源管控策略,选择以下两种方式之一获取可用资源:

方式一:基于项目资源配额验证

如果项目配置了资源配额,直接获取配额剩余量:

# 替换为你的项目配额名称
QUOTA_NAME="your-project-quota"

# 获取配额剩余CPU(核)
QUOTA_CPU_USED=$(oc get quota $QUOTA_NAME -o jsonpath='{.status.used.cpu}' | sed 's/m//' | awk '{print $1/1000}')
QUOTA_CPU_HARD=$(oc get quota $QUOTA_NAME -o jsonpath='{.status.hard.cpu}' | sed 's/m//' | awk '{print $1/1000}')
QUOTA_CPU_AVAILABLE=$(echo "$QUOTA_CPU_HARD - $QUOTA_CPU_USED" | bc -l)

# 获取配额剩余内存(Gi)
QUOTA_MEM_USED=$(oc get quota $QUOTA_NAME -o jsonpath='{.status.used.memory}' | sed 's/Mi//' | awk '{print $1/1024}')
QUOTA_MEM_HARD=$(oc get quota $QUOTA_NAME -o jsonpath='{.status.hard.memory}' | sed 's/Mi//' | awk '{print $1/1024}')
QUOTA_MEM_AVAILABLE=$(echo "$QUOTA_MEM_HARD - $QUOTA_MEM_USED" | bc -l)

方式二:基于节点可用资源验证

如果没有项目配额,直接获取目标工作节点的剩余资源(可遍历所有工作节点计算总和):

# 获取所有工作节点的可用CPU总和(核)
NODE_CPU_AVAILABLE=0
for node in $(oc get nodes --selector=node-role.kubernetes.io/worker -o name); do
  allocatable_cpu=$(oc describe $node | grep 'Allocatable' | grep cpu | awk '{print $2}' | sed 's/m//' | awk '{print $1/1000}')
  allocated_cpu=$(oc describe $node | grep 'Allocated' | grep cpu | awk '{print $2}' | sed 's/m//' | awk '{print $1/1000}')
  node_cpu_available=$(echo "$allocatable_cpu - $allocated_cpu" | bc -l)
  NODE_CPU_AVAILABLE=$(echo "$NODE_CPU_AVAILABLE + $node_cpu_available" | bc -l)
done

# 获取所有工作节点的可用内存总和(Gi)
NODE_MEM_AVAILABLE=0
for node in $(oc get nodes --selector=node-role.kubernetes.io/worker -o name); do
  allocatable_mem=$(oc describe $node | grep 'Allocatable' | grep memory | awk '{print $2}' | sed 's/Mi//' | awk '{print $1/1024}')
  allocated_mem=$(oc describe $node | grep 'Allocated' | grep memory | awk '{print $2}' | sed 's/Mi//' | awk '{print $1/1024}')
  node_mem_available=$(echo "$allocatable_mem - $allocated_mem" | bc -l)
  NODE_MEM_AVAILABLE=$(echo "$NODE_MEM_AVAILABLE + $node_mem_available" | bc -l)
done

3. 资源对比与部署判断

添加对比逻辑,若请求资源超过可用量则终止流程:

# 替换为你选择的可用资源变量(QUOTA_*或NODE_*)
AVAILABLE_CPU=$QUOTA_CPU_AVAILABLE
AVAILABLE_MEM=$QUOTA_MEM_AVAILABLE

# 验证CPU资源
if (( $(echo "$CPU_REQUEST_CORE > $AVAILABLE_CPU" | bc -l) )); then
  echo "ERROR: 请求CPU($CPU_REQUEST_CORE核)超过可用量($AVAILABLE_CPU核)"
  exit 1
fi

# 验证内存资源
if (( $(echo "$MEMORY_REQUEST_GI > $AVAILABLE_MEM" | bc -l) )); then
  echo "ERROR: 请求内存($MEMORY_REQUEST_GI Gi)超过可用量($AVAILABLE_MEM Gi)"
  exit 1
fi

# 验证通过,输出提示
echo "资源验证通过,开始执行部署..."

4. Azure DevOps集成步骤

  1. 在Azure DevOps流水线中,添加Bash任务,并将其放在oc process部署任务之前。
  2. 确保流水线已配置OpenShift的oc命令环境(可通过Azure DevOps的OpenShift工具安装任务或自定义环境变量实现)。
  3. 若需要yq工具,可在Bash任务开头添加安装命令:
    # Ubuntu代理环境安装yq
    apt-get update && apt-get install -y yq
    
  4. 将上述脚本内容填入Bash任务的脚本框,替换所有占位变量(如YAML路径、配额名称等)。

内容的提问来源于stack exchange,提问作者user804401

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:10:20