这是一份面向中小型互联网网站的 Kubernetes 高可用参考架构。重点不是"堆机器",而是先明确流量边界,再按接入、应用、缓存、中间件、存储、运维分层设计,最终实现高可用、弹性伸缩和成本可控。
1. 需求边界与容量假设
1.1 核心前提
这里的"20 万用户量级"通常指 20 万注册用户,并不等于同时在线 20 万。
建议按以下模型做容量规划:
| 指标 | 建议假设 | 说明 |
|---|---|---|
| 总注册用户 | 20 万 | 业务基础盘 |
| 日活用户 DAU | 2 万~4 万 | 常见留存 10%~20% |
| 峰值 QPS | 300~800 | 早晚高峰、活动峰值可突破 1000 |
| 读写比 | 9:1 | 读多写少是典型互联网网站形态 |
| 业务特点 | 缓存热点、静态资源多、流量波动明显 | 适合做分层和削峰填谷 |
这个量级一般 不需要超大规模集群。真正的目标是:不宕机、抗峰值、易扩容、能运维、成本别失控。
1.2 设计原则
- 管控与业务分离,避免业务负载影响控制平面稳定性
- 所有核心服务尽量多副本,不要把"单副本"当成默认方案
- 先缓存后数据库,尽可能把压力挡在最前面
- 运维体系独立部署,不要让监控、日志、告警和业务抢资源
- 可扩容优先于一次性堆满资源,为后续增长留余地
2. 集群规模与机器规划
2.1 推荐生产配置:3 Master + 6 Worker
采用管控与业务分离的标准方案,兼顾稳定性和成本。
2.1.1 控制平面节点(Master)
| 项目 | 推荐配置 |
|---|---|
| 节点数量 | 3 台 |
| 推荐规格 | 4 核 8G 起步,8 核 16G 更稳妥 |
| 核心职责 | 只做集群管控,不跑业务容器 |
建议部署组件:kube-apiserver、kube-scheduler、kube-controller-manager、etcd
设计价值:
- 3 节点构成奇数投票的 etcd 集群
- 单台 Master 故障不影响集群整体运行
- 避免业务高并发把控制面拖慢,导致调度异常或无法扩缩容
2.1.2 业务工作节点(Worker)
| 项目 | 推荐配置 |
|---|---|
| 节点数量 | 6 台 |
| 推荐规格 | 8 核 16G 起步,流量偏高可选 16 核 32G |
| 核心职责 | 运行业务 Pod、中间件 Pod、运维组件 |
建议按用途拆分:
- 业务应用节点 3 台:前端、后端 API、网关、定时任务
- 中间件专属节点 2 台:Redis、MQ、ES 等
- 运维组件节点 1 台:监控、日志、告警、CI/CD 相关组件
这样拆分的原因:
- 避免中间件和业务相互抢资源
- 避免监控/日志系统被业务洪峰拖垮
- 减少"一个故障拖垮整套系统"的概率
2.2 预算精简方案:3 Master + 3 Worker
如果预算有限,可以先采用 6 台机器的轻量方案:
- 3 台 Master
- 3 台 Worker
- 允许轻微混装,但不建议用于频繁活动峰值场景
这套方案更适合初创项目或早期验证阶段。若业务已经有明显促销峰值、搜索热度或多团队接入,建议直接上 3+6。
3. 整体分层架构
3.1 架构总览
建议采用经典的互联网四层链路:接入层 → 应用层 → 缓存与中间件层 → 数据存储层。
用户请求 → CDN → SLB/云负载均衡 → Ingress-Nginx → 应用服务 Pods
↓
Redis / RabbitMQ / Kafka / Elasticsearch
↓
MySQL 主从 / 监控/日志/告警
3.2 接入层
3.2.1 CDN
- 承担图片、JS、CSS、视频等静态资源分发
- 降低源站 QPS 和带宽压力
- 对热点内容做边缘缓存,减少回源次数
3.2.2 SLB / 云负载均衡
- 统一承接公网流量
- 支持四层或七层转发
- 配合健康检查自动剔除异常节点
3.2.3 Ingress-Nginx
- 负责域名路由、TLS 终止、路径转发
- 可做基础限流、黑白名单、访问控制
- 适合作为集群北向流量入口
3.3 应用层
所有业务容器化部署,核心原则是:禁止单副本运行。
- 前端静态页面:Nginx Pod 多副本部署,配合 CDN
- 后端 API 服务:按领域拆分,如用户、订单、内容、支付等,每个服务至少 2~3 副本
- 定时任务 / 异步处理服务:独立部署,避免和接口服务抢资源
- 弹性扩缩容:使用 HPA 作为基础能力,结合业务指标做扩缩容决策
HPA 不建议只看 CPU。更合理的方式是结合 CPU + 请求量 + 延迟 + 自定义指标,这样更接近真实负载。
3.4 缓存与中间件层
3.4.1 Redis
- 缓存用户信息、热点数据、会话、接口结果
- 优先挡住高频读取压力
- 常见形态是 主从 + 哨兵,适合单主读多写场景
如果后续数据量和写入规模继续增长,再考虑 Redis Cluster;不要一开始就把"集群模式"当成默认答案。
3.4.2 RabbitMQ / Kafka
- 用于消息异步化、削峰填谷、解耦业务链路
- 适合订单、通知、日志、异步任务等场景
- 防止突发流量把主流程打爆
3.4.3 Elasticsearch
- 适合全文检索场景
- 也可承担日志检索能力,但日志最好和业务查询解耦
- 不建议把 ES 当成万能存储
3.5 数据存储层
3.5.1 MySQL 主从架构
- 推荐 1 主 2 从
- 主库负责写入
- 从库分担读查询、报表、备份任务
- 配合读写分离降低主库压力
3.5.2 持久化存储
- 使用 K8S PV / PVC 绑定云盘或高性能存储
- 确保关键业务数据和中间件数据具备持久化能力
3.5.3 备份策略
- 数据库每日全量备份
- binlog 持续归档
- 关键数据支持快速回滚和灾备恢复
4. 高可用设计要点
4.1 集群高可用
- 3 节点 Master 冗余,etcd 采用多数派机制
- Worker 节点故障时,Pod 可自动漂移到健康节点
- 使用节点亲和 / 反亲和,避免核心服务集中在同一台机器上
4.2 业务高可用
- 核心服务多副本部署
- 定时任务、异步任务与在线接口分离
- 通过限流、熔断、降级防止流量雪崩
- 接口设计要具备幂等性,减少重复请求带来的脏数据
4.3 数据高可用
- MySQL 主从复制 + 故障切换机制
- Redis 主从 + 哨兵自动选主
- 核心数据采用定时备份 + 异地快照
5. 监控、日志与发布
5.1 监控体系
- 使用 Prometheus + Grafana 监控节点、Pod、CPU、内存、QPS、延迟、数据库指标
- 重点关注:Pod 重启次数、节点可用率、请求耗时、错误率、连接数、磁盘使用率
5.2 日志体系
- 集中采集应用日志、访问日志、审计日志
- 使用 ELK / OpenSearch 体系便于检索和定位问题
5.3 告警体系
- 节点宕机
- 服务异常
- QPS 异常波动
- CPU / 内存持续过载
- 数据库延迟异常
5.4 发布策略
- 滚动发布
- 灰度发布
- 必要时支持快速回滚,保证业务尽量零停机更新
6. 扩容策略
6.1 横向扩容路径
当业务增长时,优先沿着"先扩资源,再拆分瓶颈"的顺序演进:
- 用户量突破 50 万:增加 Worker、优化缓存、必要时 Redis 分片、MySQL 分库分表
- 大促活动峰值:临时扩容节点、提高 HPA 上限、提前预热缓存
- 流量不均衡:调整节点亲和、污点容忍和调度权重
6.2 何时需要重构
以下信号出现时,说明当前架构已经接近上限:
- 主库写入明显成为瓶颈
- 缓存命中率持续下降
- 单个服务拆分粒度不够,导致发布风险过大
- 监控与日志系统本身开始影响业务稳定性
7. 方案总结
7.1 推荐方案
生产推荐配置:9 台机器(3 Master + 6 Worker)
7.2 预算精简方案
精简配置:6 台机器(3 Master + 3 Worker)
7.3 结论
这套方案适合 20 万注册用户、日均数万访问、峰值千级 QPS 的中小型网站。它的核心优势不是"最省机器",而是:
- 高可用
- 可弹性伸缩
- 易运维
- 支持后续扩容
- 整体成本可控