DevOps 基础到精通 - 部署策略

1. 引言

部署是 DevOps 生命周期中的最后一步,但可以说是最关键的一步。你可以编写优雅的代码、彻底测试、通过所有审查------但如果部署失败,用户永远无法看到价值。

传统上,部署是一个手动且高压的过程("在我机器上能跑"是常见的挫败感)。现代 DevOps 通过让部署 可复现、自动化、可扩展 来颠覆这一现状。部署不再是瓶颈,而是集成在 CI/CD 流水线中的 常规、低风险步骤

本文将探讨:

  • 虚拟机 vs 容器 的基础,以及它们为什么对部署很重要。
  • 常见部署策略:滚动更新、蓝绿部署、金丝雀发布
  • 支撑概念如 自动扩展服务发现,它们让这些策略在大规模系统中可行。

2. 虚拟机 (VM) vs 容器

在深入策略之前,首先要了解 我们部署的环境

虚拟机 (VM)

  • VM 本质上是运行在虚拟机管理程序(Hypervisor)上的完整操作系统。
  • 每个 VM 有自己的内核、内存和资源,使其与其他 VM 高度隔离
  • 优点:隔离性强、环境可预测,非常适合在一台机器上运行多个操作系统。
  • 缺点:较重 ------ 每台 VM 需要数 GB 存储,启动需要几分钟。

容器

  • 容器 是一个轻量级环境,将应用及其依赖打包,但共享宿主操作系统内核。
  • 与 VM 相比,容器 启动更快体积更小
  • 非常适合 微服务架构,可并行运行数十甚至数百个小服务。

为什么这对部署很重要

  • 企业和遗留系统仍然常用 VM,但可能会拖慢部署速度。
  • 容器使现代部署更 便宜、快速、灵活
  • 高级部署策略(蓝绿、金丝雀、自动扩展)通常以容器为设计基础。

回顾我之前的博客

在我 后台编程路线图关于容器化与虚拟化的文章 中,我详细讲解了这些概念:

  • 虚拟化 → 隔离性强,兼容遗留应用,但开销大、扩展慢。
  • 容器化 → 轻量、可移植、高效;适合云原生应用,但隔离性略低。
  • Docker 简化了将应用打包为容器。
  • Kubernetes 可在大规模上编排容器,提供自动扩展、弹性和负载均衡等功能。

➡️ 那篇文章深入讲解了权衡、实际案例,以及 Dockerfile 和 Kubernetes YAML 示例。这里我们只关注为什么这个区分对 DevOps 部署策略重要。


DevOps 中的部署策略

3. 部署策略

应用打包好(VM 或容器)后,下一个挑战是:如何在不影响用户的情况下发布更新? DevOps 提供了多种策略来安全、高效地部署。

3.1 滚动更新 (Rolling Deployments)

  • 定义:逐台服务器(或容器)更新应用,直到所有实例运行新版本。

  • 优点

    • 零停机(只要至少有部分旧实例继续提供服务)。
    • 比一次性替换更安全。
  • 缺点

    • 新旧版本可能暂时重叠。如果不保持向后兼容(例如数据库模式变化),可能出问题。

👉 Kubernetes 中常用 :滚动更新是默认策略 (kubectl rollout)。


3.2 蓝绿部署 (Blue/Green Deployments)

  • 定义:运行两个完全相同的环境:

    • 蓝色 = 现网生产环境
    • 绿色 = 新版本的预发布环境
  • 一旦绿色环境准备好并经过测试,流量从蓝色 → 绿色 一步切换。

  • 优点

    • 回滚几乎瞬间完成(只需切回蓝色)。
    • 风险极低,用户只在新版本稳定时看到更新。
  • 缺点

    • 基础设施成本翻倍(两个环境必须同时运行)。

💡 迷你教程思路

  • 想象一个 GitLab CI/CD 流水线 :构建 Docker 镜像,部署到绿色环境,运行自动化测试,如果成功,则更新 Nginx 反向代理 将流量从蓝色切换到绿色。
  • 回滚?只需将代理配置切回蓝色即可。

3.3 金丝雀发布 (Canary Releases)

  • 定义 :将新版本发布给 小部分用户(如 5%)。监控无异常后,逐步增加流量,直至 100% 用户使用新版本。

  • 优点

    • 问题只影响少部分用户。
    • 可在真实生产负载下进行测试。
  • 缺点

    • 需要复杂的监控和路由配置。
  • 行业示例:Google、Facebook、Netflix 都使用金丝雀发布以安全地大规模交付更新。


4. 扩展与服务管理

部署并非代码上线就结束。应用需要应对 流量高峰、故障,以及动态服务发现

4.1 什么是自动扩展 (Autoscaling)?

  • 定义:根据负载自动调整服务器或容器数量。
  • 工作原理

    • CPU 使用率飙升时,自动启动更多容器。
    • 流量下降时,关闭未使用实例以节约成本。
  • 示例

    • AWS Auto Scaling Groups → 自动扩展 EC2 VM。
    • Kubernetes 水平 Pod 自动扩展器 (HPA) → 根据指标自动扩展 Pod。
  • 优点

    • 成本高效(按需付费)。
    • 防止流量激增导致系统宕机。

4.2 什么是服务发现 (Service Discovery)?

在微服务架构中,容器不断被创建和销毁。硬编码 IP 地址不可行。

  • 服务发现 = 允许服务动态找到彼此的系统。

  • 工作原理

    • 新服务实例上线时,会自动注册自己。
    • 其他服务可以按名称查询(而不是 IP)。
  • 示例

    • Kubernetes DNS :每个服务都有稳定的 DNS 名称(如 auth-service.default.svc.cluster.local)。
    • HashiCorp Consul:服务注册 + 健康检查。
    • Netflix Eureka:Spring Cloud 生态常用。

💡 没有服务发现,微服务扩展将是一团糟。有了它,应用可以自由扩缩容,同时仍能相互通信。


5. 经验总结

  • 部署策略(滚动、蓝绿、金丝雀)在速度、安全和成本之间取得平衡。
  • 容器 + CI/CD 流水线 使高级部署可行且可复现。
  • 自动扩展 确保应用随需求变化自动适应,无需手动运维。
  • 服务发现 使微服务动态扩展而不破坏连接。
  • 黄金法则:自动化降低风险,加快交付,比人工操作更可扩展。

6. 下一步

既然我们已经讲了 部署策略与扩展 ,下一步是 监控与可观测性

➡️ 如何判断应用健康?如何在用户抱怨之前发现问题?下一篇文章我们将讲:

  • 日志、指标与追踪。
  • 工具:Prometheus、Grafana、ELK、Sentry
  • 构建 可观测优先的 DevOps 文化

相关推荐
David爱编程34 分钟前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术1 小时前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术1 小时前
Spring AI存储向量数据
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
陈三一1 小时前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure1 小时前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜2 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee
我崽不熬夜3 小时前
Java中的基本数据类型和包装类:你了解它们的区别吗?
java·后端·java ee