《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》
K8s Operator 控制器进行深度全链路实践增加以下生产级特性并发协调控制MaxConcurrentReconciles事件记录Event Recorder最终一致性保证Requeue 策略优化子资源冲突处理乐观锁重试监控指标Prometheus MetricsWebhook 校验Validate/Default多版本 CRD 升级Conversion分布式任务队列在 Controller 内部集成高并发任务处理1. 增强版 Controller含并发控制 事件 指标// controllers/task_controller.go增强版package controllersimport (contextfmttimeappsv1 k8s.io/api/apps/v1corev1 k8s.io/api/core/v1k8s.io/apimachinery/api/errorsmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/apimachinery/pkg/runtimek8s.io/apimachinery/pkg/typesk8s.io/client-go/tools/recordctrl sigs.k8s.io/controller-runtimesigs.k8s.io/controller-runtime/pkg/clientsigs.k8s.io/controller-runtime/pkg/controllersigs.k8s.io/controller-runtime/pkg/controller/controllerutilsigs.k8s.io/controller-runtime/pkg/logsigs.k8s.io/controller-runtime/pkg/metricssigs.k8s.io/controller-runtime/pkg/reconciletaskv1 operator-demo/api/v1)// TaskReconciler 增强版type TaskReconciler struct {client.ClientScheme *runtime.SchemeRecorder record.EventRecorder // 事件记录器}// 定义 Prometheus 指标在 init 中注册var (reconcileTotal prometheus.NewCounterVec(prometheus.CounterOpts{Name: task_reconcile_total,Help: Total number of reconciliations,},[]string{namespace, name, phase},)reconcileDuration prometheus.NewHistogramVec(prometheus.HistogramOpts{Name: task_reconcile_duration_seconds,Help: Duration of reconciliation,Buckets: []float64{0.1, 0.5, 1, 2, 5, 10},},[]string{namespace, name},))func init() {metrics.Registry.MustRegister(reconcileTotal, reconcileDuration)}// kubebuilder:rbac:groupstask.example.io,resourcestasks,verbsget;list;watch;create;update;patch;delete// kubebuilder:rbac:groupstask.example.io,resourcestasks/status,verbsget;update;patch// kubebuilder:rbac:groupstask.example.io,resourcestasks/finalizers,verbsupdate// kubebuilder:rbac:groupsapps,resourcesdeployments,verbsget;list;watch;create;update;patch;delete// kubebuilder:rbac:groupscore,resourcesservices,verbsget;list;watch;create;update;patch;delete// kubebuilder:rbac:groupscore,resourcesevents,verbscreate;patch// Reconcile 核心协调循环增强版func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {logger : log.FromContext(ctx)startTime : time.Now()// 记录指标defer 执行defer func() {duration : time.Since(startTime).Seconds()reconcileDuration.WithLabelValues(req.Namespace, req.Name).Observe(duration)}()logger.Info(Reconciling Task, name, req.Name, namespace, req.Namespace)// 1. 获取 Task 实例task : taskv1.Task{}if err : r.Get(ctx, req.NamespacedName, task); err ! nil {if errors.IsNotFound(err) {// 资源已删除清理指标reconcileTotal.WithLabelValues(req.Namespace, req.Name, deleted).Inc()return ctrl.Result{}, nil}logger.Error(err, Unable to fetch Task)return ctrl.Result{}, err}// 记录当前阶段指标defer func() {reconcileTotal.WithLabelValues(req.Namespace, req.Name, task.Status.Phase).Inc()}()// 2. 处理删除finalizerif !task.DeletionTimestamp.IsZero() {return r.handleDeletion(ctx, task)}// 3. 添加 finalizerif !controllerutil.ContainsFinalizer(task, task.example.io/finalizer) {controllerutil.AddFinalizer(task, task.example.io/finalizer)if err : r.Update(ctx, task); err ! nil {logger.Error(err, Failed to add finalizer)return ctrl.Result{}, err}// 发送事件r.Recorder.Event(task, corev1.EventTypeNormal, FinalizerAdded, Added finalizer)return ctrl.Result{}, nil}// 4. 协调子资源带重试和版本冲突处理if err : r.reconcileWithRetry(ctx, task); err ! nil {logger.Error(err, Failed to reconcile resources)r.Recorder.Event(task, corev1.EventTypeWarning, ReconcileFailed, err.Error())return ctrl.Result{}, err}// 5. 更新 Status带乐观锁重试if err : r.updateStatusWithRetry(ctx, task); err ! nil {logger.Error(err, Failed to update status)return ctrl.Result{}, err}// 6. 发送成功事件r.Recorder.Event(task, corev1.EventTypeNormal, ReconcileSucceeded,fmt.Sprintf(Task reconciled successfully, phase: %s, task.Status.Phase))logger.Info(Reconcile completed, phase, task.Status.Phase, available, task.Status.AvailableReplicas)// 7. 智能 Requeue最终一致性return r.calculateRequeueDelay(task), nil}// handleDeletion 处理删除逻辑func (r *TaskReconciler) handleDeletion(ctx context.Context, task *taskv1.Task) (ctrl.Result, error) {logger : log.FromContext(ctx)logger.Info(Handling deletion, name, task.Name)if controllerutil.ContainsFinalizer(task, task.example.io/finalizer) {// 执行清理逻辑删除外部资源if err : r.cleanupResources(ctx, task); err ! nil {logger.Error(err, Cleanup failed)r.Recorder.Event(task, corev1.EventTypeWarning, CleanupFailed, err.Error())return ctrl.Result{}, err}// 移除 finalizercontrollerutil.RemoveFinalizer(task, task.example.io/finalizer)if err : r.Update(ctx, task); err ! nil {return ctrl.Result{}, err}r.Recorder.Event(task, corev1.EventTypeNormal, Deleted, Task deleted successfully)}return ctrl.Result{}, nil}// reconcileWithRetry 带重试的资源协调func (r *TaskReconciler) reconcileWithRetry(ctx context.Context, task *taskv1.Task) error {maxRetries : 3for i : 0; i maxRetries; i {err : r.reconcileResources(ctx, task)if err nil {return nil}// 如果是版本冲突重试if errors.IsConflict(err) || errors.IsAlreadyExists(err) {// 重新获取最新版本if refreshErr : r.Get(ctx, client.ObjectKeyFromObject(task), task); refreshErr ! nil {return refreshErr}continue}return err}return fmt.Errorf(max retries exceeded)}// reconcileResources 实际协调逻辑func (r *TaskReconciler) reconcileResources(ctx context.Context, task *taskv1.Task) error {// 创建/更新 Deploymentif err : r.reconcileDeployment(ctx, task); err ! nil {return err}// 创建/更新 Serviceif err : r.reconcileService(ctx, task); err ! nil {return err}// 创建/更新 ConfigMap可选if err : r.reconcileConfigMap(ctx, task); err ! nil {return err}return nil}// reconcileConfigMap 额外资源示例func (r *TaskReconciler) reconcileConfigMap(ctx context.Context, task *taskv1.Task) error {desired : corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: task.Name -config,Namespace: task.Namespace,},Data: map[string]string{app.conf: fmt.Sprintf(port: %d\nenv: %v\n, task.Spec.Port, task.Spec.Env),},}if err : ctrl.SetControllerReference(task, desired, r.Scheme); err ! nil {return err}existing : corev1.ConfigMap{}err : r.Get(ctx, client.ObjectKeyFromObject(desired), existing)if err ! nil {if errors.IsNotFound(err) {return r.Create(ctx, desired)}return err}// 更新只更新 Dataexisting.Data desired.Datareturn r.Update(ctx, existing)}// updateStatusWithRetry 带重试的状态更新func (r *TaskReconciler) updateStatusWithRetry(ctx context.Context, task *taskv1.Task) error {maxRetries : 3for i : 0; i maxRetries; i {// 获取最新状态deploy, err : r.getDeployment(ctx, task)if err ! nil {if errors.IsNotFound(err) {// Deployment 可能还未创建task.Status.Phase Pendingtask.Status.AvailableReplicas 0} else {return err}} else {availableReplicas : deploy.Status.AvailableReplicasphase : Runningif availableReplicas 0 {phase Pending}if deploy.Status.ReadyReplicas *task.Spec.Replicas *task.Spec.Replicas 0 {phase Succeeded}task.Status.Phase phasetask.Status.AvailableReplicas availableReplicas}task.Status.LastUpdateTime metav1.Now()if err : r.Status().Update(ctx, task); err ! nil {if errors.IsConflict(err) {// 重新获取最新版本if refreshErr : r.Get(ctx, client.ObjectKeyFromObject(task), task); refreshErr ! nil {return refreshErr}continue}return err}return nil}return fmt.Errorf(max retries exceeded for status update)}// calculateRequeueDelay 智能计算 Requeue 延迟func (r *TaskReconciler) calculateRequeueDelay(task *taskv1.Task) ctrl.Result {// 根据 Phase 决定 Requeue 频率switch task.Status.Phase {case Pending:// 挂起状态需要更频繁检查return ctrl.Result{RequeueAfter: 10 * time.Second}case Running:// 运行中状态降低频率return ctrl.Result{RequeueAfter: 30 * time.Second}case Succeeded:// 成功状态减少检查但仍需监控防止漂移return ctrl.Result{RequeueAfter: 60 * time.Second}case Failed:// 失败状态快速重试return ctrl.Result{RequeueAfter: 5 * time.Second}default:return ctrl.Result{RequeueAfter: 30 * time.Second}}}// SetupWithManager 增强注册func (r *TaskReconciler) SetupWithManager(mgr ctrl.Manager) error {// 设置事件记录器r.Recorder mgr.GetEventRecorderFor(task-controller)return ctrl.NewControllerManagedBy(mgr).For(taskv1.Task{}).Owns(appsv1.Deployment{}).Owns(corev1.Service{}).Owns(corev1.ConfigMap{}).// 并发控制设置最大并发协调数高并发特性WithOptions(controller.Options{MaxConcurrentReconciles: 10, // 同时处理 10 个 Task}).Complete(r)}2. Webhook 校验api/v1/task_webhook.go// api/v1/task_webhook.gopackage v1import (contextfmtregexpk8s.io/apimachinery/pkg/runtimectrl sigs.k8s.io/controller-runtimesigs.k8s.io/controller-runtime/pkg/webhooksigs.k8s.io/controller-runtime/pkg/webhook/admission)// kubebuilder:webhook:path/mutate-task-example-io-v1-task,mutatingtrue,failurePolicyfail,groupstask.example.io,resourcestasks,verbscreate;update,versionsv1,namemtask.kb.io,sideEffectsNone// kubebuilder:webhook:path/validate-task-example-io-v1-task,mutatingfalse,failurePolicyfail,groupstask.example.io,resourcestasks,verbscreate;update;delete,versionsv1,namevtask.kb.io,sideEffectsNone// Task 实现 Defaulter 和 Validator 接口var _ webhook.Defaulter Task{}var _ webhook.Validator Task{}// Default 设置默认值func (t *Task) Default() {if t.Spec.Replicas 0 {t.Spec.Replicas 1}if t.Spec.Port 0 {t.Spec.Port 8080}if t.Spec.Image {t.Spec.Image nginx:alpine}}// ValidateCreate 创建时校验func (t *Task) ValidateCreate() (admission.Warnings, error) {return nil, t.validate()}// ValidateUpdate 更新时校验func (t *Task) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {return nil, t.validate()}// ValidateDelete 删除时校验func (t *Task) ValidateDelete() (admission.Warnings, error) {return nil, nil}// validate 核心校验逻辑func (t *Task) validate() error {// 1. 副本数校验if t.Spec.Replicas 0 {return fmt.Errorf(replicas cannot be negative)}if t.Spec.Replicas 100 {return fmt.Errorf(replicas cannot exceed 100)}// 2. 镜像格式校验if !regexp.MustCompile(^[a-zA-Z0-9\-._/](:[a-zA-Z0-9\-._])?$).MatchString(t.Spec.Image) {return fmt.Errorf(invalid image format: %s, t.Spec.Image)}// 3. 端口范围校验if t.Spec.Port 1 || t.Spec.Port 65535 {return fmt.Errorf(port must be between 1 and 65535)}// 4. 环境变量校验for k, v : range t.Spec.Env {if k {return fmt.Errorf(env key cannot be empty)}if len(k) 64 {return fmt.Errorf(env key too long: %s, k)}if len(v) 4096 {return fmt.Errorf(env value too long for key: %s, k)}}return nil}// SetupWebhookWithManager 注册 Webhookfunc (t *Task) SetupWebhookWithManager(mgr ctrl.Manager) error {return ctrl.NewWebhookManagedBy(mgr).For(t).Complete()}3. 高并发任务队列集成可选如果需要在 Operator 内部处理大规模任务队列类似 Job 调度可以集成工作队列// controllers/task_queue.gopackage controllersimport (contextsynctime)// TaskQueue 高并发任务队列在 Controller 内部使用type TaskQueue struct {mu sync.Mutexqueue chan *taskv1.Taskwg sync.WaitGroupstop chan struct{}}func NewTaskQueue(workerCount int, queueSize int) *TaskQueue {q : TaskQueue{queue: make(chan *taskv1.Task, queueSize),stop: make(chan struct{}),}// 启动 workerfor i : 0; i workerCount; i {q.wg.Add(1)go q.worker()}return q}func (q *TaskQueue) worker() {defer q.wg.Done()for {select {case task : -q.queue:q.processTask(task)case -q.stop:return}}}func (q *TaskQueue) processTask(task *taskv1.Task) {// 这里执行具体的业务逻辑// 例如调用外部 API、执行脚本、发送通知等time.Sleep(1 * time.Second) // 模拟处理}func (q *TaskQueue) Enqueue(task *taskv1.Task) {select {case q.queue - task:default:// 队列满可以选择丢弃或阻塞// 生产环境建议阻塞或使用背压q.queue - task}}func (q *TaskQueue) Stop() {close(q.stop)q.wg.Wait()}4. 安装 Webhook 证书cert-manager在deploy.yaml中添加 Webhook 配置# deploy.yaml追加apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: task-operator-certnamespace: task-systemspec:dnsNames:- task-operator-webhook.task-system.svc- task-operator-webhook.task-system.svc.cluster.localissuerRef:kind: Issuername: task-operator-selfsignedsecretName: task-operator-cert---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: task-operator-selfsignednamespace: task-systemspec:selfSigned: {}---apiVersion: v1kind: Servicemetadata:name: task-operator-webhooknamespace: task-systemspec:ports:- port: 443targetPort: 9443selector:control-plane: task-operator---apiVersion: admissionregistration.k8s.io/v1kind: MutatingWebhookConfigurationmetadata:name: task-operator-mutating-webhookannotations:cert-manager.io/inject-ca-from: task-system/task-operator-certwebhooks:- name: mtask.kb.ioclientConfig:service:name: task-operator-webhooknamespace: task-systempath: /mutate-task-example-io-v1-taskrules:- operations: [ CREATE, UPDATE ]apiGroups: [ task.example.io ]apiVersions: [ v1 ]resources: [ tasks ]admissionReviewVersions: [ v1 ]sideEffects: NonefailurePolicy: Fail---apiVersion: admissionregistration.k8s.io/v1kind: ValidatingWebhookConfigurationmetadata:name: task-operator-validating-webhookannotations:cert-manager.io/inject-ca-from: task-system/task-operator-certwebhooks:- name: vtask.kb.ioclientConfig:service:name: task-operator-webhooknamespace: task-systempath: /validate-task-example-io-v1-taskrules:- operations: [ CREATE, UPDATE, DELETE ]apiGroups: [ task.example.io ]apiVersions: [ v1 ]resources: [ tasks ]admissionReviewVersions: [ v1 ]sideEffects: NonefailurePolicy: Fail5. CRD 多版本支持v1alpha1 → v1如果未来需要升级 CRD可以添加 Conversion// api/v1alpha1/task_types.go旧版本package v1alpha1// 旧版本定义省略// kubebuilder:conversion:hub// api/v1/task_types.go新版本添加转换// kubebuilder:conversion:storage// kubebuilder:conversion:convert// Convert_v1alpha1_Task_To_v1_Task 转换函数示例func Convert_v1alpha1_Task_To_v1_Task(in *v1alpha1.Task, out *v1.Task, s conversion.Scope) error {// 手动转换逻辑out.ObjectMeta in.ObjectMetaout.Spec.Replicas in.Spec.Replicasout.Spec.Image in.Spec.Image// 字段映射处理return nil}在main.go中添加// 注册 Conversionif err : v1alpha1.AddToScheme(scheme); err ! nil {setupLog.Error(err, unable to add v1alpha1 scheme)}6. 性能测试与压测工具// test/load_test.gopackage testimport (contextfmtsynctestingtimetaskv1 operator-demo/api/v1sigs.k8s.io/controller-runtime/pkg/client)func TestHighConcurrencyReconcile(t *testing.T) {// 创建 100 个 Taskvar wg sync.WaitGroupfor i : 0; i 100; i {wg.Add(1)go func(id int) {defer wg.Done()task : taskv1.Task{// 构造 Task}// 调用 Reconcile模拟}(i)}wg.Wait()}7. 完整的 Makefile自动化构建# Makefile.PHONY: all build test docker-build docker-push deploy undeployall: test buildbuild:go build -o bin/manager main.gotest:go test ./... -vdocker-build:docker build -t yourrepo/task-operator:latest .docker-push:docker push yourrepo/task-operator:latestdeploy:kubectl apply -f config/crd/kubectl apply -f deploy.yamlundeploy:kubectl delete -f deploy.yamlkubectl delete -f config/crd/# 生成 CRD 和 Webhookgenerate:controller-gen object:headerFilehack/boilerplate.go.txt paths./...controller-gen rbac:roleNametask-operator-role paths./... output:rbac:dirconfig/rbaccontroller-gen crd paths./... output:crd:dirconfig/crdcontroller-gen webhook paths./...8. 运行与验证# 1. 安装 CRDmake deploy# 2. 构建并推送镜像make docker-build docker-push# 3. 部署 Operatorkubectl apply -f deploy.yaml# 4. 创建 Task自动触发 Webhook 校验cat EOF | kubectl apply -f -apiVersion: task.example.io/v1kind: Taskmetadata:name: test-tasknamespace: defaultspec:replicas: 3image: nginx:alpineport: 80env:ENV: prodEOF# 5. 查看状态kubectl get tasks -w# 6. 查看事件kubectl describe task test-task# 7. 查看 Deploymentkubectl get deploy# 8. 监控指标需要暴露 Servicekubectl port-forward svc/task-operator-metrics 8080:8080 -n task-systemcurl http://localhost:8080/metrics | grep task_高并发特性总结特性实现方式并发协调MaxConcurrentReconciles: 10乐观锁重试reconcileWithRetry 版本冲突处理智能 Requeue根据 Phase 动态调整延迟事件记录EventRecorder输出到 K8s Events监控指标Prometheus Counter/HistogramWebhook 校验创建/更新前自动校验领导者选举LeaderElection: true多版本支持Conversion Webhook优雅退出SetupSignalHandler()健康探针/healthz, /readyz

