从零开始构建Kubernetes Operator:一个完整的深度学习训练任务管理方案

    • 一、引言
    • 二、为什么需要Operator?
      • 1. Controller vs Operator:本质区别
      • 2. 有状态服务 vs 无状态服务的挑战
    • 三、项目架构设计
      • 3.1整体架构图
      • 3.2核心组件
    • 4.核心实现解析
      • 1. CRD定义 - 声明式API设计
      • 2. Controller实现 - 调和循环核心
      • 3. GPU资源调度 - 智能资源管理
    • 五、实际使用场景
      • 场景1:简单训练任务
      • 场景2:分布式多GPU训练
    • 六、开发经验分享
      • 1. 项目结构设计
      • 2. 开发工具链
      • 3. 调试技巧
    • 七、部署和使用
      • 快速部署
      • 八、监控和管理
    • 九、项目亮点
      • 1. 完整的生产就绪特性
      • 2. 丰富的使用示例
      • 3. 完善的文档
    • 十、技术收获
      • 1. Kubernetes扩展开发
      • 2. Go语言实践
      • 3. 运维自动化
    • 十一、下一步计划

作者: mmwei3
邮箱: 1300042631@qq.com / mmwei3@iflytek.com
日期: 2025年08月16日
项目地址: GitHub - PyJob Operator
CSDN博客: 从零开始构建Kubernetes Operator

一、引言

在云原生时代,Kubernetes已经成为容器编排的事实标准。然而,当我们面临复杂的业务场景,特别是需要管理有状态服务时,原生的Kubernetes资源往往显得力不从心。今天,我将分享如何从零开始构建一个完整的Kubernetes Operator,用于管理深度学习训练任务。

这个PyJob Operator项目是一个完整的、生产就绪的Kubernetes Operator实现,它不仅展示了Operator开发的最佳实践,还提供了丰富的示例和详细的文档。无论是学习Kubernetes Operator开发,还是作为实际项目的起点,都具有很高的价值。可以帮助SRE和运维开发工程师们在运维的海洋里尽情扩展定制。这也是我入手的第一个operator实现,给我带来了很大的启发,也是因为这个我学习了contorller和operator的区别以及理解有状态和无状态的区别,包括哪些适合daemonset,不需要早轮子,哪些是需要定制开发的场景,如果你也刚好接触operator可以一起交流,1300042631@qq.com。
这个operator的开发和2022年时在云计算研究院二次开发openstack-nova/cinder/ironic组件还是不太一样的,不过都能学习到很多优秀的逻辑和思维以及异常处理,我认为思想非常重要,因为思想决定目标。

二、为什么需要Operator?

1. Controller vs Operator:本质区别

在深入开发之前,我们需要理解Controller和Operator的核心区别:

Controller(控制器)

  • 管理单一资源类型的基础生命周期
  • 通过调和循环确保实际状态向期望状态收敛
  • 适用于无状态服务的简单场景

Operator(操作器)

  • 封装复杂应用的自动化运维逻辑
  • 将运维专家的知识编码到Kubernetes中
  • 特别适合有状态服务的复杂场景

2. 有状态服务 vs 无状态服务的挑战

无状态服务

# 使用Deployment管理,Pod可以随意调度/重建
apiVersion: apps/v1
kind: Deployment
spec:replicas: 3template:spec:containers:- name: nginximage: nginx:1.20

有状态服务(如训练任务):

  • 需要GPU资源调度
  • 需要持久化存储
  • 需要状态监控和故障恢复
  • 需要复杂的生命周期管理

这就是为什么我们需要Operator的原因!

三、项目架构设计

3.1整体架构图

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   PyJob CRD     │───▶│  PyJob Controller│───▶│  Kubernetes Job │
└─────────────────┘    └──────────────────┘    └─────────────────┘│                        │                        │▼                        ▼                        ▼
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   User Input    │    │  Reconcile Loop  │    │   Pod Creation  │
└─────────────────┘    └──────────────────┘    └─────────────────┘

在这里插入图片描述

