2. PaaS架构设计:整体架构与分层设计
聊到PaaS平台架构,我习惯先画一张分层图。说白了,PaaS就是把底层基础设施的复杂性给屏蔽掉,让开发者只关心业务代码。你想想看,如果没有PaaS,每次部署都要自己搭Kubernetes、配网络、搞存储,那得多累?
我个人习惯把PaaS分成四层:基础设施层、容器编排层、应用服务层、开发者门户层。每一层都有明确的职责边界。嗯,这里要注意,层与层之间不能耦合太紧,否则后期维护会非常痛苦。
2.1 基础设施层:地基要稳
这一层是PaaS的物理基础。包括计算、存储、网络三大块。我在项目中遇到过,有些团队为了省钱,直接用裸金属服务器跑容器,结果网络性能惨不忍睹。
基础设施层的关键点:
- 计算资源:物理机或虚拟机,建议用标准化硬件
- 存储资源:分布式存储(Ceph、GlusterFS)或云盘
- 网络资源:VPC、负载均衡、DNS
2.2 容器编排层:PaaS的心脏
这一层是整个PaaS的核心。说白了,就是Kubernetes集群的管理层。我建议把Kubernetes的控制平面组件单独部署,不要跟业务节点混在一起。
容器编排层的关键组件:
| 组件 | 职责 | 我的经验 |
|---|---|---|
| API Server | 所有操作的入口,提供RESTful接口 | 一定要做限流,否则并发高时容易挂 |
| Scheduler | 负责Pod调度到合适的Node上 | 默认调度策略不一定适合你的场景 |
| Controller Manager | 维护集群状态,执行控制器逻辑 | 注意控制器的循环频率,别太频繁 |
| etcd | 分布式键值存储,保存集群状态 | etcd的磁盘IO性能直接影响集群稳定性 |
2.2.1 API Server:PaaS的守门员
API Server是PaaS平台唯一对外暴露的组件。所有操作——创建Pod、查询状态、删除资源——都得经过它。我个人习惯在API Server前面加一层网关,做认证、鉴权和限流。
为什么会这样?因为API Server本身没有认证能力,全靠插件。我曾经见过一个团队,API Server直接暴露在公网上,结果被人扫到了etcd的端口,数据全丢了。嗯,这是个血泪教训。
2.2.2 Scheduler:资源分配的决策者
Scheduler负责决定Pod跑在哪台机器上。默认的调度策略是轮询,但实际场景中,你可能需要自定义调度策略。比如,GPU节点要优先分配给AI训练任务。
我记得有一次,业务方反馈说Pod总是调度到同一台机器上,导致那台机器负载过高。查了半天,发现是Scheduler的节点亲和性配置写错了。你想想看,这种问题排查起来多费劲。
2.2.3 Controller Manager:集群的管家
Controller Manager里跑着各种控制器:Deployment Controller、ReplicaSet Controller、Node Controller等等。每个控制器都在不停地检查当前状态和期望状态是否一致。
这里有个坑:控制器的循环频率不能太快。我曾经把ReplicaSet Controller的同步间隔设成了100毫秒,结果集群CPU直接飙到90%。后来改成了5秒,一切正常。
2.2.4 etcd:集群的数据库
etcd存储了PaaS平台的所有状态信息。包括Pod的IP、Node的标签、ConfigMap的内容等等。etcd的性能直接决定了整个PaaS的稳定性。
2.3 应用服务层:开发者的工具箱
这一层提供各种中间件和服务:数据库、消息队列、缓存、日志收集、监控告警等等。说白了,就是让开发者不用自己搭这些基础设施。
应用服务层的设计原则:
- 标准化:所有中间件都用统一版本,避免兼容性问题
- 自动化:创建、扩容、备份都要自动化
- 可观测:每个服务都要有日志、指标和链路追踪
我在项目中遇到过,开发者自己装了个MySQL 5.7,但平台默认是8.0,结果数据迁移时出了大问题。后来我们强制统一版本,才避免了这种麻烦。
2.4 开发者门户层:用户的第一印象
这一层是开发者直接接触的界面。包括Web控制台、CLI工具、API文档等等。我建议门户层要做得简单易用,因为开发者没耐心看长篇大论的文档。
开发者门户层的关键功能:
- 项目管理:创建项目、管理成员、设置权限
- 应用管理:部署、回滚、扩缩容
- 日志查看:实时日志、历史日志搜索
- 监控告警:CPU、内存、网络、磁盘的实时监控
嗯,以上就是PaaS平台的整体架构和分层设计。下一章我们会深入聊聊容器编排层的具体实现,包括Kubernetes的安装、配置和调优。到时候我会分享一些我在生产环境踩过的坑,希望对你有帮助。