相关新闻

软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由性能调优实战:从J4125到PVE,榨干每一分硬件潜力的进阶指南 如果你已经成功在J4125小主机上部署了PVE,并搭建了iKuai主路由、OpenWRT旁路由、NAS乃至Windows 10的All-in-One系统,那么恭喜你,已经迈入了高阶玩家的行列。但搭建成功只是第一步,真正的挑战在于如何让这…

2026/10/19 19:54:22 阅读更多 →
厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家:如何理性选择“快与净”的局部改造服务在老旧小区的居住体验中,厨卫空间往往是痛点最集中的区域。水管老化、瓷砖空鼓、防水失效等问题直接影响日常生活品质。然而,传统装修伴随的噪音污染、粉尘飞扬以及漫长的工期&#xff0…

2026/10/18 9:25:18 阅读更多 →
6月“WAVES挑战赛”收官,广州超90万㎡科技园助力大湾区科创发展!

6月“WAVES挑战赛”收官,广州超90万㎡科技园助力大湾区科创发展!

【导语:6月,“WAVES有智青年挑战赛”在广州大学城科技园圆满结束。该园区由信投公司打造、管理公司运营,整合八大板块,总建面超90万平方米,为科创项目提供全周期落地解决方案,助力大湾区科创发展。】超90万…

