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

如何在Jenkins部署脚本中抑制HPA不存在时的get hpa报错?

如何抑制kubectl查询HPA不存在时的报错并保证变量正常赋值?

背景

我在Jenkins的bash部署脚本中,基于可切换的环境变量实现HPA创建逻辑,包含三种场景:

  • 找到合法HPA配置变量:先查询并删除现有HPA,再重新创建(规避Pod数量或CPU阈值变更导致的配置不一致问题)
  • HPA被设置为关闭:查询HPA,若存在则执行删除操作
  • 无HPA相关环境变量:查询HPA,若存在则执行删除操作

当前使用的命令为:

hpaExists=`kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}'`

代码功能正常,但当目标HPA不存在时,控制台会输出错误信息:

Error from server (NotFound): horizontalpodautoscalers.autoscaling "${APP_NAME}" not found

该报错不影响功能,但会干扰开发和QA人员,我希望抑制此报错。

我尝试过以下方法,但均未生效:

  • kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' > /dev/null
  • kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' > /dev/null 2>&1
  • kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' 2> /dev/null
  • kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' || true
  • kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' &> /dev/null

我的问题:

  1. 是否有方法可以抑制该报错信息?
  2. 若成功抑制报错,用于接收命令结果的变量hpaExists是否仍能正常赋值?

解答

1. 抑制报错的有效方法

你之前的尝试未生效,核心原因是:报错是kubectl命令本身输出到标准错误(stderr)的,而你将重定向放在整个管道末尾,仅处理了awk的输出,未覆盖kubectl的错误流。推荐两种可靠方案:

方案一:单独重定向kubectl的错误流

将kubectl的stderr直接重定向到空设备,保留stdout给awk处理:

hpaExists=$(kubectl get hpa/${APP_NAME} --no-headers 2>/dev/null | awk '{print $1}')

该命令会把kubectl的报错直接丢弃,当HPA不存在时,控制台不会显示错误信息。

方案二:使用kubectl内置参数(更优雅)

kubectl提供了--ignore-not-found参数,专门用于忽略资源不存在的场景:

hpaExists=$(kubectl get hpa/${APP_NAME} --no-headers --ignore-not-found | awk '{print $1}')

此参数会让kubectl在目标HPA不存在时,不输出任何错误,直接返回空的标准输出,完全避免报错,逻辑更清晰。

2. 变量赋值的有效性

无论使用上述哪种方案,变量hpaExists都能正常赋值:

  • 当HPA存在时:kubectl输出对应的HPA名称,经awk处理后,变量会被赋值为${APP_NAME}
  • 当HPA不存在时:kubectl无有效标准输出,awk无输入,变量会被赋值为空字符串

后续你可以通过if [ -n "$hpaExists" ]; then判断HPA是否存在,执行对应的删除逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:01:04