Kubernetes Deployment升级与回退实现过程

 更新时间:2026年01月15日 14:25:51   作者:XMYX-0  
文章介绍了如何使用Kubernetes的`kubectl set image --record`命令进行版本更新,以及如何使用`kubectl rollout undo`命令快速回退到稳定版本,以实现应用的持续交付和故障回退,Kubernetes的Deployment机制通过声明式管理确保服务的高可用性和连续性

在生产环境中,应用持续交付要求能够在不中断服务的前提下平滑地升级,同时在出现问题时能迅速回退到稳定版本。Kubernetes 的 Deployment 机制正是为此而设计的。

本篇文章将介绍如何使用 kubectl set image --record 命令进行版本更新,以及如何利用 kubectl rollout undo 快速回退,帮助你掌握升级和回退 Deployment 的核心技巧。

Kubernetes Deployment 基础概念

Deployment 是 Kubernetes 中用于管理无状态应用的核心控制器。

它主要负责:

  • 定义所需的 Pod 副本数
  • 生成并维护 ReplicaSet 集合,确保当前运行状态符合预期
  • 实现滚动更新,逐步替换旧版本 Pod 为新版本 Pod,保证服务连续性

通过声明式的方式,我们只需描述期望状态,Deployment 控制器便会自动完成版本更新、扩缩容以及故障回退等任务。

利用kubectl -n namespace set image --record 实现版本升级

在升级过程中,我们常常需要将容器镜像更新为新版本。使用以下命令可以完成这一操作:

kubectl -n test set image deployment/my-deployment my-container=myimage:newtag --record
  • -n test:指定命名空间
  • deployment/my-deployment:指定要更新的 Deployment 名称。
  • my-container=myimage:newtag:将容器名称 my-container 对应的镜像更新为 myimage:newtag
  • –record:该参数会将此次操作记录在 Deployment 的 annotation 中(记录在 kubernetes.io/change-cause 字段中),方便后续查阅更新历史和在出现问题时进行回退。

更新命令执行后,Deployment 控制器会启动滚动更新流程,逐步创建新版本的 Pod 并删除旧版本的 Pod,从而实现零停机升级。

监控滚动更新进程

升级过程中可以使用以下命令来监控更新状态,确保新版本 Pod 已正常启动并达到预期副本数:

kubectl rollout status deployment/my-deployment

此外,还可以使用 kubectl get podskubectl get rs 分别查看 Pod 和 ReplicaSet 的状态,了解新旧版本 Pod 的数量变化情况。这样可以及时发现镜像拉取失败或健康检查不通过等问题。

Deployment 回退:快速恢复稳定版本

在升级后发现问题时,可以使用回退命令将 Deployment 恢复到之前的稳定版本。最简单的方式是执行:

kubectl rollout undo deployment/my-deployment

该命令会将 Deployment 回退到上一个版本。如果需要回退到特定版本,还可以加上 --to-revision 参数,例如:

kubectl rollout undo deployment/my-deployment --to-revision=2

回退命令同样会触发滚动更新,将现有的 Pod 替换为之前版本的 Pod,确保应用尽快恢复正常运行。

实战演示:升级与回退操作流程

假设我们有一个简单的 Deployment,其 YAML 文件如下:

apiVersion: apps/v1
kind: Deployment
namespace:test
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: my-container
        image: nginx:1.14
        ports:
        - containerPort: 80

升级步骤

执行升级命令

将镜像更新为新版本,例如 nginx:1.16

kubectl -n test set image deployment/my-deployment my-container=nginx:1.16 --record

监控滚动更新

使用以下命令查看更新进度:

kubectl -n test rollout status deployment/my-deployment

同时,通过 kubectl -n test get pods 查看新旧 Pod 状态。

回退步骤

假设升级后出现异常,决定回退:

执行回退命令

将 Deployment 恢复到上一个版本:

kubectl -n test rollout undo deployment/my-deployment

验证回退结果

