主题
面试题深度详解:架构设计与综合(5 题 + 系统设计方法论)
覆盖高可用架构、多集群管理、Service Mesh、微服务迁移、系统设计方法论。
Q46: 如何设计一个高可用的 K8s 平台
答题思路
这是系统设计题,需要从控制平面、数据平面、流量入口、存储四个层面设计高可用架构。技术原理深度剖析
高可用 K8s 平台架构:
┌─────────────────────────────────────────────────┐
│ 流量入口层 │
│ 云厂商 LB(多 AZ)→ Ingress/Gateway API(HPA) │
│ DNS 多活(Route53/AlibabaDNS 加权) │
└───────────────────────┬─────────────────────────┘
│
┌───────────────────────▼─────────────────────────┐
│ 控制平面层 │
│ etcd 3/5 节点(跨 AZ,NVMe SSD) │
│ apiserver 3+ 实例(前置 LB) │
│ controller-manager/scheduler(Leader Election) │
└───────────────────────┬─────────────────────────┘
│
┌───────────────────────▼─────────────────────────┐
│ 数据平面层 │
│ 多 AZ 节点池(每 AZ 至少 3 节点) │
│ Pod Anti-Affinity(跨 AZ 分布) │
│ Cluster Autoscaler(按需扩容) │
│ PDB(限制同时驱逐数量) │
└───────────────────────┬─────────────────────────┘
│
┌───────────────────────▼─────────────────────────┐
│ 存储层 │
│ 分布式存储(Ceph/Longhorn,跨 AZ 复制) │
│ 数据库主从(跨 AZ,自动故障转移) │
│ etcd 定时快照(异地备份) │
└─────────────────────────────────────────────────┘
高可用关键指标:
RTO(恢复时间目标):< 5 分钟
RPO(恢复点目标):< 1 小时(取决于 etcd 快照频率)
可用性目标:99.95%(年停机 < 4.4 小时)三级参考答案
B 级:
高可用 K8s 平台需要:1) 控制平面多实例(etcd 3 节点 + apiserver 3 实例 + LB);2) 节点跨 AZ 分布;3) Pod Anti-Affinity 确保应用跨 AZ 部署;4) 负载均衡入口跨 AZ。
A 级:
完整高可用设计:1) 控制平面:etcd 5 节点跨 AZ + apiserver 3+ 实例 + 独立 LB;2) 数据平面:每 AZ 至少 3 节点 + PDB + Cluster Autoscaler;3) 流量入口:云厂商多 AZ LB + Gateway API + HPA;4) 存储:分布式存储跨 AZ 复制 + 数据库主从自动故障转移;5) DNS:多活 DNS 加权。
S 级:
企业级高可用:1) 多集群(每 AZ 一个集群,GSLB 流量分发);2) Karmada/Admiral 联邦管理;3) 灰度发布(Argo Rollouts);4) 混沌工程(Chaos Mesh 定期验证);5) 完整的 SLO/SLI 体系(错误预算驱动发布决策)。Trade-off:高可用 = 高成本,需要根据业务重要性选择合适的可用性级别(99.9% vs 99.99%)。
Q47: 多集群管理的方案和挑战
答题思路
从多集群的动机出发,对比不同管理方案。三级参考答案
B 级:
多集群管理的动机:1) 隔离(不同业务/团队/环境);2) 地域分布(低延迟);3) 合规要求(数据不出境)。方案:Karmada、Admiral、Cluster API。
A 级:
主要方案对比:1) Karmada(CNCF,声明式多集群编排,支持策略分发和故障迁移);2) Cluster API(声明式管理集群生命周期,创建/升级/删除集群);3) ArgoCD ApplicationSet(GitOps 多集群部署);4) Rancher(统一管理多集群的 UI)。挑战:跨集群网络互通、服务发现、配置一致性。
S 级:
企业级多集群:1) Karmada 负责策略分发和故障迁移(PropagationPolicy 控制资源分发到哪些集群);2) Cluster API 负责集群生命周期(MachineSet/MachineDeployment 管理节点);3) ArgoCD AppSet 负责应用部署;4) 跨集群服务发现:Submariner/Admiral(跨集群 Service 互通);5) 跨集群网络:Cilium Cluster Mesh(统一网络策略和负载均衡)。
Q48: Service Mesh 的原理和适用场景
答题思路
从 Service Mesh 解决的"东西向流量管理"问题出发,解释其架构和适用场景。三级参考答案
B 级:
Service Mesh 通过 Sidecar 代理(如 Envoy)拦截 Pod 间流量,实现 mTLS、流量管理、可观测性。常见实现:Istio、Linkerd、Cilium Service Mesh。
A 级:
Service Mesh 架构:数据平面(Sidecar 代理处理流量)+ 控制平面(管理配置分发)。功能:1) mTLS(服务间加密认证);2) 流量管理(灰度、熔断、重试);3) 可观测性(分布式追踪、流量可视化)。代价:延迟增加(Sidecar 跳板)、资源消耗增加(每个 Pod 多一个 Sidecar 容器)。
S 级:
适用场景:1) 微服务数量 > 20 个;2) 需要统一的服务治理(mTLS、限流、灰度);3) 多语言微服务(不需要每种语言实现服务治理 SDK)。不适用:1) 简单应用(<5 个服务);2) 对延迟极其敏感的场景。Ambient Mesh(Istio 1.15+)无 Sidecar,通过节点级代理(ztunnel)实现,减少资源消耗。Cilium Service Mesh 基于 eBPF,无需 Sidecar。
Q49: 如何将单体应用迁移到 K8s 微服务架构
答题思路
这是架构演进题,需要给出渐进式的迁移策略。三级参考答案
B 级:
迁移步骤:1) 容器化(Dockerfile);2) 部署到 K8s(Deployment + Service);3) 逐步拆分微服务(Strangler Fig 模式);4) 引入 Service Mesh 管理服务间通信。
A 级:
渐进式迁移:1) 先将单体应用容器化部署到 K8s(不拆服务);2) 使用数据库代理(如 ProxySQL)解耦数据层;3) Strangler Fig 模式:逐步将功能从单体中剥离为独立微服务,通过 API Gateway 路由新旧流量;4) 引入 CI/CD 和 GitOps 管理微服务部署。
S 级:
企业级迁移:1) 领域驱动设计(DDD)确定服务边界;2) 数据库拆分:共享数据库 → API 边界 → 独立数据库(最难的环节);3) 同步调用转异步(消息队列解耦);4) 可观测性先行(先建监控再拆服务);5) 团队组织调整(Conway's Law:服务架构要与团队结构对齐)。常见陷阱:过早微服务化(单体都没做好就想拆)、分布式事务问题(Saga 模式)、服务间调用链过长导致延迟。
Q50: 如何设计一个支持百万并发的 K8s 服务
答题思路
这是综合系统设计题,需要从入口到数据层全链路分析。三级参考答案
B 级:
关键要素:1) 多副本 + HPA 水平扩展;2) 高性能 Ingress Controller;3) 数据库读写分离 + 缓存;4) 异步处理(消息队列);5) CDN 和缓存层。
A 级:
全链路设计:1) 入口层:云厂商 LB + Gateway API + 多实例 Ingress Controller(HPA 到 10+ 副本);2) 应用层:无状态微服务 + HPA + VPA(Guaranteed QoS);3) 缓存层:Redis Cluster(K8s 上运行 + PDB);4) 数据层:MySQL 主从 + 读写分离 + 分库分表;5) 异步层:Kafka/RocketMQ 削峰填谷。
S 级:
极致性能:1) eBPF 网络(Cilium XDP 模式,绕过 iptables/IPVS);2) Gateway API + Envoy(连接池、HTTP/2 多路复用);3) 应用层:Go/Rust 高并发框架 + 协程池;4) 连接优化:Keep-Alive + gRPC streaming;5) 多级缓存:L1 本地缓存(BigCache)→ L2 Redis → L3 数据库;6) 限流熔断:Sentinel/Envoy rate limit;7) 压测验证:K6/Locust 模拟百万并发,逐步找到瓶颈。关键:不是"一个 Pod 扛百万并发",而是"百万并发分散到成百上千个 Pod"。
系统设计方法论(面试通用框架)
回答系统设计题的统一框架:
1. 澄清需求(2 分钟)
- 用户量?QPS 预估?读写比?
- 可用性要求?数据一致性要求?
- 成本限制?团队规模?
2. 粗略设计(5 分钟)
- 画出系统全景图
- 列出核心组件和数据流
- 估算资源需求(节点数、存储量、带宽)
3. 深入设计(10 分钟)
- 每个组件的详细设计
- 关键决策的 Trade-off 分析
- 故障场景和容错设计
4. 扩展讨论(3 分钟)
- 如何扩展(水平/垂直)?
- 如何监控和告警?
- 如何演进(未来需求)?
K8s 特有的设计考量:
- 无状态优先(Stateless > Stateful > DaemonSet)
- 声明式管理(YAML > kubectl create)
- 自愈设计(Liveness/Readiness/Startup Probe)
- 资源限制(requests/limits 必须设置)
- 优雅终止(preStop + grace period)
- 零停机部署(RollingUpdate + PDB)