惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 码甲哥不卷

GLM模型这么火,咱们用vllm也咧一个呗! - 码甲哥不卷 同样都是九年义务教育,他知道的AI算力科普好像比我多耶 higress 这个中登才是AI时代的心头好 MetalLB才是给Ingress这个老登做负重前行的那个男人 超性感的轻量级openclaw平替,我给nanobot打call 我不允许谁还不清楚function call在AI-Agent领域中打手的地位 还有比ollama更傻瓜式的大模型本地部署方式吗 ? 🔎我不允许谁还分不清这三种watch机制的区别 云原生AI算力平台的架构解读 🚀糟糕,我实现的k8s informer好像是依托答辩 🎉在k8s调度的花园里面挖呀挖 - 码甲哥不卷 🎉卷不过AI算法, AI工程化或许是一个出路 - 码甲哥不卷 我是新来的,我需要知道这些吗?网关上的限流器 新来的外包,在大群分享了它的限流算法的实现 新来的外包,限流算法用的这么6 面试总被追问k8s调度器工作原理, 收藏 == 学废 kong网关反向代理grpc请求 幂等的双倍快乐,你值得拥有 JWT 这点小秘密,你们肯定知道!
Go动态感知资源变更的技术实践,你指定用过!
码甲哥不卷 · 2025-08-05 · via 博客园 - 码甲哥不卷

最近在倒腾“AI大模型基础设施”, 宏观目标是做一个基于云原生的AI算力平台,目前因公司隐私暂不能公开宏观背景和技术方案, 姑且记录实践中遇到的一些技能点。

前文已经记录了第1步: 使用arena 提交训练任务的实践。

今天我们记录聊一聊平台侧另一个核心能力:
动态纳管云原生k8s集群,并监听AI/ML训练任务的状态变化。也就是上图的第4步。

作为面向算法开发者的云原生saas平台,平台在界面上提供了纳管集群的交互入口,平台启动后会去监听pytorch,mpi训练任务的状态变更,并回显到界面(并给开发者发送飞书变更通知)。

本文核心关注:

  • 如何动态纳管k8s集群
  • 如何重建k8s informer监听

这里我提供我的实践, 请看下图:

  1. 程序启动,加载初始k8s集群,informer监听训练任务状态,并绑定informer停止信号(stopCh)、重建信号(rebuildCh)
package main

import "k8s.io/client-go/rest"

type StartInformerFunc func(clusterId string, restConf *rest.Config) (stopCh chan struct{}, err error)
type InformerManager struct {
	clusterConfigs map[string]string
	gvr            map[string]StartInformerFunc
	stopCh         chan struct{}  // informer 需要用到
	rebuildCh      chan struct{}
}

var InformerManagerInstance *InformerManager

func NewInFormerManager() *InformerManager {
	InformerManagerInstance = &InformerManager{
		clusterConfigs: map[string]string{
			"id1": "kubeconfig1",
			"id2": "kubeconfig2",
		},
		gvr: map[string]StartInformerFunc{
		   "pytorchjob": startPytorchjobInformer,
		   "mpijob": startMpijobInformer,
		   "job": startRawjobInformer,
		},
		stopCh:    make(chan struct{}),
		rebuildCh: make(chan struct{}, 1),
	}
	return InformerManagerInstance
}

  1. 开协程定时任务去轮循落盘的待纳管k8s集群记录
  2. 考虑纳管的k8s集群数据可控,变更时机可控,采用md5校验的方式判断是否发生集群变更

下面的k8s.CheckClusterChanged(mgr.clusterConfigs) 是利用对kube-configs做md5, 前后对比判断集群是否发生变更。

func (mgr *InformerManager) monitorcLusterChanged() bool {
	ticker := time.NewTicker(30 * time.Second)
	defer ticker.Stop()
	for {
		select {
		case <-ticker.C:
			if k8s.CheckClusterChanged(mgr.clusterConfigs) {
				fmt.Println("cluster changed")
				mgr.rebuildCh <- struct{}{}
			} else {
				fmt.Println("cluster no change")
			}
		case <-mgr.rebuildCh:
			fmt.Println("rebuild informer")
			mgr.clusterConfigs = k8s.GetInitclusters()
			for k, v := range mgr.clusterConfigs {
				rc, err := k8s.ConvertToRestConfig([]byte(v))
				if err != nil {
					fmt.Println("convert to rest config failed")
					continue
				}
				for gvr, StartInformerFunc := range mgr.gvr {
					go func(k string, rc *rest.Config) {
						newStopch, err := StartInformerFunc(k, rc)
						if err != nil {
							return
						}
						if mgr.stopCh != nil {
							close(mgr.stopCh)
						}
						mgr.stopCh = newStopch
						fmt.Printf("%s informer started for cluster %s  \n", gvr, k)
					}(k, rc)
				}
			}
		}
	}
}
  1. 利用简单的链表指针,重置informer监听信道
func (mgr *InformerManager) Run() {
	for k, v := range mgr.clusterConfigs {
		rc, err := k8s.ConvertToRestConfig([]byte(v))
		if err != nil {
			fmt.Println("failed to convert kubeconfig to rest config")
			continue
		}
		for gvr, StartInformerFunc := range mgr.gvr {
			go func(k string, rc *rest.Config) {
				newStopch, err := StartInformerFunc(k, rc)
				if err != nil {
					return
				}
				if mgr.stopCh != nil {
					close(mgr.stopCh)
				}
				mgr.stopCh = newStopch
				fmt.Printf("start %s informer for cluster %s  \n", gvr,k)
			}(k, rc)
		}
		go mgr.monitorClusterChanged()
	}
}

本文记录了使用定时任务感知资源变更,并利用golang信道作为变更信号的姿势,可作为golang中动态感知资源变化的常规技能实践。