如何在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/nullkubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' > /dev/null 2>&1kubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' 2> /dev/nullkubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' || truekubectl get hpa/${APP_NAME} --no-headers | awk '{print $1}' &> /dev/null
我的问题:
- 是否有方法可以抑制该报错信息?
- 若成功抑制报错,用于接收命令结果的变量
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
相关产品推荐
相关产品推荐

