当前位置:首页 > 问答 > 正文

用 Kubernetes 搭建的 PaaS 平台 Porter,聊聊它到底是怎么驱动整个系统的

主要参考了 Porter 官方文档、GitHub 仓库的说明以及部分技术博客对其架构的解读)

Porter 是一个基于 Kubernetes 构建的云原生 PaaS(平台即服务)系统,你可以把它想象成一个非常智能的“总管家”,它的核心任务就是让开发人员完全感觉不到 Kubernetes 的复杂存在,开发人员只需要关心一件事:把我的代码和配置告诉 Porter,它就应该能帮我搞定应用的部署、上线和日常管理,这个“总管家”到底是怎么在背后驱动整个系统的呢?我们来一步步拆解。

Porter 自己就是 Kubernetes 的一个“大号应用”,它被设计成一系列微服务,这些微服务本身也是运行在 Kubernetes 集群上的,这就像是一个高级经理,他不仅管理着一个大公司,而且他自己的办公桌和团队也在这个公司里,这样做的好处是,Porter 能够深度融入 Kubernetes 的环境,利用 Kubernetes 自身的强大能力来管理其他应用。

当一位开发人员通过 Porter 的网页界面或者命令行工具想要部署一个应用时,Porter 的“驱动”过程就开始了,这个过程可以粗略分为几个阶段:

第一阶段:接收指令和“翻译”

开发者在 Porter 的界面上点击“创建应用”,填写应用名称、选择要部署的代码仓库(GitHub 上的一个项目),可能还会设置一下环境变量、需要多大的内存和 CPU 等,这些信息对于开发者来说是非常直观的。

但 Kubernetes 看不懂这些,Kubernetes 只认识一种叫做“YAML”的配置文件,里面用非常技术化的语言定义了各种资源对象,Pod(一个或多个紧密相关的容器)、Service(网络服务)、Ingress(外部访问入口)等等。

这时候,Porter 就扮演了“翻译官”的角色,它内部有一个核心组件(通常称为控制器或 Operator),会根据开发者提供的简单信息,自动生成一大套复杂的、符合 Kubernetes 规范的 YAML 配置文件,它会把“我需要一个能运行 PHP 的应用”这样的需求,翻译成“创建一个包含 PHP 镜像的 Deployment,一个对应端口的 Service,以及一个配置了正确域名的 Ingress”。

第二阶段:分派任务和“调度”

“翻译”好指令之后,Porter 并不会自己动手去干活,它真正的力量在于“借力打力”,它会通过一个叫做“kube-apiserver”的关口,把这些生成好的 YAML 配置文件提交给 Kubernetes 集群的大脑。

就轮到 Kubernetes 的核心组件上场表演了,Kubernetes 的调度器会智能地选择一个最合适的服务器节点来运行这个应用;节点上的 kubelet 服务会负责从镜像仓库拉取应用代码打包好的镜像,并启动容器;网络插件会自动配置好网络规则,让应用可以被内部或外部访问。

在整个过程中,Porter 并不直接参与这些底层的、繁琐的操作,它只是下达了一个清晰的命令,然后就像监工一样,持续不断地通过 kube-apiserver 询问 Kubernetes:“我让你部署的那个应用,现在怎么样了?启动成功了吗?健康吗?” 这个过程在 Kubernetes 中被称为“调和循环”,Porter 会确保实际情况始终符合用户的期望状态。

第三阶段:持续监控和“兜底”

应用运行起来之后,Porter 的工作并没有结束,它提供了监控日志的功能,这里它又一次利用了 Kubernetes 的生态,Porter 通常会集成像 Prometheus 这样的监控工具和 Loki 或 Elasticsearch 这样的日志工具,它本身可能不直接存储和计算监控数据,但它会帮你一键部署这些监控栈,并在界面上提供一个统一的视图,让你方便地查看应用的 CPU 使用率、内存消耗以及实时日志。

更重要的是,Porter 驱动着系统的“自愈”能力,如果突然有一台服务器宕机了,上面运行的应用实例挂掉了,Kubernetes 会立刻检测到这一点,它会把情况报告给 Porter,而 Porter 的控制器会马上意识到:“不对,现在运行的实例数量少于用户要求的数量。” 它会立刻再次通过 kube-apiserver 向 Kubernetes 发出指令:“再启动一个实例,补上缺额!” 这一切都是自动发生的,无需开发人员任何干预。

总结一下

Porter 驱动整个系统的核心逻辑可以概括为:它作为一个友好的用户交互层,将用户简单的操作意图“翻译”成 Kubernetes 能听懂的“语言”,然后完全依托和信赖 Kubernetes 这个强大的底层引擎去执行具体的运维任务,同时持续监控执行结果,确保一切符合预期。 它把 Kubernetes 的复杂性封装了起来,把容器编排、服务发现、自动扩缩容、故障自愈等高级能力,变成了一种开发者触手可及的、简单的服务,这就是一个基于 Kubernetes 的 PaaS 平台最根本的驱动方式。

用 Kubernetes 搭建的 PaaS 平台 Porter,聊聊它到底是怎么驱动整个系统的