3.2核心组件

  1. PyJob CRD:自定义资源定义,描述训练任务的期望状态
  2. PyJob Controller:控制器,负责调和实际状态和期望状态
  3. Kubernetes Job:底层Kubernetes资源,实际执行训练任务
  4. PersistentVolumeClaim:持久化存储,存储数据和模型

4.核心实现解析

1. CRD定义 - 声明式API设计

// PyJobSpec 定义用户期望的任务配置
type PyJobSpec struct {Image   string   `json:"image"`           // 训练镜像Command []string `json:"command"`         // 执行命令GPU     int32    `json:"gpu"`             // GPU数量DatasetPath string `json:"datasetPath"`   // 数据集路径OutputPath string `json:"outputPath"`     // 输出路径Resources *ResourceRequirements `json:"resources"` // 资源限制
}// PyJobStatus 记录任务状态
type PyJobStatus struct {Phase   string `json:"phase"`             // 任务阶段Message string `json:"message"`           // 状态信息StartTime *metav1.Time `json:"startTime"` // 开始时间CompletionTime *metav1.Time `json:"completionTime"` // 完成时间
}

2. Controller实现 - 调和循环核心

func (r *PyJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {// 1. 获取PyJob实例var pyjob trainingv1.PyJobif err := r.Get(ctx, req.NamespacedName, &pyjob); err != nil {return ctrl.Result{}, err}// 2. 检查是否需要创建JobjobName := fmt.Sprintf("%s-job", pyjob.Name)var job batchv1.Joberr := r.Get(ctx, types.NamespacedName{Name: jobName, Namespace: pyjob.Namespace}, &job)if err != nil && errors.IsNotFound(err) {// 3. 创建新的Jobif err := r.createJob(ctx, &pyjob, jobName); err != nil {return ctrl.Result{}, err}// 4. 更新状态pyjob.Status.Phase = "Running"r.Status().Update(ctx, &pyjob)}// 5. 监控Job状态并更新PyJobreturn r.updatePyJobStatus(ctx, &pyjob, &job)
}

3. GPU资源调度 - 智能资源管理

// 创建包含GPU资源的Job
func (r *PyJobReconciler) createJob(ctx context.Context, pyjob *trainingv1.PyJob, jobName string) error {// 配置GPU资源if pyjob.Spec.GPU > 0 {resourceRequirements.Limits["nvidia.com/gpu"] = *resource.NewQuantity(int64(pyjob.Spec.GPU), resource.DecimalSI)}// 创建Pod模板container := corev1.Container{Name:    "trainer",Image:   pyjob.Spec.Image,Command: pyjob.Spec.Command,Resources: resourceRequirements,}// 创建Job资源job := &batchv1.Job{ObjectMeta: metav1.ObjectMeta{Name:      jobName,Namespace: pyjob.Namespace,},Spec: batchv1.JobSpec{Template: corev1.PodTemplateSpec{Spec: corev1.PodSpec{Containers: []corev1.Container{container},},},},}return r.Create(ctx, job)
}

五、实际使用场景

场景1:简单训练任务

apiVersion: training.example.com/v1
kind: PyJob
metadata:name: bert-training
spec:image: "pytorch/pytorch:2.0-cuda11.7-cudnn8-devel"command: ["python", "train_bert.py"]gpu: 1resources:cpu: "4"memory: "8Gi"

传统方式需要创建:

  • ConfigMap(训练脚本)
  • Job(训练任务)
  • Service(日志收集)
  • PVC(数据存储)

Operator方式只需要:

  • 一个PyJob资源!

场景2:分布式多GPU训练

apiVersion: training.example.com/v1
kind: PyJob
metadata:name: distributed-training
spec:image: "pytorch/pytorch:2.0-cuda11.7-cudnn8-devel"command: - "python"- "train_distributed.py"- "--world-size=4"gpu: 4datasetPath: "/mnt/dataset"outputPath: "/mnt/output"resources:cpu: "16"memory: "32Gi"

Operator自动处理:

  • GPU资源调度
  • 分布式训练配置
  • 存储卷挂载
  • 状态监控

六、开发经验分享

1. 项目结构设计

k8s_operator_train/
├── api/v1/                    # API定义
│   ├── pyjob_types.go        # 资源结构定义
│   └── groupversion_info.go  # API版本信息
├── controllers/               # Controller实现
│   └── pyjob_controller.go   # 核心业务逻辑
├── config/                   # 部署配置
│   ├── crd/                 # CRD定义
│   ├── rbac/                # 权限配置
│   └── manager/             # 部署配置
├── examples/                # 使用示例
└── scripts/                 # 构建脚本

2. 开发工具链

  • Kubebuilder:Operator开发框架
  • controller-runtime:Controller运行时
  • Kustomize:配置管理
  • Docker:容器化部署

3. 调试技巧

# 本地开发调试
make run# 查看资源状态
kubectl get pyjobs
kubectl describe pyjob <name># 查看Controller日志
kubectl logs -n system deployment/pyjob-controller-manager# 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp

七、部署和使用

快速部署

# 1. 克隆项目
git clone git@github.com:pwxwmm/k8s_operator_train.git
cd k8s_operator_train# 2. 构建和部署
./scripts/dev-setup.sh
./scripts/build.sh
./scripts/deploy.sh# 3. 运行示例
kubectl apply -f examples/simple-training.yaml# 4. 查看状态
kubectl get pyjobs

八、监控和管理

# 查看所有训练任务
kubectl get pyjobs -A# 监控任务状态
kubectl get pyjob <name> -w# 查看任务日志
kubectl logs -l pyjob-name=<name># 删除任务
kubectl delete pyjob <name>

九、项目亮点

1. 完整的生产就绪特性

  • RBAC权限控制:安全的资源访问
  • 状态监控:实时任务状态跟踪
  • 错误处理:自动重试和故障恢复
  • 资源管理:智能的GPU和存储调度
  • 可扩展性:支持复杂的训练场景

2. 丰富的使用示例

  • 简单训练任务
  • 多GPU分布式训练
  • 带持久化存储的训练
  • 自定义资源配置

3. 完善的文档

  • 详细的README文档
  • 快速开始指南
  • 开发文档
  • 故障排除指南

十、技术收获

1. Kubernetes扩展开发

  • 深入理解CRD和Controller机制
  • 掌握Operator开发最佳实践
  • 学习云原生架构设计模式

2. Go语言实践

  • 大型项目的代码组织
  • 并发编程和错误处理
  • 测试和调试技巧

3. 运维自动化

  • 将运维知识编码到系统中
  • 声明式API设计
  • 自动化运维流程

通过这个项目,我们实现了一个完整的Kubernetes Operator,它展示了如何:

  1. 简化复杂操作:将多个Kubernetes资源的创建和管理抽象为一个PyJob资源
  2. 自动化运维:自动处理GPU调度、存储管理、状态监控等复杂逻辑
  3. 提升用户体验:用户只需要定义期望状态,Operator自动处理实现细节
  4. 保证可靠性:通过调和循环确保系统始终处于期望状态

这正是Operator模式的核心价值:将运维专家的知识编码到Kubernetes中,让复杂的应用管理变得简单可靠。我认为这也是声明式的一个探索吧

十一、下一步计划

  • 添加Webhook验证功能
  • 集成Prometheus监控
  • 支持多集群训练
  • 添加工作流编排能力


项目地址: GitHub - PyJob Operator
CSDN博客: 从零开始构建Kubernetes Operator
联系方式: 1300042631@qq.com / mmwei3@iflytek.com

如果你对这个项目感兴趣,欢迎Star、Fork和提交Issue!让我们一起推动云原生技术的发展! 🚀


本文首发于CSDN技术博客,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/97923.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/97923.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/97923.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十二篇|新世界语学院教育数据深度解析:学制函数、能力矩阵与升学图谱

第二十二篇&#xff5c;新世界语学院教育数据深度解析&#xff1a;学制函数、能力矩阵与升学图谱 系列主题&#xff1a;500所日本语言学校结构数据工程 关键词&#xff1a;新世界语学院、东京新宿、学制函数建模、JLPT能力矩阵、升学网络、教育数据工程 一、合规与法人建模&…

Java开发工具选择指南:Eclipse、NetBeans与IntelliJ IDEA对比

在Java开发的世界里&#xff0c;选择合适的开发工具就如同挑选一把称手的禅杖&#xff0c;能助你在代码修行的路上更加得心应手。本文将为Java开发者提供一份实用的IDE选择指南&#xff0c;从功能、适用人群、性能等方面深入解析几款主流的Java开发工具&#xff0c;帮助你找到最…

iOS App 内存泄漏与性能调优实战 如何排查内存问题、优化CPU与GPU性能、降低耗电并提升流畅度(uni-app iOS开发优化指南)

在 iOS 应用开发中&#xff0c;内存泄漏 是最常见且最难排查的性能问题之一。 它会导致应用 运行越来越卡、占用内存过高、频繁崩溃&#xff0c;甚至严重消耗电池。 尤其在 uni-app 跨平台开发 中&#xff0c;JS 层和原生层的混合调用更容易隐藏内存问题&#xff1a; 对象未释放…

从源代码开始构建、部署和管理应用程序

1.创建项目目录并准备应用程序的代码及其依赖1.创建项目目录&#xff0c;并将当前目录切换到该目录[roothost1 ~]# mkdir python-web && cd python-web2.创建 app.py 文件并添加以下代码[roothost1 python-web]# vi app.py [roothost1 python-web]# cat app.py import …

Flutter-[2]第一个应用

摘要 根据官方文档搭配好环境&#xff0c;使用vscode创建完应用后&#xff0c;会遇到以下问题 设备无法选择打开了lib\main.dart右上角也没有运行按钮 环境 Windows11Flutter 3.35.4 必要设置 1. 查看是否开启Windows桌面应用开发flutter config --list输出如下: All Settings:…

QListWidget选择阻止问题解决方案

QListWidget选择阻止问题解决方案QListWidget选择阻止问题解决方案问题背景QListWidget工作机制详解1. 事件处理流程2. 关键机制说明2.1 鼠标事件与信号的分离2.2 信号阻塞的局限性2.3 断开连接方法的问题问题的根本原因1. 异步事件处理2. 多层状态管理3. 事件优先级解决方案演…

TCL华星计划投建第8.6代印刷OLED产线

近日&#xff0c;TCL科技集团股份有限公司&#xff08;000100.SZ&#xff09;发布公告&#xff0c;公司、旗下子公司TCL华星与广州市人民政府、广州经济技术开发区管理委员会共同签署项目合作协议&#xff0c;拟共同出资于广州市建设一条月加工2290mm2620mm玻璃基板能力约2.25万…

MATLAB 时间序列小波周期分析

1. 文件结构 WaveletPeriod/ ├── main_wavelet_period.m % 一键运行 ├── wavelet_power_spectrum.m % 小波功率谱 显著性 ├── period_peak_detect.m % 自动周期峰值 ├── plot_wavelet_results.m % 时频图 周期图 └── example/└── temp.csv …

如何精准配置储

当电费账单变身利润引擎&#xff0c;您的企业是否做好了准备&#xff1f;鹧鸪云储能仿真软件&#xff0c;不止于仿真——我们以智能算法为核心&#xff0c;为企业定制“高收益、高适配、可持续”的储能配置方案&#xff0c;将用电数据转化为新一轮增长动能。智慧大脑&#xff1…

Uniapp崩溃监控体系构建:内存泄漏三维定位法(堆栈/资源/线程)

在Uniapp开发中&#xff0c;内存泄漏是导致应用崩溃的核心隐患。通过堆栈分析、资源追踪和线程监控三维定位法&#xff0c;可系统化定位泄漏源。以下是完整实施方案&#xff1a;一、堆栈维度&#xff1a;泄漏对象溯源内存快照比对使用Chrome DevTools定期获取内存快照&#xff…

NLP中Subword算法:WordPiece、BPE、BBPE、SentencePiece详解以及代码实现

本文将介绍以下内容&#xff1a; 1. Subword与传统tokenization技术的对比2. WordPiece3. Byte Pair Encoding (BPE)4. Byte-level BPE(BBPE)5. SentencePiece 以及各Subword算法代码实现 一、Subword与传统tokenization技术的对比 1. 传统tokenization技术 传统tokenizatio…

十一章 无界面压测

一、采用无界面压测的原因1.节约系统资源。 2.更快捷&#xff0c;只需要启动命令即可进行压测 3.主要是用于性能压测集成.无界面压测命令参数&#xff1a; -n 表示无界面压测 -t 制定你的 jmx 脚本 -l 生成 jtl 测试报告二、注意配置文件设置:输出为xml jmeter.save.s…

从零实现 Qiankun 微前端:基座应用控制子应用路由与信息交互

随着前端业务的快速发展,单体应用模式(Monolith)越来越难以支撑复杂业务场景。微前端(Micro Frontends)应运而生,它将大型应用拆解成多个子应用(Micro App),通过主应用进行统一调度和集成。 在微前端技术栈中,Qiankun(乾坤)是一个广泛使用的解决方案,基于 single…

在业务应用中集成 go-commons,实现应用+系统双指标监控

在日常 Go 服务开发中&#xff0c;我们通常需要同时监控 业务指标&#xff08;比如 QPS、请求延迟、错误率&#xff09;&#xff0c;也需要关注 系统指标&#xff08;CPU、内存、磁盘占用情况&#xff09;。 过去这类场景通常要引入多个库&#xff1a;一个负责业务指标采集&…

容器化部署番外篇之docker网络通信06

一、四种网络模式 Bridge模式&#xff1a;容器的默认网关&#xff0c;默认新建容器的网络模式Host模式&#xff1a;容器和宿主机共用一个 Network&#xff0c;使用主机的IP:PORT就可以访问容器&#xff0c;但安全性不高&#xff0c;用得少Container模式&#xff1a;这个模式指定…

Linux 线程的概念

序言&#xff1a; 在这篇博客中我们将讲解线程的概念&#xff0c;如何理解线程&#xff0c;线程和进程的区别&#xff0c;线程的优缺点等&#xff0c;我相信你看完这篇博客后会以别样的视角重新理解线程&#xff0c;下面的内容全部是基于Linux操作系统的。 一、线程的概念 1…

vscode 中通义灵码显示登录过期

本文主要分享&#xff1a;vscode 中通义灵码显示登录过期的解决办法。vscode 中的小插件通义灵码&#xff0c;用的好好的&#xff0c;突然提示&#xff1a;登录过期&#xff0c;尝试访问网页版阿里云&#xff0c;登录后&#xff0c;关闭 vscode 重新打开&#xff0c;通义灵码还…

ESP32C3-MINI-1开发板踩坑记录

某东买了一个ESP32C3-MINI-1开发板&#xff0c;名字跟ESP官网的很像&#xff0c;想着应该差不多的&#xff0c;价格便宜17块&#xff0c;而官网的就贵了60还不包邮&#xff0c;买来才发现是巨坑。 看结论&#xff0c;直接到最后&#xff0c;前面都是我的踩坑过程。第一块板子发…

基于粒子群算法的山地环境无人机最短路径规划研究(含危险区域约束的三维优化方法)

无人机在复杂地形与危险环境中的自主路径规划是保障任务顺利执行的关键问题。本文针对山地环境下单无人机三维路径规划难题&#xff0c;提出了一种基于粒子群算法&#xff08;PSO&#xff09;的优化方法。首先&#xff0c;建立了包含真实地形高程、危险区域和飞行约束条件的三维…

Linux-> UDP 编程2

目录 本文说明 一&#xff1a;字典程序的几个问题 1&#xff1a;字典的本质 2&#xff1a;翻译功能的本质 3&#xff1a;让服务端和翻译功能相关联 二&#xff1a;字典类(Dict.hpp) 1&#xff1a;加载词典(Load) 2&#xff1a;翻译单词(Translate) 三&#xff1a;服务…