從零開始構建Kubernetes Operator:一個完整的深度學習訓練任務管理方案

從零開始構建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;服務…