2026/10/17 12:19:00 阅读更多 →

最新新闻

Clawbot深度解析:从感知到执行的AI智能体实操指南

Clawbot深度解析:从感知到执行的AI智能体实操指南

1. 革命起点:一款真正“动手干活”的AI体 先问一个问题:你现在用的AI,能帮你干什么? 写周报、画图、做PPT、改代码……这些事做得确实漂亮,但全部停留在 数字世界 里。你让它把桌上的水杯拿过来,它做不到…

2026/10/19 19:54:19 阅读更多 →
open-code-review:基于 Git Diff 与 Tree-sitter 的可审计 AI 代码评审

open-code-review:基于 Git Diff 与 Tree-sitter 的可审计 AI 代码评审

1. 这不是又一个“AI Code Review”工具:open-code-review 的真实定位与设计哲学我第一次在 GitHub 上看到 open-code-review 这个仓库时,下意识点开 README, expecting 又是一个“用 LLM 给 PR 加评论”的玩具项目——结果发现它连一行模型调…

2026/10/19 19:54:19 阅读更多 →
NVIDIA Atlas实战解析:AI工厂蓝图如何落地?部署调优与仿真实践

NVIDIA Atlas实战解析:AI工厂蓝图如何落地?部署调优与仿真实践

1. 用了一年NVIDIA Atlas,我重新理解了"AI工厂"这三个字先说结论:2025年之前,如果有人跟我说"AI基础设施是一张地图",我大概率会觉得这是个比喻。但真的把NVIDIA Atlas这套东西从零部署起来、跑完几个真实的推…

