Skip to content

云原生概念:容器、微服务、不可变基础设施、声明式 API

「云原生」——这个词你一定听过无数遍了。但它到底是什么意思?为什么所有云厂商都在提它?

云原生不是「把应用跑在云服务器上」这么简单。它是一套完整的技术体系和文化理念,代表了构建和运行软件的新方式。

云原生的四个核心特征

CNCF(云原生计算基金会)对云原生的定义包含四个核心特征:

┌─────────────────────────────────────────────────────────────┐
│                     云原生四要素                            │
│                                                             │
│  ┌─────────────┐  ┌─────────────┐                         │
│  │   容器化     │  │   微服务     │                        │
│  │  Container   │  │  Microservice │                       │
│  └─────────────┘  └─────────────┘                         │
│                                                             │
│  ┌─────────────┐  ┌─────────────┐                         │
│  │ 不可变基础  │  │  声明式 API  │                        │
│  │   设施      │  │Declarative API│                        │
│  └─────────────┘  └─────────────┘                         │
└─────────────────────────────────────────────────────────────┘

1. 容器化:标准化的打包格式

容器把应用及其所有依赖打包成一个标准化的镜像。无论在开发机、测试环境还是生产环境,这个镜像都是完全一致的。

这解决了「在我机器上能跑」的古老难题——Docker 解决了环境不一致的问题,K8s 解决了容器编排的问题

dockerfile
# 前后对比:没有容器化 vs 容器化
# 传统部署:应用 + JDK + 配置文件 + 系统依赖 ← 在不同机器上可能不一致
# 容器部署:一个镜像 = 应用 + JDK + 配置文件 + 依赖 ← 处处一致

2. 微服务:拆分与自治

微服务把一个巨大的单体应用拆分成一组小型、独立的服务,每个服务运行在自己的进程中,围绕业务能力组织,可以独立部署、独立扩展、独立演进。

对比维度单体架构微服务架构
部署整体部署独立部署
扩展整体扩展按需扩展
故障隔离一挂全挂单服务故障不影响其他
技术选型统一每个服务独立
团队协作强耦合自治团队
复杂度初期低,后期高初期高,后期可控

微服务不是银弹——它解决了组织扩展性问题(大型团队如何高效协作),但引入了分布式系统的复杂度(服务间通信、分布式事务、服务治理)。

3. 不可变基础设施:重建而非修改

传统运维思维是「修改」——服务器出问题了,登上去改配置、打补丁。不可变基础设施的思维是「重建」——任何变更都通过重新构建来实现,不修改任何正在运行的实例。

传统思维(可变基础设施):
  服务器 → 修改配置 → 重新加载服务 → 配置漂移问题
  问题:修改历史不可追溯,服务器之间配置不一致

不可变基础设施:
  服务器配置(代码) → 构建镜像 → 部署新实例 → 销毁旧实例
  优势:任何变更都有版本历史,所有实例完全一致

在 K8s 中,这意味着:

  • 不直接 kubectl exec 进容器修改配置
  • 配置通过 ConfigMap/Secret 注入,不修改容器
  • 镜像更新通过滚动部署实现,不修改已有 Pod

4. 声明式 API:描述目标,而非过程

传统运维是指令式的:「先做 A,再做 B,然后检查 C」。声明式 API 是:「我想要的状态是 X,你负责让它达到 X」。

yaml
# 声明式:告诉 K8s 你想要什么
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
# K8s 负责达成这个目标:
# → 发现只有 2 个 Pod → 自动创建第 3 个
# → 发现有 Pod 挂了 → 自动重新调度
# → 发现有节点挂了 → 自动迁移 Pod 到其他节点

声明式 API 的核心优势是自愈幂等——系统会自动消除实际状态和期望状态之间的差异。

云原生的技术生态

容器运行时层
  └── containerd / cri-o / Docker

容器编排层
  └── Kubernetes(事实标准)

服务网格层
  └── Istio / Linkerd / Envoy

可观测性层
  └── Prometheus + Grafana(监控)
      ELK / Loki(日志)
      Jaeger / Zipkin(链路追踪)

CI/CD 层
  └── ArgoCD / Tekton / GitHub Actions

服务治理层
  └── Spring Cloud / gRPC / OpenTelemetry

云原生落地的常见误区

误区一:微服务就是越小越好

很多团队把微服务拆成了「纳米服务」——一个用户登录拆成 5 个服务,一个订单查询拆成 10 个服务。结果是:调用链爆炸、延迟增加、运维成本翻倍。

正确的做法:按业务边界拆分,按团队规模验证(两个披萨原则)。如果拆分后反而更复杂,说明拆分粒度不对。

误区二:上 K8s 就是云原生

K8s 是云原生的重要基础设施,但上了 K8s 不等于云原生。如果只是把原来的应用原封不动地搬到 K8s 里,继续用虚拟机时代的思维方式管理它,并没有真正发挥云原生的价值。

真正的云原生改造:

  • 12-Factor App:配置外部化、无状态、日志结构化
  • 容器化:镜像构建标准化、镜像大小优化
  • 可观测性:指标 + 日志 + 链路追踪
  • 自动化:CI/CD 全流程自动化

误区三:全面推翻重来

很多团队对云原生趋之若鹜,试图一次性把整个系统全部云原生化。结果:

  • 迁移周期太长,业务价值迟迟无法交付
  • 团队学习曲线陡峭,踩坑无数
  • 遇到问题后无法回滚

正确的做法:Strangler Fig 模式——新旧系统并行,逐步将流量从旧系统迁移到新系统,而不是一刀切。

云原生时代的 DevOps

云原生改变了 DevOps 的含义:

传统 DevOps:
  Dev(开发) ←→ Ops(运维)
  边界:Dev 交付代码,Ops 负责部署

云原生 DevOps:
  开发者全流程负责
  代码 → 容器镜像 → 部署配置 → 监控告警 → 扩缩容
  Dev 和 Ops 的边界变成了:
  - 开发者负责:代码 + 镜像 + Helm Chart + 监控配置
  - SRE/平台负责:集群、网络、存储、安全基线

面试追问方向

  • 云原生的四个特征中,哪个是你认为最核心的?为什么?
  • 12-Factor App 是云原生应用的黄金标准,说说你熟悉的框架是怎么实践这些原则的?
  • 微服务拆分有哪些维度?CQRS 和 DDD 在微服务设计中扮演什么角色?
  • 为什么说 Kubernetes 是云原生时代的操作系统?

云原生不是一个技术标准,而是一种做事方式。理解它的核心理念,比记住某个框架的 API 重要得多。

基于 VitePress 构建