再次使用 kubectl -n test rollout statuskubectl -n test describe deployment my-deployment 检查当前镜像是否已恢复为 nginx:1.14

补充:最佳实践与注意事项

记录变更历史

使用 --record 参数可以方便追踪每次更新的命令。不过需要注意,部分文档中提到该参数将来可能会被废弃,因此在自动化流水线中可以考虑在更新后手动添加注解记录变更信息:

kubectl annotate deployment/my-deployment kubernetes.io/change-cause="更新镜像至 nginx:1.16"

使用滚动更新策略

默认情况下,Deployment 采用滚动更新策略(RollingUpdate),可以通过设置 maxSurgemaxUnavailable 参数来调整更新时的并发度与可用性。

例如:

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

这样可以保证在更新过程中,始终保持所有副本可用,避免服务中断。

版本标记与镜像管理

在生产环境中,建议不要使用 latest 标签。每次构建后应生成唯一的镜像标签(如基于构建号或 Git commit SHA),这样可以确保每次更新都能明确标识版本,并便于回退操作。

自动化 CI/CD 流水线

在 CI/CD 系统中,将镜像构建与 Kubernetes 部署流程自动化,将更新命令(如 kubectl set image 或直接应用更新后的 Deployment YAML)集成到流水线中,能大幅提升更新效率和稳定性。

结语

通过本文,你应该已经了解了如何利用 Kubernetes 的 Deployment 机制进行无停机的滚动更新,以及在出现问题时如何使用回退命令快速恢复稳定版本。无论是在手动操作还是自动化流水线中,掌握这些命令和最佳实践都能帮助你更好地管理集群中的应用版本,确保服务的高可用性和持续交付。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s编排之StatefulSet知识点详解一

    k8s编排之StatefulSet知识点详解一

    这篇文章主要为大家介绍了k8s编排之StatefulSet知识点的部分详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • k8s集群调度详解(kube-scheduler)

    k8s集群调度详解(kube-scheduler)

    Kubernetes调度器负责将Pod分配至Node节点,采用预选(资源匹配)和优选(资源利用率、镜像缓存)策略,支持指定节点、标签及亲和性(软/硬策略)调度,确保资源高效利用与灵活分配
    2025-09-09
  • 云原生技术kubernetes之volumes容器的使用

    云原生技术kubernetes之volumes容器的使用

    这篇文章主要为大家介绍了云原生技术kubernetes之volumes容器使用方式, 有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • DeepSeek-R1 云环境搭建部署流程

    DeepSeek-R1 云环境搭建部署流程

    本文主要介绍了DeepSeek-R1 云环境搭建部署流程,包括注册、选择合适的服务器配置、部署DeepSeek模型及通过UI界面和SSH连接进行操作,感兴趣的可以了解一下
    2025-02-02
  • 详解推荐使用systemd timer替代cronjob

    详解推荐使用systemd timer替代cronjob

    这篇文章主要为大家介绍了推荐使用systemd timer替代0cronjob原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    这篇文章主要给大家介绍了关于阿里云kubernetes查找镜像中jar包的方法,也就是在docker查看镜像中的jar,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 阿里云oss对象存储使用详细步骤

    阿里云oss对象存储使用详细步骤

    本文主要介绍了阿里云oss对象存储使用详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • k8s编排之DaemonSet知识点详解

    k8s编排之DaemonSet知识点详解

    这篇文章主要为大家介绍了k8s编排之DaemonSet知识点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • K8S prometheus operator监控工作原理介绍

    K8S prometheus operator监控工作原理介绍

    这篇文章主要为大家介绍了K8S prometheus operator监控工作原理介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Kubernetes(K8S)彻底卸载详细教程

    Kubernetes(K8S)彻底卸载详细教程

    网络上有很多的K8S安装安装教程,但是唯独很少有卸载教程,有也讲得不清不楚,下面这篇文章主要给大家介绍了关于Kubernetes(K8S)彻底卸载的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论