ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

蓝鲸PaaS release_controller发布控制器深度解析:部署编排核心源码

蓝鲸PaaS release_controller发布控制器深度解析:部署编排核心源码 蓝鲸PaaS release_controller发布控制器深度解析部署编排核心源码【免费下载链接】blueking-paas蓝鲸智云 PaaS 平台是一个开放式的开发平台让开发者可以方便快捷地创建、开发、部署和管理 SaaS 应用。它提供了完善的前后台开发框架、服务总线ESB、API Gateway、调度引擎、公共组件 等服务。旨在帮助用户快速、低成本的构建免运维运营系统与支撑工具。项目地址: https://gitcode.com/GitHub_Trending/bl/blueking-paas蓝鲸智云 PaaS 平台BlueKing PaaS是一个开放式的 SaaS 应用开发部署平台而release_controller正是它应用发布流程的核心编排模块——每当你在平台上点击发布预发布 Hook 的执行、状态流转、日志追踪背后都由这套代码驱动。本文面向新手用最少的代码带你读懂这个模块的目录结构、核心数据模型与一次完整的发布执行链路。一、发布控制器在蓝鲸PaaS中的位置在上图中可以看到Webfe 前端与 bkpaas-cli 都通过 REST API 访问 ApiServerApiServer 再向应用集群下发应用构建、部署指令由 operator 和蓝鲸应用完成最终落地。release_controller就位于 ApiServer 源码内模块入口在apiserver/paasng/paas_wl/workloads/release_controller/它回答三个问题发布时先跑什么—— 预发布 Hookpre-release-hook即部署前执行的自定义命令Hook 以什么身份运行—— 一个restartPolicy: Never的一次性 Pod如何知道成败—— 通过状态机 日志流 退出码追踪到底。二、模块目录结构速览新手从这里入手release_controller的每个文件职责都很单一建议按此顺序阅读文件职责constants.py定义运行时类型与镜像拉取策略枚举entities.py容器运行时规格ContainerRuntimeSpechooks/models.py数据库模型Command发布指令的账本hooks/kres_entities.pyK8s 实体Command数据库对象到 Pod 的映射hooks/kres_slzs.py序列化/反序列化器负责生成与解析 Pod 清单hooks/entities.pyCommandTemplate指令模板 命名小贴士文件名中的kres是 Kubernetes Resource 的缩写slzs即 serializer/deserializer 的缩写看到这类文件名就知道它是K8s 资源读写层。1️⃣ 两个关键枚举RuntimeType 与 ImagePullPolicyconstants.py 定义了发布世界的两套语言RuntimeType应用的构建运行方式包括buildpackBuildpack 构建、dockerfileDockerfile 构建、custom_image自定义镜像、bk-smart智能构建四种ImagePullPolicy镜像拉取策略Always/IfNotPresent/Never与 K8s 概念一一对应。2️⃣ ContainerRuntimeSpec容器运行规格entities.py 中的ContainerRuntimeSpec数据类把一个容器怎么跑浓缩为六个字段镜像、启动命令、参数、环境变量、拉取策略、资源配额。它是 Hook Pod 和后续构建模板的共同语言——理解了它就理解了蓝鲸PaaS部署发布的最小原子单位。三、发布指令 Command 的三层结构这是本模块最值得新手学习的设计同一份发布指令在三个层次各有一个表示。1️⃣ 数据库层Command 模型持久化账本hooks/models.py 中的Command模型记录了指令的完整生命周期关键字段包括version同类型指令的版本号每次发布递增CommandManager.new会自动 1status/exit_code指令状态与容器退出码logs_was_ready_atPod 就绪、可以开始读日志的时刻int_requested_at用户请求中断的时刻用于区分被人为终止和执行失败。CommandManager.new方法还负责继承上一次发布的环境变量与配置保证 Hook 环境与正式环境一致。2️⃣ K8s 实体层把数据库对象变成 Podhooks/kres_entities.py 中的CommandK8s 实体是内外部翻译官from_db_obj数据库对象 → K8s 实体组装镜像、入口点、节点选择器、容忍度等调度信息主容器名按约定与 Pod 同名见 hooks/entities.py 的CommandKubeAdaptor预发布 Hook 的 Pod 名固定为pre-release-hookpk、type、version等字段写入 Pod annotations实现双向追溯。3️⃣ 序列化层Pod 清单的生成与解析hooks/kres_slzs.py 提供一对序列化器CommandSerializer.serialize把 K8s 实体渲染成标准 Pod 清单注意restartPolicy: Never——Hook 是一次性任务失败不会原地重启而是由上层决定成败CommandDeserializer.deserialize反向从集群中的 Pod 解析出运行时状态phase、退出码、失败原因供轮询逻辑消费。四、一次发布的完整执行链路编排的总指挥在 bk_app/deploy/actions/exec.py 的AppCommandExecutor.perform方法中流程可以概括为六步步骤动作状态变化①校验指令必须处于 PENDING防重复执行→ SCHEDULED②command_handler.run创建 Hook Pod集群中生成 Pod③等待日志可读最长 300 秒标记 logs_was_ready④实时跟随日志输出到前端部署流用户看到滚动日志⑤等待 Pod 进入 Succeeded超时 60 秒→ SUCCESSFUL⑥finally中删除 Hook Pod清理现场无论成败必清理异常处理同样细致值得新手参考ResourceDuplicate上一个 Hook 还没退出提示稍后再试ReadTargetStatusTimeout解析 Pod 健康状态给出具体失败原因PodNotSucceededError结合int_requested_at区分用户主动中断INTERRUPTED与真正失败FAILED。Pod 的创建、等待、日志读取等操作由 bk_app/deploy/app_res/controllers.py 中的CommandHandler封装完成与release_controller提供的实体层解耦——这正是模块边界清晰的体现。五、新手阅读源码的推荐路径从 constants.py 认识发布世界的两种方言读 entities.py 掌握容器运行规格按模型 → 实体 → 序列化器的顺序通读 hooks/ 目录理解三层结构如何衔接最后站在 exec.py 的全局视角看执行编排与状态机结合单元测试加深理解例如 tests/paas_wl/bk_app/deploy/actions/test_exec.py。总结release_controller模块体量不大却完整展示了企业级 PaaS 发布系统的典型设计数据库模型做账本、K8s 实体做翻译、序列化器做渲染、状态机做编排。读懂它你就掌握了蓝鲸PaaS部署发布的核心骨架也为继续深入 bk_app/deploy/ 下的构建、发布全流程打下了坚实基础。【免费下载链接】blueking-paas蓝鲸智云 PaaS 平台是一个开放式的开发平台让开发者可以方便快捷地创建、开发、部署和管理 SaaS 应用。它提供了完善的前后台开发框架、服务总线ESB、API Gateway、调度引擎、公共组件 等服务。旨在帮助用户快速、低成本的构建免运维运营系统与支撑工具。项目地址: https://gitcode.com/GitHub_Trending/bl/blueking-paas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表