部署前验证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集成步骤
- 在Azure DevOps流水线中,添加Bash任务,并将其放在
oc process部署任务之前。 - 确保流水线已配置OpenShift的
oc命令环境(可通过Azure DevOps的OpenShift工具安装任务或自定义环境变量实现)。 - 若需要
yq工具,可在Bash任务开头添加安装命令:# Ubuntu代理环境安装yq apt-get update && apt-get install -y yq - 将上述脚本内容填入Bash任务的脚本框,替换所有占位变量(如YAML路径、配额名称等)。
内容的提问来源于stack exchange,提问作者user804401
相关产品推荐
相关产品推荐

