K8s 云原生架构实战:从单体到微服务的演进

记录一次完整的云原生迁移过程,涵盖容器化、服务发现、CI/CD 流水线搭建,以及踩过的坑和最佳实践。

5

为什么迁移到云原生?

  • 弹性伸缩:流量高峰自动扩容,闲时缩容省钱
  • 故障隔离:单个服务崩溃不影响全局
  • 发布效率:从手动部署到 GitOps,发布从小时级降到分钟级

架构全景

1
2
3
4
5
6
7
8
9
┌─────────────────────────────────────────┐
│              Ingress (Nginx)            │
├─────────────────────────────────────────┤
│  API Gateway → 服务网格 (Istio)         │
├────────┬────────┬────────┬──────────────┤
│ 用户服务 │ 订单服务 │ 支付服务 │ 消息服务      │
├────────┴────────┴────────┴──────────────┤
│           持久层 (PostgreSQL + Redis)    │
└─────────────────────────────────────────┘

关键决策

1. Helm vs Kustomize

最终选了 Kustomize —— 轻量、无需额外学习 Helm 模板语法,K8s 1.14+ 原生支持。

2. 服务网格要不要上?

初期没上 Istio,用 K8s Service + Ingress 足够。服务网格在微服务数量超过 20 个时才体现价值。

3. 可观测性三板斧

  • 日志:Loki + Promtail(比 ELK 轻量 10 倍)
  • 指标:Prometheus + Grafana
  • 追踪:Jaeger(分布式链路追踪)

踩坑

  • imagePullPolicy: IfNotPresent 没设,每次都拉镜像,慢得离谱
  • 资源限制没设,一个服务吃光节点内存
  • Health Check 没配,滚动更新直接断流

📝 完整 YAML 配置清单和部署脚本已整理,后续开源。

广告
广告位预留中 (728x90)