核心要解决的问题就一个:开发和运维之间的那堵墙。
写代码、加功能
诉求:快点上线
保稳定、防故障
诉求:别出事
两边天然对立。DevOps 的思路是:与其互相甩锅,不如用自动化把流程打通,让双方坐在同一条船上。
DevOps 的核心实践就是 CI/CD——持续集成 + 持续交付/部署。整个流程是一个不断循环的闭环:
开发提交代码后,自动触发编译、打包、跑测试。问题早发现——刚写的 bug 马上暴露,而不是攒到上线前才爆。
测试通过后自动部署到预发甚至生产环境,同时监控线上状态。发布又快又稳——从"一周发一次"变成"一天发十次"。
| 实践 | 通俗解释 | 代表工具 |
|---|---|---|
| CI/CD 流水线 | 代码提交后自动跑完全流程 | Jenkins、GitLab CI、GitHub Actions |
| 基础设施即代码 (IaC) | 用写代码的方式管理服务器配置 | Terraform、Ansible |
| 容器化 | 应用打包成标准化盒子,到哪都能跑 | Docker、Kubernetes |
| 自动化测试 | 不靠人肉点,机器自动验 | Selenium、Pytest、JMeter |
| 监控告警 | 线上一出事马上知道 | Prometheus、Grafana |
CI/CD 听起来高大上,拆开看其实就是一条"代码进来 → 自动干活 → 结果出去"的流水线。下面以最流行的方案,一步步讲清楚。
核心思路:代码仓库的某个事件(push、PR、tag)触发 → 一连串自动化步骤依次执行 → 产出制品并部署。
看懂这段配置,你就理解了 CI/CD 的核心:声明式地描述"什么事发生时、按什么顺序、执行什么命令"。
GitHub Actions(GitHub 项目首选,免费额度大方)、GitLab CI(自建 GitLab 用)、Jenkins(老牌、插件多但重)、Zadig(云原生 K8s 场景)
把代码放到 GitHub/GitLab,确保有基本的 package.json / Makefile / Dockerfile,让构建过程可重复执行。
在仓库根目录创建 .github/workflows/ci.yml(GitHub Actions)或 .gitlab-ci.yml(GitLab CI),定义触发条件、构建步骤、测试命令。
拉代码 → 安装依赖 → 编译 → 打包。原则:任何环境跑出来的结果必须一致,所以用 Docker 固定环境。
至少跑单元测试。进阶可以加代码覆盖率检查、lint 静态扫描。测试不通过就阻断流水线,不让坏代码往下走。
测试通过后:推镜像到镜像仓库 → 部署到测试环境 → (手动审批后)部署到生产。生产部署建议用蓝绿/灰度策略(见下方)。
流水线成功/失败时通知到飞书/钉钉/Slack。部署后接监控(Prometheus),有问题立刻回滚。
直接把旧版停掉、新版上线的"暴力替换"风险最大。生产发布推荐用以下策略:
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 滚动更新 Rolling | 逐步用新 Pod 替换旧 Pod,像换岗一样 | K8s 默认策略,日常更新 |
| 蓝绿发布 Blue-Green | 准备两套环境(蓝/绿),新版先部署到备用环境,测试 OK 后流量一刀切换 | 需要快速回滚的场景 |
| 金丝雀 Canary | 先放一小部分流量(如 5%)到新版,观察没问题再逐步放大到 100% | 大版本更新、高风险变更 |
| 灰度发布 | 按用户特征(地域、用户 ID、比例)分批放量 | 面向大量用户的 ToC 业务 |
| 特性开关 Feature Toggle | 新代码已上线但用开关控制是否启用,出问题一键关闭 | 功能灰度、A/B 测试 |
不管哪种策略,必须配套一键回滚能力——出问题能秒级退回上一个稳定版本,这是 DevOps 的安全底线。
痛点:以前在开发电脑上跑得好好的,部署到服务器就报错——操作系统版本不同、依赖库缺失、环境变量不一样。"在我机器上能跑"成了经典甩锅。
你的程序
运行所需的库
精简版 OS
Docker 容器把这三样东西打包成一个整体。就像海运集装箱:不管里面装的是汽车还是服装,外面的船和码头只需要认"标准集装箱"这一个规格。
构建命令:docker build -t myapp:v1 . → 得到一个镜像 → docker run myapp:v1 → 无论在哪台机器上跑,行为完全一致。
痛点:一个容器好管,但生产环境往往有几十上百个容器——有的要扩容、有的挂了要重启、有的要互相通信、有的要根据流量自动伸缩。手动管根本不可能。
Kubernetes(简称 K8s)就是来解决这个问题的。它是一个容器编排系统,帮你自动管理大量容器的生命周期。
| 能力 | 人话解释 | 价值 |
|---|---|---|
| 自动调度 | 你告诉 K8s "我要跑 3 个实例",它自动找合适的机器放上去 | 不用手动指定服务器 |
| 自愈 | 某个容器挂了,K8s 自动重新拉起一个 | 半夜挂了也不用人工干预 |
| 弹性伸缩 | CPU 高了自动加实例,闲了自动减 | 抗大促、省成本 |
| 服务发现 | 服务之间通过名字互相找,不用记 IP | IP 变了也不影响 |
| 滚动更新 | 发新版本时逐个替换,全程不中断 | 零停机发布 |
| 负载均衡 | 流量自动分发到多个实例 | 高可用 |
| 对比项 | 虚拟机 | 容器 |
|---|---|---|
| 启动速度 | 分钟级(要启动整个 OS) | 秒级(共享内核,只启进程) |
| 资源占用 | 重(每个 VM 一套完整 OS) | 轻(共享宿主机内核) |
| 隔离性 | 强(硬件级隔离) | 中等(进程级隔离) |
| 密度 | 一台机器跑几个 VM | 一台机器跑几十上百个容器 |
把前面讲的串起来,一个完整的云原生 DevOps 流程是这样的:
这个流程里,开发只管 git push,剩下的构建、测试、打包、部署、监控全自动。这就是 DevOps 的终极形态。
DevOps 不是买个工具装上就完事——它是一场组织 + 流程 + 工具的三层变革。下面是一个务实的落地路径。
Git 规范、分支策略、代码评审
自动构建、自动测试、质量门禁
自动部署、环境管理、发布策略
监控告警、效能度量、持续改进
v1.2.3 而不是 final_final_v2| 环节 | 开源/免费 | 云服务 |
|---|---|---|
| 代码托管 | Gitea、GitLab CE | GitHub、GitLab、Gitee |
| CI/CD | Jenkins、Drone | GitHub Actions、GitLab CI、Zadig |
| 容器 | Docker、containerd | 各云容器服务 |
| 编排 | Kubernetes(自建) | TKE、ACK、EKS、GKE |
| 镜像仓库 | Harbor | ACR、TCR、ECR |
| IaC | Terraform、Ansible | 云厂商资源编排 |
| 监控 | Prometheus + Grafana | 各云监控 |
| 日志 | ELK / Loki | 各云日志服务 |
| 告警通知 | AlertManager | 飞书/钉钉/企微机器人 |
分钟级发布,告别漫长等待
自动化测试防止回归
小步快跑 + 快速回滚
开发运维共担责任
DevOps 是让软件交付"又快又稳又不出事"的一整套打法
工具是手段,协作文化才是灵魂