2026/10/19 19:54:19 阅读更多 →
机器学习必懂的统计量:均值方差协方差与Batch Normalization

机器学习必懂的统计量:均值方差协方差与Batch Normalization

机器学习入门最容易被忽略,但又最值得先搞明白的一块,就是统计量。算法框架可以现成调用,模型效果不好时手里却没有排查工具,根本原因就是对这些底层概念理解得模棱两可。均值、方差、协方差、相关系数、标准化,一直到…

2026/10/19 19:54:19 阅读更多 →
开源代码评审工具open-code-review:把Code Review变成工程化流程

开源代码评审工具open-code-review:把Code Review变成工程化流程

现在很多团队谈到 Code Review,第一反应就是"又慢又烦",评审人打开 PR 看一眼就 Approve,或者干脆在群里吼一句"谁有空帮我看看",然后一整天没人理。我做了几年研发管理和架构工作,见过太多 Revie…

2026/10/19 19:51:14 阅读更多 →
小说阅读平台章节模块设计:从ThinkPHP到Laravel重构实战

小说阅读平台章节模块设计:从ThinkPHP到Laravel重构实战

做小说在线阅读平台这件事,我最深的体会是:真正决定项目上限的往往不是花里胡哨的功能,而是最基础的那套章节模块。标题里的“章节设计”四个字,看起来只是建一张表、写几个接口,实际做下来才发现,它把正文…

2026/10/19 19:50:13 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →