Helm部署NFS动态供给:K8s存储自动化实践
刚看到这个标题的时候我盯着“hlem”愣了两秒——这拼写一看就是手快把Helm敲反了。但这反而挺真实实际部署K8s存储时类似的低级失误往往比想象中的多。今天要聊的这套东西就是用Helm在K8s集群里安装NFS存储核心组件是nfs-subdir-external-provisioner。它能解决的问题很直接让开发者不用每次先手工建PV、再绑PVC而是像用公有云存储一样直接申请一块PVC就能拿到可用空间。这篇文章把选型思路、工作原理、安装参数和实际踩坑整条链路串起来讲适合刚接手集群存储的运维以及被NFS静态供给烦透的开发同学。1. 为什么选nfs-subdir-external-provisioner三种接入方式的取舍1.1 静态PV、外部Provisioner和NFS CSI之间的区别K8s要用上NFS摆在面前的路有三条。最简单的做法是在集群里手工创建一个静态PV把NFS服务器上的某个目录直接声明成PV然后让PVC去绑定。这套做法适合目录数量固定、容量需求稳定的场景比如日志归档目录、只读模板目录。缺点也很明显每次新增应用需要新目录时都要有人手工去NFS服务器上mkdir再回集群里写PV和PVC的YAML。应用多了以后这种重复劳动会占据大量维护时间。第二条路就是本文的主角通过Helm部署nfs-subdir-external-provisioner。它是一个外部存储供应器启动后会一直监听集群里的PVC请求。一旦发现有PVC创建并且这个PVC绑定到的StorageClass指向NFS供给器它就会自动在NFS服务端的共享根目录下创建一个子目录同时自动创建对应的PV并完成绑定。整个过程只需要用户提交一个PVC清单剩下的目录创建、PV注册、绑定动作全部自动完成。第三条路是用NFS CSI驱动这是当前K8s社区推荐的NFS接入方式功能也更丰富比如支持卷快照、容量调整等。但CSI驱动对NFS服务端和客户端的版本要求更高部署参数更细在资源有限或者只想快速解决“开发环境动态存储”这类需求时反而显得重。我在实际对比中得出的结论是如果集群版本不是太老且团队后续确实需要快照能力直接上CSI是正路如果眼下只是为了给应用提供一个能动态申请的NFS存储nfs-subdir-external-provisioner足够用而且维护成本极低。1.2 动态供给带来的实际收益动态供给最直观的好处是把申请存储从“运维手工操作”变成了“开发自助提交”。在没有这个组件之前开发提需求运维要先去NFS服务器创建目录再回来写PV清单除了给目录取名字还得保证NFS导出权限、目录属主、PV的访问模式都正确。只要漏掉一个环节Pod就会一直处于ContainerCreating状态。有了Provisioner之后开发只需要提交一段标准的PVC声明指定storageClassName为nfs-client然后等几秒钟PVC就会变成Bound状态。后续POD直接引用这个PVC即可。如果PVC使用完被删除Provisioner根据配置决定是删除底层数据还是先归档这个能力在测试环境非常实用——每次想重置环境直接删PVC就能清掉应用数据不用再登进NFS服务器手动清理目录。1.3 与官方NFS插件等方案的关键差异很多人在第一次接触NFS动态供给时会搜到K8s仓库里那个已经停止维护的nfs-client-provisioner。它和nfs-subdir-external-provisioner在思路上是同一脉但前者老旧代码归档时间很久用的依赖也偏旧。新集群里直接用它有可能在K8s版本升级后出现权限或者RBAC兼容问题。nfs-subdir-external-provisioner是社区里在持续维护的替代品Chart包更新及时参数命名也清晰还支持在values里配置archiveOnDelete这类保留策略。选型时我建议直接看后者不要在停维护的项目上浪费时间。2. 环境准备集群、Helm、NFS服务端一个都不能少2.1 集群端需要提前确认的几件事安装Provisioner之前先在集群侧做一轮检查能省掉后面一大半排障时间。第一确认集群版本。一般要求K8s 1.20以上太老版本会导致部分StorageClass字段处理异常比如allowVolumeExpansion。第二确认集群所有Node节点都装了NFS客户端工具。因为Provisioner创建的PV挂载动作最终发生在调度Pod的节点上由kubelet执行mount命令。如果某个节点没装NFS客户端Pod调度到该节点时就会挂载失败。第三确认节点上的mount命令支持NFSv4或至少NFSv3。大多数现代Linux发行版都自带NFS内核模块但有个别精简版系统会缺失。第四确认集群的kube-apiserver能访问NFS服务器。有些集群有网络策略比如控制平面和业务网络隔离如果Provisioner运行在业务节点它访问NFS走的是业务网络问题不大但如果有NetworkPolicy把命名空间隔离了需要记得放行到NFS服务器的2049端口。2.2 Helm的安装与常用仓库管理集群装Helm这一步比想象中简单。在管理节点上下载Helm二进制放到/usr/local/bin目录执行helm version确认版本。实际部署时建议使用3.x版本因为K8s 1.16之后的API迁移让Helm 2的Tiller架构变得过时。Helm 3直接没了服务端组件客户端对接kubeconfig权限完全由本地kubeconfig控制逻辑更简单。安装前检查一下本地有没有已经配置好的Helm仓库用helm repo list查看。如果仓库列表为空执行帮助安装的操作即可。要注意helm repo add只是把仓库地址写进本地配置并没有实际下载Chart。后续调helm install时Helm才去仓库拉取索引并获取Chart包。所以执行完add操作后最好立刻执行helm repo update确保拿到最新索引。2.3 NFS服务端的目录准备与导出配置NFS服务端是整个链条的地基。我习惯单独拿一台机器做NFS Server避免在已运行其他业务的服务器上切存储目录因为权限和安全策略容易被既有配置干扰。假设NFS服务端地址是192.168.1.100共享根目录是/data/nfs-k8s。先创建目录并设置权限这里有个细节目录属主和权限直接影响Provisioner是否能写入子目录。如果NFS服务端开启了root_squashK8s节点上的root用户会被映射成nobody如果/data/nfs-k8s的属主是root且权限是755那么nobody用户只能在根目录里看没权限创建子目录。所以在NFS服务端执行chmod 1777 /data/nfs-k8s或者把属主改成nfsnobody。实际操作里用chmod 1777最省事让任何通过NFS访问的客户端都能在共享目录下创建子目录。然后把导出配置写进/etc/exports/data/nfs-k8s 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)这里no_root_squash是我个人的偏好因为Provisioner在子目录里会执行chown和chmod操作如果root被压缩成nobody很多权限调整动作会失效。当然no_root_squash会带来安全风险只适合在内网环境使用。如果网络环境要求安全隔离可以把网段限制得更精确或者不要使用no_root_squash而是提前建好Provisioner运行时的用户。导出配置写完执行exportfs -rava生效再用showmount -e 192.168.1.100验证。3. 核心原理子目录动态供给是怎么自动完成的3.1 PVC、StorageClass和Provisioner之间的协作流程动态供给的全流程简单说可以拆成四步。第一步用户提交PVC清单清单里指定storageClassName。第二步名为nfs-provisioner的控制器Pod一直在watch PVC对象它发现自己负责这个StorageClass出现了一条新的未绑定PVC。第三步Provisioner调用NFS服务端接口在共享根目录下创建形如namespace-pvcname-pvname的子目录并在这个子目录里准备文件系统。第四步Provisioner自动创建一个PV对象设置PV的NFS卷路径为该子目录并把PV与PVC绑定PVC立刻进入Bound状态。这套流程的关键在于Provisioner拥有创建、删除、修改PV和StorageClass的权限。安装Chart时RBAC会自动创建ServiceAccount、ClusterRole和ClusterRoleBinding把相应权限都绑定好。如果手工部署很容易漏掉某个权限项这也是我推荐直接用Helm部署的原因之一RBAC不会缺项权限模型已经经过大量环境验证。3.2 子目录命名规则如何避免不同命名空间覆盖数据Provisioner创建子目录时默认命名格式包含命名空间名、PVC名和PV名。形如${namespace}-${pvcName}-${pvName}。这个命名设计是有意图的。如果不带命名空间两个不同Namespace下恰好有同名PVC就可能把子目录撞到一起导致数据互相覆盖。带上PV名是为了保证即使同一PVC被删除后重建新旧PV对应的子目录也不会混淆。我在测试环境里做过一次验证创建两个同名的PVC分别放在test-a和test-b命名空间最终NFS服务端生成了两个不同的目录前缀一个test-a一个test-b。如果当时用的是不带命名空间的命名规则第二个PVC就会把第一个目录里的数据冲掉。所以除非有专门需求不要轻易改动这个命名模板。3.3 回收策略Delete和Retain到底怎么配合archiveOnDelete安装Chart时StorageClass里有两个参数很容易被忽略一个是reclaimPolicy另一个是archiveOnDelete。回收策略reclaimPolicy有两个选项。Retain表示PVC删除后PV对象保留在集群里底层NFS目录数据不动需要运维手工介入回收PV。Delete表示PVC删除时关联的PV对象会被删除Provisioner会响应删除事件清理底层NFS子目录。但archiveOnDelete这个参数可以改变Delete的最终行为。如果reclaimPolicy为DeletearchiveOnDelete为true那么PVC删除后Provisioner不会直接清掉NFS子目录而是把目录重命名为archived-开头的目录相当于做了一次软删除。这个设计非常有意思它既给了Delete策略自动化清理的能力又避免了误删数据。我在测试环境就靠这个参数救回过一份数据库备份。反过来说如果reclaimPolicy是RetainarchiveOnDelete不生效因为Retain本身不会触发Provisioner做任何清理PV被删后底层数据会一直留着等运维决定如何处理。理解了这三者关系后面设置StorageClass时就不会踩到“删PVC数据没了”这种大坑。4. Helm安装实操values参数逐个拆解4.1 添加Chart仓库与命名空间规划安装用的Chart仓库地址指向项目维护方发布的Helm仓库。命令如下 bash helm repo add nfs-subdir-external-provisioner https://nfs-subdir-external-provisioner.github.io/charts helm repo update这段命令没有复杂逻辑但要注意仓库地址拼写。实际遇到最多的报错是连接超时、仓库地址过期之类先在网络层面排掉再执行update。命名空间规划方面我建议把Provisioner单独放到一个专门的命名空间比如nfs-provisioner不要把它混进业务命名空间。这样后续看日志、改配置都方便即使某个业务命名空间被删除存储供给器也不会受影响。4.2 一份可用的values.yaml长什么样安装时直接使用官方默认参数可以跑通但很多环境不具备默认参数要求的条件比如NFS服务器地址。所以我习惯先写一份values.yaml把关键参数显式声明出来。以下是一份最小可用配置 yaml nfs: server: 192.168.1.100 path: /data/nfs-k8s mountOptions: - hard - nfsvers4.2storageClass: name: nfs-client defaultClass: false reclaimPolicy: Delete archiveOnDelete: true allowVolumeExpansion: truenodeSelector: kubernetes.io/os: linux这里的mountOptions我特意加了nfsvers4.2用来避免客户端默认NFS协议版本过低导致的挂载兼容问题。仲裁路径下的灯不亮先亮逐项检查基本能定位到问题。storageClass.name字段决定后续PVC里写的storageClassName建议统一成有辨识度的名字比如nfs-client别写nfs这种太泛的值。4.3 关键参数对照表这部分参数在实际部署时用的频率最高我整理成一张表方便对着配置改。参数路径 | 示例值 | 作用与建议 nfs.server | 192.168.1.100 | NFS服务端地址内网IP nfs.path | /data/nfs-k8s | NFS共享根目录Provisioner会在其下创建子目录 storageClass.name | nfs-client | StorageClass名称PVC里必须引用这个值 storageClass.defaultClass | false | 是否将存储类设为集群默认测试环境可设为true storageClass.reclaimPolicy | Delete | PVC删除后的策略选Delete并配合archiveOnDelete storageClass.archiveOnDelete | true | 删除PVC时归档子目录而不是直接清空 storageClass.allowVolumeExpansion | true | 允许PVC扩容需底层NFS支持 storageClass.mountOptions | [hard,nfsvers4.2] | 挂载参数生产环境建议增加timeo和retrans实际执行安装的命令 bash helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -n nfs-provisioner --create-namespace -f values.yaml安装完成后用kubectl get pods -n nfs-provisioner确认Pod处于Running状态。如果一直Pending先检查是否因为nodeSelector没有匹配节点这个问题在混合架构集群里非常常见。4.4 参数调整与Helm升级需要注意的点很多人在安装完Provisioner之后过段时间想改StorageClass的reclaimPolicy或archiveOnDelete参数。此时直接编辑StorageClass对象的字段是不建议的因为Helm管理的资源在下次升级时会被覆盖回去导致配置“回跳”。正确做法是修改values.yaml然后执行helm upgrade。helm upgrade会更新StorageClass等资源已经存在并绑定的PVC和PV不会受到直接影响只会影响后续新建的PVC。还要特别留意provisionerName参数。这个参数决定了存储供给器对外声称的身份标识。如果多个集群或多次安装用同一个名字PV对象里记录的provisioner名称会冲突导致PVC创建时多个Provisioner同时争抢同一个PVC。在参数表中没写这个值是为了保持简单实际生产环境建议显式指定一个唯一名字比如nfs-subdir-external-provisioner集群A。否则默认会用Chart全名和命名空间生成一个名字也能用但多环境时就容易混。5. 从StorageClass到PVC再到Pod全链路验证方法5.1 部署第一个测试PVC安装完Provisioner只是第一步真正要确定这套存储链路没问题还得完整走一遍PVC申请和Pod读写。先创建一个测试命名空间 bash kubectl create ns nfs-test然后写一个PVC声明文件名为test-pvc.yaml yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc namespace: nfs-test spec: accessModes: - ReadWriteMany storageClassName: nfs-client resources: requests: storage: 1Gi这里storageClassName必须和values.yaml里配置的storageClass.name值完全一致。如果填错PVC会一直Pending。提交清单后执行kubectl get pvc -n nfs-test正常情况下几秒钟后STATUS会从Pending变成Bound。如果一直Pending别急着删先用kubectl describe pvc test-pvc -n nfs-test查看事件。常见事件会有两种一种是provisioning阶段找不到StorageClass另一种是Provisioner报日志无法连接NFS服务端。无论哪一种都需要回过去检查对应配置。5.2 观察自动生成的PV和NFS目录PVC变成Bound之后紧接着去看PV对象 bash kubectl get pv | grep nfs-test输出里应该有一个名字由K8s自动生成的PV容量是1GiStorageClass是nfs-clientReclaim Policy是Delete。用kubectl get pv -o yaml查看明细重点看nfs字段nfs.server和nfs.path应该指向NFS服务端路径下的自动子目录。为了直观可以登录NFS服务端ls /data/nfs-k8s会看到类似nfs-test-test-pvc-pvc-xxxxx的子目录。目录名里既有命名空间nfs-test也有PVC名test-pvc后面一长串是PV的UID。这就是3.2节提到的命名规则在真实环境的验证。如果这一步看到目录生成说明Provisioner自身的NFS连接、权限、RBAC都已正常。5.3 用BusyBox Pod写读文件验证持久化PVC绑定正常不代表Pod读写没问题因为最终挂载动作发生在kubelet所在节点。先部署一个测试Pod yaml apiVersion: v1 kind: Pod metadata: name: nfs-write-pod namespace: nfs-test spec: containers:name: busybox image: busybox:1.36 command: [/bin/sh, -c, sleep 3600] volumeMounts:name: data mountPath: /data volumes:name: data persistentVolumeClaim: claimName: test-pvcPod进入Running后执行kubectl exec -it nfs-write-pod -n nfs-test -- sh在容器里写一个文件 echo hello k8s nfs /data/hello.txt cat /data/hello.txt文件能正常读写说明NFS挂载链路已通。此时回到NFS服务端可以确认hello.txt已经写进对应的子目录。这一步能验证很多东西节点上的NFS客户端工具、NFS协议协商、防火墙规则等等。如果这里卡住问题通常不在Provisioner而在节点与NFS服务端的网络或防火墙。5.4 删除Pod后重建验证数据不丢最后做一次持久化验证。删除刚才的Pod bash kubectl delete pod nfs-write-pod -n nfs-test然后重新创建一个同样的Pod或者直接用完全相同名字重新apply一次。Pod再次Running后进入容器执行cat /data/hello.txt如果内容还在说明NFS数据在Pod生命周期之外得到了保留。这个验证做完整个动态存储链路才算真正闭环。实际环境中我还会多做一步删除PVC再看看NFS服务端目录是否被归档。因为values里configure了archiveOnDelete: true所以删除PVC后NFS服务端应该看到目录被改名为archived-nfs-test-test-pvc-pvc-xxxxx。这个过程能帮新人直观理解回收策略的实际效果。6. 实际操作中最容易踩的坑权限、路径与回收策略6.1 NFS权限不足导致Provisioner无法创建子目录这是我在不同环境里遇到最多的问题症状是Provisioner Pod状态Running但PVC一直Pending日志反复报mkdir permission denied或者input/output error。原因通常有两个一个是NFS导出目录属主不是nobody且权限是755另一个是NFS服务端开了root_squash而Provisioner以root身份去NFS上创建目录被强制映射成了nobody没有写权限。解决思路分两步。先在NFS服务端确认共享根目录的权限执行ls -ld /data/nfs-k8s如果属主是root且权限不是1777就执行chmod 1777。再检查/etc/exports把no_root_squash加上并执行exportfs -rava让配置生效。如果环境不允许no_root_squash那就需要在NFS服务端创建一个和Provisioner Pod中UID一致的属主并把这个目录的属主设成它。很多人在第三步挂载时才排查权限实际在Provisioner创建目录时就该处理。6.2 多节点集群部分节点挂载失败另一种常见故障PVC是BoundPod调度到A节点能正常写但滚动更新后Pod被调度到B节点就卡在ContainerCreatingdescribe显示FailedMount错误是mount: unknown filesystem type nfs。这种问题集中出现在节点底噪不全的集群。大概率是某个新加入集群的节点没装NFS客户端工具。在Ubuntu系节点执行apt install -y nfs-common在CentOS系节点执行yum install -y nfs-utils然后重启节点上的kubelet或者直接让Pod重新调度一次。为了从根本上避免我在初始化节点时就会把nfs-common这类工具通过起应用模板固化下来之后新增节点都会自带不会再出现这种“各节点能力不一致”的问题。6.3 回收策略与归档参数配合不当PVC重建后数据冲突StorageClass的reclaimPolicy为DeletearchiveOnDelete为false时用户删掉一个PVC后Provisioner会把底层NFS目录整个删掉。这在测试环境可能省事但也容易造成事故。比如开发误删了PVC数据立刻就没有了没有任何恢复路径。我的建议是除非确实需要删除数据否则在values里把archiveOnDelete设为true。这样即使删除PVC数据还会以归档目录的形式保留在NFS服务端。在归档目录里看到archived-前缀时可以手动恢复数据而不是彻底绝望。恢复的方式也比较简单把归档目录改回普通目录再建立一个PVC通过静态PV去指向这个目录即可。6.4 换了StorageClass名称导致历史PVC无法匹配有些人装完Provisioner后觉得storageClass.name不够响亮想改成nfs-ssd之类。改完后创建新的PVC没问题但历史PVC和已经绑定的PV不受影响仍然指向旧的StorageClass。这时候如果团队里有同学想复用旧PVC他会发现Pod启动不了因为PV的StorageClass名称和PVC里的storageClassName不一致。这个问题不是无法挽回但需要额外做PVC重建和PV迁移相当折腾。所以storageClass.name一旦确定最好不要随意改动。实在要改就把它当成一次存储类迁移来做先在低峰期创建新PVC把数据拷贝过去再切换应用最后回收旧PVC。切忌上线后用着用着突然改名那会让所有人一起“欣赏”Pending的PVC。6.5 升级Provisioner时的网络与仓库索引问题Helm升级Provisioner时如果helm repo index没更新会提示找不到指定版本的Chart。执行helm repo update后再upgrade即可。还有就是Offline环境如果集群无法访问外部Chart仓库需要提前在有网络的机器上把Chart包拉下来用helm pull命令保存tgz再传到离线环境执行helm install -f values.yaml ./chart.tgz。这个方式可以完全绕开仓库访问问题前提是提前准备好所需版本。升级完成后务必检查Provisioner新版本Pod是否正常运行。我遇到过某次升级后新版本的镜像tag变了但镜像拉取策略是IfNotPresent集群里没有新镜像导致ImagePullBackOff。解决办法是手动docker pull或者修改values里的imagePullPolicy为Always然后再次upgrade。这类零散问题很多但只要沿着日志和事件一路查通常半小时内都能定位。

相关新闻

Kubernetes Python 客户端 API 实战:从自动化脚本到深度编排

Kubernetes Python 客户端 API 实战:从自动化脚本到深度编排

1. 别再在自动化脚本里干敲 kubectl 了:Python API 客户端到底能做什么先坦白一个事:我早年写 Kubernetes 运维脚本,大多数时候是 subprocess 调 kubectl,再解析 stdout。kubectl 好用吗?好用,但它是个给人…

2026/10/18 4:30:31 阅读更多 →
从词袋模型到Jev:文本分类技术演进与选型指南

从词袋模型到Jev:文本分类技术演进与选型指南

1. 文本分类的演进脉络与核心痛点文本分类这件事,说起来简单,做起来坑多。你手上有一堆文本,想给它们自动打上标签——垃圾邮件识别、情感判断、工单路由、内容审核,本质上都是同一个问题:把一段文字映射到一个预定义的…

2026/10/18 4:30:31 阅读更多 →
Qt自定义消息弹窗组件:替代QMessageBox的QDialog实现

Qt自定义消息弹窗组件:替代QMessageBox的QDialog实现

简介:这份资源面向具备一定 Qt 基础的开发者,聚焦 QMessageBox 功能有限、难以满足复杂交互的问题,演示如何通过继承 QObject 自行实现可复用的消息提示框组件。压缩包共 11 个文件,约 45KB,包含 3 个 cpp 源文件、2 个…

2026/10/18 4:30:31 阅读更多 →

最新新闻

Cursor+StageWise分阶段提示法:用主动提示词重做定价卡片

Cursor+StageWise分阶段提示法:用主动提示词重做定价卡片

1. 这套组合到底在折腾什么定价卡片这个东西,做过前端或者产品页的人都不陌生。三列布局、中间那列高亮、顶部挂个“推荐”角标、底下罗列功能清单、最下面放个行动按钮——这套模板在SaaS落地页、会员订阅页、工具类产品的付费墙里被用了几百万遍。问题是&#xff…

2026/10/18 5:17:39 阅读更多 →
Python第一次作业全攻略:从环境搭建到报错排查

Python第一次作业全攻略:从环境搭建到报错排查

1. 先想清楚:第一次作业到底在考什么我见过不少同学拿到“Python第一次作业”时,第一反应是慌。其实真没必要。第一次作业几乎不考算法,更不会让你写出什么高深的东西。它真正想验证的,是三件很基础的事:环境能不能跑起…

2026/10/18 5:17:39 阅读更多 →
K8s单节点集群扩容实战:二进制部署master2与nginx+keepalived高可用架构

K8s单节点集群扩容实战:二进制部署master2与nginx+keepalived高可用架构

先说场景吧。很多团队搞 Kubernetes 集群,第一步通常都是拿一台机器把单节点的集群先跑起来,组件全部用二进制装好、证书手动签好,验证业务没问题之后,才回过头来想生产环境和灾备的事:万一这台 master 挂了怎么办&…

2026/10/18 5:17:39 阅读更多 →
风光储氢系统协调控制与Simulink仿真建模实战

风光储氢系统协调控制与Simulink仿真建模实战

1. 这个模型到底在解决什么问题先说结论:这根本不是一套"能发电又能制氢"的演示品,而是一个面向新能源制氢场景的系统级协调控制方案。核心目标就一句话——让风光这种靠天吃饭的不稳定电力,喂给一个很挑食的PEM电解槽,…

2026/10/18 5:17:39 阅读更多 →
RenoDX 安装配置教程:从克隆仓库到出 addon 文件,4 步完成

RenoDX 安装配置教程:从克隆仓库到出 addon 文件,4 步完成

RenoDX 安装配置教程:从克隆仓库到出 addon 文件,4 步完成 【免费下载链接】renodx Renovation Engine for DirectX Games 项目地址: https://gitcode.com/GitHub_Trending/re/renodx RenoDX(Renovation Engine for DirectX Games&…

2026/10/18 5:17:39 阅读更多 →
推荐一本钱币银元鉴定最实用的书

推荐一本钱币银元鉴定最实用的书

家人们,在钱币收藏这个领域,大家是不是经常遇到各种头疼的问题?像新手入门时完全摸不着头脑,不知道从哪开始学起;经常看币的玩家也会碰到边齿鉴定、版别区分这些难题;藏家和资方投资银元时,又怕…

2026/10/18 5:16:39 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →