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

Jenkins执行K8s RollingUpdate部署后新变更未生效问题求助

问题根因分析
  • 核心原因:镜像固定使用latest标签,Kubernetes Deployment滚动更新的触发条件是Pod模板(spec.template)字段发生变更,只要你YAML中的image字段值没有变化,Deployment就会判定不需要重建Pod,即使镜像仓库里的latest对应镜像已经更新,集群节点本地的旧latest镜像缓存也会被优先使用,这就是你需要手动删镜像才能生效的直接原因。
  • 其他潜在问题:
    • Kubernetes manifest存在语法错误:spec.template.spec下的backend是无效字段,可能导致配置实际未正常更新
    • Jenkinsfile中kubectl配置未生效:你定义了带集群上下文的kubectl变量,但实际执行apply命令时未使用该变量,可能出现配置部署到错误集群/命名空间的情况
    • Readiness探针配置异常:若新Pod的就绪探针检测失败,滚动更新会自动回滚,始终保留旧版本Pod对外提供服务
修复方案

1. 替换固定latest标签为唯一动态标签

每次构建镜像时生成唯一标签(可使用代码Commit哈希、Jenkins构建号、时间戳等),示例如下:

// Jenkins构建阶段生成镜像标签示例
def imageTag = "build-${BUILD_NUMBER}"
sh "docker build -t myimage:${imageTag} ."
sh "docker push myimage:${imageTag}"
// 部署前替换YAML中的镜像标签
sh "sed -i 's#image: myimage:.*#image: myimage:${imageTag}#' ./infrastructure/dev/my.yaml"

唯一标签每次部署都会修改image字段值,会自动触发Deployment滚动更新,无需依赖节点镜像拉取策略。

2. 修复Manifest语法错误

删除spec.template.spec下的无效backend字段,避免配置校验不通过导致的更新失效。

3. 修正Jenkinsfile kubectl调用逻辑

将你定义的带集群配置的kubectl变量实际用到部署命令中,避免配置错位:

sh "${kubectl} apply -f ./infrastructure/dev/my.yaml -n default --record"
// 新增滚动更新状态检测,部署失败直接中断任务
sh "${kubectl} rollout status deployment myapp -n default --timeout=5m"
sh "${kubectl} rollout history deployment myapp -n default"

4. 校验Readiness探针配置

确认应用3030端口确实开启HTTPS服务,且允许myhost的Host头访问,可临时调整探针参数简化测试,确认滚动更新流程正常后再恢复严格的探针配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:00