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 文化

相关推荐
钢门狂鸭20 分钟前
关于rust的crates.io
开发语言·后端·rust
脑子慢且灵2 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
华仔啊3 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端
勇敢牛牛_5 小时前
使用Rust实现服务配置/注册中心
开发语言·后端·rust·注册中心·配置中心
deepwater_zone5 小时前
Go语言核心技术
后端·golang
爱干饭的boy8 小时前
手写Spring底层机制的实现【初始化IOC容器+依赖注入+BeanPostProcesson机制+AOP】
java·数据结构·后端·算法·spring
蝎子莱莱爱打怪9 小时前
🚀🚀🚀嗨,一起来开发 开源IM系统呀!
前端·后端·github
豌豆花下猫9 小时前
Python 潮流周刊#119:Google 停止开发 Pytype!
后端·python·ai
易元9 小时前
模式组合应用-外观模式
后端·设计模式
龙卷风04059 小时前
SpringAI调用第三方模型增加自定义请求参数
java·后端