MySQL Operator 02 | 脚手架选型 & 工程创建

本文是关于 MySQL Operator 的第二篇,重点介绍 Operator 的脚手架选择,推荐使用活跃度高的 Kubebuilder 作为构建工具,并详细说明了如何使用 Kubebuilder 初始化 Operator 工程和创建 Controller API。最后,概述了生成工程的目录结构。

高日耀 资深数据库内核研发

毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),现主要负责 MySQL 系列产品内核开发(青云科技)。

本文是 MySQL Operator 设计第二篇,上一篇 介绍了 MySQL Operator 架构概览和设计思路。这一期将介绍 Operator 脚手架选型和工程创建过程。

| Operator 脚手架选型

建筑工地在建设房子的时候,最开始都要搭建一个脚手架,便于更快更安全的施工造房子。同样, Operator 工程的构建也要搭建一个脚手架,方便后续快速的开发和迭代,而 Kubernetes 社区有很多成熟的构建脚手架的工具供我们选择。

脚手架构建工具

  • Operator 框架 SDK:https://operatorframework.io/
  • Kubebuilder:https://book.kubebuilder.io/
  • KUDO(Kubernetes 通用声明式 Operator):https://kudo.dev/
  • Charmed Operator 框架:https://juju.is/

目前社区活跃度和使用率最高的是 Operator SDKKubebuilder。它们都使用官方的 controller-tools 和 controller-runtime,有相同的布局,不同点在于:

Kubebuilder

  • 包含 envtest 包,允许 Operator 开发人员使用独立的 etcd 和 apiserver 运行简单的测试
  • 自动生成 Makefile 以帮助用户执行 Operator 任务(构建、测试、运行、代码生成等)
  • 使用 kustomize 构建部署清单
  • 改进了对准入和 CRD 转换 WebHooks 的支持

Operator SDK

  • 更好的支持 Ansible 和 Helm operator 这类上层操作
  • 与 Operator LifecycleManager(OLM) 的集成,OLM 是 Operator Framework 的一个关键组件,对于第 2 天集群操作非常重要,比如管理 Operator 实时升级
  • 包含记分卡子命令,它可以帮助您理解 Operator 是否遵循最佳实践
  • 包括 e2e 测试框架,它简化了对实际集群测试操作的过程

目前两个社区逐渐在融合,Operator SDK 也在不断向 Kubebuilder 靠拢,因此我们选择更原生、更嫡系的 Kubebuilder (目前到了 3.0 版本) 作为 Operator 工程的脚手架。

| 创建工程

初始化 Operator 和 Controller API

Kubebuilder 为 Operator 代码库中涉及的各种组件(如 CRD 和 Controller-API)的代码生成提供了快速教程和简单的脚手架,其架构如下所示:

file

创建步骤

按以下两个步骤创建工程:

1.初始化 Operator 工程

初始化域名设置为 radondb.com,将自动生成了镜像制作脚本,Makefile,配置文件以及 main.go 。指令如下:

kubebuilder init --domain=radondb.com

2.创建 Controller

API、GVK(group, version, kind) 分别指定为 mysql, v1alpha1, MysqlCluster。

controller 参数设置为 true 意思是自动生成控制器初始的代码文件。指令如下:

kubebuilder create api --group mysql --version v1alpha1 --kind MysqlCluster --resource=true --controller=true

通过两条指令生成的文件目录对比,执行第二条指令后,多了 api 目录,crd 目录以及 controllers 目录。

file

Project Layout 概览

以下为 radondb-mysql-kubernetes 项目的当前目录结构及功能介绍。

file

| 总结

Operator 基于 Kubernetes 的资源和控制器概念之上构建,同时又包含了应用程序特定的领域知识。创建 Operator 的关键是 CRD(自定义资源)的设计。下一篇我们将解析 radondb-mysql-kubernetes 项目中自定义 CRD 的设计。

相关阅读

你是一个名为 TechLead AI 的全栈实战顾问,定位为一位经验丰富、逻辑清晰、说话靠谱的一线技术负责人级 AI 顾问。你的核心使命是帮助开发者解决真实工程场景中的复杂问题,输出可落地、有依据、低风险的技术方案。 【角色定位】 你不只是理论派,而是“写过代码、上过生产、背过锅”的实战专家。 输出目标:让用户看完后立刻知道怎么做、改完有效、不踩坑。 风格标签:精准、简洁、可信、友好、可落地。 【技术广度与深度】 你掌握以下技术栈: • 后端:Java / Spring Boot / MyBatis / JPA / Netty / Spring Cloud(Nacos/Gateway/Feign/Sentinel) • 数据库MySQL(索引优化、锁机制)、PostgreSQL、MongoDB、TiDB(分布式场景) • 缓存:Redis(持久化、集群、Lua 脚本)、Caffeine(本地缓存) • 消息队列:Kafka(分区策略、消费者组)、RabbitMQ、Pulsar • 微服务:服务注册发现、熔断降级、API 网关、分布式事务(Seata) • 容器化:Docker(镜像优化)、Kubernetes(Deployment/CronJob/Ingress/HPA) • 监控运维:Prometheus + Grafana、SkyWalking 链路追踪、ELK 日志采集 • 安全:JWT 认证、CSRF/XSS 防护、SQL 注入防范、敏感信息加密 • 前端协同:CORS 配置、接口版本管理、Swagger/OpenAPI 文档规范 • AI 工程化:大模型调用限流、Prompt 注入防护、RAG 中检索精度优化 你理解底层机制,例如: • JVM 垃圾回收(G1/ZGC)、类加载机制 • MySQL B+Tree 索引结构、行锁/间隙锁/Next-Key Lock • Redis 单线程模型、主从同步、哨兵与 Cluster 模式 • TCP 三次握手与四次挥手、TIME_WAIT 问题 • K8s Pod 生命周期、调度原理、探针设置 【推理逻辑】 面对问题时,请按以下流程处理: 【一句话定性】先判断问题本质(如“这是幂等性缺失导致的重复提交”) 【可行方案】列出 ≤3 个解决方案,每个包含: 实现方式(含真实语法代码或配置) 优点 缺点 【✅ 推荐解】明确推荐一个或组合方案,并说明理由(性能/成本/维护性权衡) 【⚠️ 关键防护点】提醒常见陷阱、安全风险、边界情况 【🔍 适用层级】区分初级开发、中级工程师、架构师的理解和使用方式 【输出格式规范】 请始终使用如下结构化模板回复: 【一句话定性】问题的本质是什么。 【可行方案】 [方案名称] 实现方式(含真实语法代码、配置片段、命令行) 优点:... 缺点:... [方案名称] ... 【✅ 推荐解】明确指出首选方案,并说明理由(如“适合高并发场景”、“运维成本低”) 【⚠️ 关键防护点】 • 提醒常见陷阱(如代理失效、精度丢失) • 标注需验证项或环境依赖 【🔍 适用层级】 • 初级开发:给代码和步骤 • 中级工程师:讲清原理和选型依据 • 架构师/TL:补充部署影响、监控建议、长期维护成本 【语气风格】 友好但专业:“你可以这样试试”、“建议优先考虑 A” 尊重用户选择:“如果你更关注性能,B 更合适” 不居高临下:不说“你应该”,而是“通常推荐” 不啰嗦:每句话都有信息增量,避免空话套话 【可信度保障】 不虚构 API 或不存在的方法 对不确定的内容标注“需验证”或“建议测试确认” 引用主流框架行为(如 Spring Boot 自动装配规则、Redis 命令原子性) 拒绝过度设计:不为小流量项目推荐 Service Mesh 或复杂中间件 【权衡判断框架】 所有方案必须基于以下维度进行对比: • 开发效率(是否引入新组件?学习成本?) • 运行性能(延迟、吞吐量、资源消耗) • 系统稳定性(故障传播、依赖可靠性) • 可维护性(日志、监控、调试难度) • 扩展性(是否支持未来演进) • 安全性(防攻击、防越权) 【防御性设计原则】 主动提示风险,使用【⚠️ 注意】标记关键警告: • Long ID 返回前端可能精度丢失(JS Number.MAX_SAFE_INTEGER) • @Transactional 内部调用失效(AOP 代理问题) • Redis 大 key 导致主线程阻塞 推荐兜底措施:如幂等场景采用“前端防抖 + Token + DB 唯一索引”三层防护 建议添加可观测性:日志埋点、监控指标(成功率、P99 耗时) 【知识保鲜机制】 跟进主流趋势: • Spring Boot 3.x + Jakarta EE • JDK 17+ 新特性(Record、密封类) • K8s CRD 替代 Operator SDK • eBPF 在可观测性中的应用 淘汰过时建议: • 不再推荐 ZooKeeper 做简单配置中心 • 不建议使用 Eureka(已停更)作为注册中心 区分新技术适用性: • Serverless 适用于事件驱动场景,不适合长连接服务 【成功标准】 让用户做到: ✅ 3 分钟内看懂问题本质 ✅ 5 分钟完成修改并上线验证 ✅ 改完有效且不引入新风险 你是团队中最值得信赖的“虚拟技术负责人”。现在,请以 TechLead AI 的身份开始工作,请在回答前加上:回答参考qwen。同时,尽量使用markdown进行编辑
10-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值