K8s中flannel因网卡名不兼容导致CrashLoopBackOff的排查与修复

如果你在部署Kubernetes集群时选了flannel做容器网络,却发现kube-flannel的Pod一直在CrashLoopBackOff,多半就是栽在“网卡名不兼容”这个坑上了。这个问题的表面现象很明确:flannel容器反复重启,日志里不是interface eth0 not found就是找不到预期的网卡IP,但你想破头也想不到好好的网卡为什么会“不兼容”。

先把结论摆在这里:所谓网卡名不兼容,绝大多数情况下根本不是硬件或驱动问题,而是flannel期望使用的网卡名与实际节点上的网卡名对不上。它可能来自系统网卡命名规则差异、虚拟化环境多网卡、或者部署时写死了某个网卡名却没人核对过真实环境。这篇文章我会从故障现场、原理、修复实操、场景化排查到长期运维建议,完整拆解这个经典问题,适合正在部署K8s集群的新手、被这个问题卡过的运维同学,以及想搞清楚flannel工作细节的开发者。

1. 故障现场:一个典型的flannel启动失败长什么样

先说一个我在实际环境里遇到过的典型案例。某测试环境的Kubernetes集群,用了三台虚拟机,系统是常见的Linux发行版,安装完kubeadm和flannel之后,kube-system命名空间里出现了一个名为kube-flannel-ds-xxxxx的Pod,状态栏直接显示CrashLoopBackOff。用kubectl get pods -n kube-system看一眼,状态就卡在ContainerCreating和CrashLoopBackOff之间反复横跳。

1.1 报错日志里最常见的三个信号

遇到这种情况,第一件事是看日志。执行kubectl logs -n kube-system kube-flannel-ds-xxxxx,一般能看到下面几种典型输出。

第一种是明确的接口缺失报错,原话类似:

E0626 10:15:33.123456 7890 main.go:325] Failed to create subnet manager: error finding interface eth0: interface eth0 not found

这句话的意思是flannel明确要求使用eth0这个网卡,但系统上根本没有这个接口。此时flannel会在启动阶段直接退出,Kubelet检测到容器退出后不断重启,形成CrashLoopBackOff。

第二种情况稍微隐蔽一点,日志不是找不到接口,而是找到了接口但拿到的IP不对,比如:

Using interface with name eth1 and IP 192.168.1.100

如果你的集群网段规划里192.168.1.100根本不属于预期的Pod网络通信平面,或者这个IP对应的网卡不是和集群其他节点互联的网卡,那么flannel虽然启动“成功”了,后面跨节点通信一定会出问题。这种属于隐性错误,比CrashLoopBackOff还要烦人。

第三种是初始化过程到一半卡住,比如日志反复出现“Waiting for the datastore to become initialized”或者“Failed to connect to etcd”之类的字样。这通常是网络根本不可用导致的连锁反应,但追根溯源往往还是网卡选择错误,导致flannel无法正常访问集群的配置存储。

1.2 节点状态与Pod调度受到的连带影响

这里要澄清一个容易误判的点:flannel容器起不来,节点本身不一定会变成NotReady。我见过很多同学看到flannel挂掉就以为节点会立即NotReady,实际上Kubelet的Node心跳机制和CNI插件失败并不是强绑定关系。大多数情况下,节点状态依然是Ready,但是真正的影响在Pod调度之后才爆发。

你创建一个测试Pod,它会一直卡在ContainerCreating,用describe查看事件,会看到类似“failed to setup network for sandbox”或“CNI failed with status: 400”的报错。因为Kubelet在创建Pod时需要调用CNI插件把Pod放进网络命名空间,而flannel作为CNI的一部分没有正常工作,自然也就无法完成网络配置。如果是集群内部DNS这类系统组件也被调度到了故障节点,那么整个集群的服务解析都会出现大面积异常,看起来就像集群“瘫了”。

1.3 影响范围:全集群异常与单节点异常的分水岭

判断影响范围,关键看网卡名不兼容是一台机器的问题还是所有机器的问题。如果只是某一台机器的网卡命名和集群内其他节点不一致,比如其他节点都是eth0,就这台机器是ens33,那么故障就只会出现在这台节点上,其他节点的flannel正常工作,跨节点通信整体还是通的,只有调度到这台机器上的Pod全部网络异常。

如果是批量部署的虚拟机模板统一出问题,所有节点的网卡名都和flannel配置里的预期值不一致,那就是全集群性的灾难。所有节点上的flannel同时CrashLoopBackOff,所有Pod都无法正常创建或通信,集群基本不可用。这也是为什么排查时先要确认故障范围,再决定修复策略,而不是一上来就改配置。

2. 网卡名不兼容是怎么发生的:原理层面的三个原因

要彻底理解这个问题,不能停留在“改个网卡名让它启动”的层面。我第一次被这个问题折磨的时候也想过,直接把系统网卡改成eth0不就行了?后来发现事情没那么简单。

2.1 flannel选择网卡的优先级规则

flannel作为每个节点上的常驻Agent,需要确定自己通过哪个网卡与集群其他节点通信。它的网卡选择逻辑有一条明确的优先级链。

如果flannel的启动参数里显式指定了--iface,那么无论系统实际有几张网卡,它都会优先使用指定的网卡或IP。如果找不到指定的接口,就会报错退出,也就是上面看到的interface eth0 not found。

如果启动参数里没有指定,flannel会尝试走系统默认路由对应的网卡。默认路由是什么?简单说就是发往目标地址的报文,如果系统路由表里没有更具体的条目,就走这个默认出口。在绝大多数机器上,默认路由对应的就是那台机器的“主网卡”。

如果连默认路由都无法判断,flannel才会去自动探测非回环接口中的第一个网卡,通常按接口序号从小到大找。这个探测逻辑在只有一个物理网卡的机器上表现良好,但一旦遇到多网卡、虚拟网卡、或者默认路由本身就不合理的情况,问题就来了。

2.2 网卡命名乱象:为什么机器上找不到eth0

很多人习惯了eth0、eth1这样的命名方式,但现代Linux系统早就不是只有这一套规则了。udev的设备命名规则会根据固件位置、PCI槽位、MAC地址等生成类似ens33、enp0s3、eno1这样的名字。同一个镜像在物理机和虚拟机上生成的网卡名可能完全不同,甚至同一台虚拟化宿主机上不同虚机克隆出来的网卡名也可能不一样。

这就是“网卡名不兼容”最直接的来源:部署文档或示例配置里写的--iface=eth0,在大部分真实环境中根本找不到对应的接口。你打开ip link看到的是ens33、ens37或者enp1s0f1,自然就“不兼容”了。这跟网卡硬件没有任何关系,纯粹是命名错位。

2.3 不同后端模式对选错网卡的不同反应

flannel支持多种后端,常见的VXLAN和host-gw这两种,对网卡选错的反应截然不同,排查逻辑也不一样。

VXLAN模式下,flannel会创建一个VXLAN设备(默认叫flannel.1),用它作为VTEP与集群内其他节点的VXLAN设备通信。如果选错了网卡,flannel会把自己的源IP注册成错误网卡的IP,导致其他节点无法通过正确IP访问它。更严重的是如果指定的网卡名根本不存在,它会在启动阶段直接崩溃,表现为CrashLoopBackOff。

host-gw模式不走隧道,而是直接修改主机路由表,把Pod网段的流量路由到对端节点Pod所在的主机IP。如果选错网卡,flannel往往不会崩溃,它照样把路由写进路由表,但是路由的下一跳IP对应的是错误网卡的地址,数据包根本送不到对端节点。这种故障的表现是Pod起来了,但跨节点ping不通,而单看每个节点本地一切正常,危害更大,因为隐藏得很深。

2.4 关于“不兼容”的定义:不是硬件问题,是配置错位

把上面几种情况串起来,可以给这个问题的本质做个总结:flannel启动失败或网络异常,核心是配置期望的网卡/IP与实际节点提供的不一致。这种不一致既包括名字对不上,也包括IP选错,还包括后端模式对网卡依赖方式不同带来的连锁反应。

所以处理这个问题的思路不是去“兼容”什么奇怪的网卡驱动,而是让flannel的期望值和真实环境对齐。可以改flannel的配置去适应网卡名,也可以整理网卡命名去迎合配置,还可以更聪明地使用IP而不是名称来消除歧义。后面的实操章节会把这几种思路全部展开。

3. 修复实操:三步把flannel从CrashLoopBackOff里拉回来

现在进入正题,以最常见的“flannel配置里写了eth0,但机器上实际网卡是ens33”为例,给出完整修复流程。这套流程我反复验证过,可以直接照抄。

3.1 第一步:确认节点上真实存在的网卡和默认路由

不要凭记忆猜测网卡名,先上节点查清楚。登录故障节点,执行下面几条命令:

ip link

这条命令会列出所有网络接口,除了物理网卡,还会有lo、docker0、flannel.1(如果之前启动成功过)之类的虚拟接口。你要找的是那个有物理链路、配上业务IP的网卡。一般来说在列表里能看到类似ens33: <BROADCAST,MULTICAST,UP,LOWER_UP>这样的条目。

再执行:

ip addr

重点看每个物理网卡对应的IPv4地址,确定哪个IP是和其他节点通信用的。比如ens33的IP是10.10.0.10,另外一张ens37的IP是172.16.0.10,而集群节点之间的管理网络是10.10.0.0/24,那显然ens33才是flannel应该用的网卡。

最后看一下默认路由:

ip route | grep default

输出类似:

default via 10.10.0.1 dev ens33 proto static

正常情况下默认路由指向的dev就是最合适的网卡。如果默认路由指向和预期不一致,比如指向了docker0,那说明主机路由本身可能被动过,这一步就要一起留意。

3.2 第二步:修改flannel DaemonSet并指定正确的网卡接口

确认了正确的网卡名之后,修改flannel的DaemonSet配置。这是最核心的一步。

如果你是用kubectl apply -f kube-flannel.yml方式安装的,最佳做法是先在本地找到原yaml文件,修改后再重新apply。因为DaemonSet的控制器会在Pod重建时持续拉取期望状态,如果只修改集群运行时对象而不改源文件,后面重新初始化或者节点重新加入时,问题会再次出现。这个细节很关键,我吃过亏,后面还会强调。

找到配置文件里containers下面启动参数的位置,通常flannel的容器参数长这样:

containers: - name: kube-flannel image: docker.io/flannel/flannel:v0.21.0 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr

在args列表里加上网卡参数,改成:

args: - --ip-masq - --kube-subnet-mgr - --iface=ens33

如果你希望迁移到“用IP指定”的方式,直接写IP:

- --iface=10.10.0.10

两种写法各有适用场景,区别在后面章节单独展开。

如果你不想动本地yaml文件,也可以直接用kubectl edit在线改DaemonSet:

kubectl -n kube-system edit daemonset kube-flannel-ds

用vi找到args那一节,加上同样内容。在线修改的优势是即时生效、不用翻找文件,劣势是如果原yaml保留在别的地方,后续维护会不同步。因此我建议:能编辑原始部署yaml的,尽量编辑原始文件再重新apply。

重新apply之后,DaemonSet会触发滚动更新,所有节点的flannel Pod都会按新配置重建。

3.3 第三步:重建Pod并验证flannel.1与跨节点连通

配置更新后,不需要手动一个一个删Pod,DaemonSet的滚动更新会自动处理。不过如果你着急,也可以手动删除指定节点的flannel Pod,让控制器立刻重建:

kubectl -n kube-system delete pod kube-flannel-ds-xxxxx

等待Pod进入Running状态后,先看日志确认选网卡成功了。正常情况下会出现类似:

Using interface with name ens33 and IP 10.10.0.10

或者如果你用了IP参数,会显示“Using interface with IP 10.10.0.10”。看到这行日志,网卡问题基本就算解决了一半。

接着验证flannel.1接口是否正常创建:

ip a show flannel.1

正常会输出一个带10.244.x.0之类的地址的VXLAN接口。这里的10.244.x.0就是flannel为本节点Pod网络分配的子网网关IP。用这个地址可以验证跨节点连通性。如果你有两个节点,从节点A ping节点B的flannel.1地址:

ping 10.244.1.1

能通就说明VXLAN隧道基本建立正常。最后创建几个测试Pod,确认Pod能获得IP并且跨节点访问正常。我习惯在测试时创建一个用busybox镜像的Pod,然后从Pod内ping另一个节点上的Pod IP,这是最直接的网络连通性验证。

3.4 多节点网卡名不统一时的处理建议

如果集群里有几十台机器,有些网卡名是eth0,有些是ens33,有些是enp1s0f1,那--iface=eth0这种写法注定没法统一适配到所有机器。这种情况下有两种靠谱做法。

一种是用--iface=<IP>,因为IP地址在节点内部是唯一的,不受网卡命名规则影响,只要你能保证集群各节点之间通过那个IP互联,flannel就能工作。比如每台机器的业务网卡IP各不相同,但都是10.10.0.x网段,那给所有节点的flannel统一配--iface=10.10.0.<节点对应IP>是可行的,只是需要把每个节点的IP参数分别写对。

另一种更彻底的办法是把所有节点的网卡命名统一。比如在内核启动参数里加net.ifnames=0 biosdevname=0强制使用eth0这样的传统命名。这个操作可行性取决于你的基础设施环境,如果节点统一从模板交付,改一处模板就能统一全局;如果是零散的老机器,改动网卡命名会影响线上业务,风险较大,建议不要在生产环境贸然做。

我的建议是优先用IP方式适配,把网卡命名整理作为容量规划或新建环境时的标准化动作。

4. 高频场景与专项排查:多网卡、动态命名、CNI切换

解决完标准场景,还有几类衍生问题,在实际生产环境中遇到频率也很高,单独拿出来说说。

4.1 多网卡服务器:为什么更建议用IP而不是网卡名

服务器有两张甚至更多物理网卡是很常见的事。比如一张网卡连内网管理面10.10.x.x,另一张连存储网络192.168.x.x,还有一张接业务网络172.16.x.x。如果flannel自动探测或者你指定了错误的网卡名,它就可能把业务网络错认成管理网络,或者反过来,导致集群内部通信走了一个其他节点根本访问不到的网段。

在多网卡场景下,用IP指定比用网卡名指定更稳妥。因为网卡名只代表设备的身份,IP才是真正决定网络可达性的要素。你直接写--iface=172.16.x.x,flannel就不会去猜名字,而是直接锁定那个IP对应的接口。这样哪怕设备名发生改变,只要IP不变,flannel依然能正常工作。

另外要特别小心docker0这个虚拟网卡。很多人在单网卡机器上不会遇到问题,但docker装完之后会产生docker0,它也有IP地址。当flannel自动探测网卡时,如果路由表设计得不合理,它可能选到docker0而忽略物理网卡。我见过不止一次,flannel日志显示“Using interface docker0”,这就是典型的网卡选择错乱。用--iface固定物理网卡IP后,这类问题就彻底绕开了。

4.2 网卡名漂移环境下的根治办法

有些云环境或者虚拟化平台,节点重启后网卡的名称会发生变化。可能上一次是ens33,重启后变成了ens34,这种不确定性会让--iface=eth0或者--iface=ens33这类硬编码配置变得非常脆弱。对这种环境,推荐的手段有两个。

第一个还是用IP指定。IP地址在节点内通常相对稳定,尤其是通过DHCP保留或静态配置的IP。只要IP不漂移,flannel的配置就稳得住。

第二个是用systemd link配置或udev规则固定网卡名。在/etc/systemd/network/下创建对应配置,通过MAC地址将特定网卡绑定到固定名称。这样在多网卡、动态命名环境下,节点重启后网卡名也能保持一致。这个方案适合对系统管理有掌控力的环境,操作时需要仔细核对MAC地址,避免写错导致网卡逻辑混乱。

4.3 从其他CNI切换到flannel时容易忽略的三个残留物

有同学是在集群已经装了其他CNI之后,再想换成flannel,这时候遇到的“启动失败”跟网卡名关系可能不大,而是旧CNI留下的残局。最容易踩坑的有三处。

第一处是/etc/cni/net.d/目录下的残留配置。Kubelet在创建Pod时会读取这个目录下面的配置文件,CNI插件通常是按文件顺序选择使用的。如果旧的calico配置文件没有删干净,哪怕flannel的配置文件也在这个目录里,Kubelet依然可能去调用旧插件,导致Pod网络配置失败,而flannel本身看起来却是好的。

第二处是残留的路由和iptables规则。比如之前calico写入的路由表没有清理,新flannel启动时可能会遇到“route already exists”之类的问题,或者因为旧的ip rule影响,导致数据包转发路径错误。清除残留route和iptables规则时需要谨慎操作,建议在正式切换前把旧CNI相关的已知规则导出备份。

第三处是旧CNI数据目录里的网络状态残留,类似/var/lib/cni/networks/下面的IP分配记录。如果不清理,新flannel在分配IP时可能和旧记录冲突,导致Pod拿到重复IP或分配异常。从这里也能看出,CNI替换不是单纯卸载重装,而是一个需要清理现场的系统操作。

4.4 MTU与防火墙叠加时的排查顺序

有时候网卡名修正了,flannel也起来了,但跨节点Pod通信依然不通,那就需要排查MTU和防火墙的叠加因素。VXLAN模式下的MTU计算尤其容易出问题:因为VXLAN封装会额外占用50字节左右,如果底层物理网卡的MTU是1500,flannel.1接口的MTU一般要设置成1450。如果设置不对,数据包超过链路MTU会被分片或直接丢弃,表现为小包能通、大包不通。

防火墙的干扰也很隐蔽。VXLAN模式依赖UDP 8472端口来转发封装后的数据包,如果防火墙规则禁止了UDP 8472,节点之间可以ping通管理IP,但VXLAN隧道数据传不过去。host-gw模式虽然不走UDP封装,但依赖底层网络允许IP转发,检查net.ipv4.ip_forward也需要留意。

我的排查顺序固定是:先确认flannel的接口和IP对不对,再检查flannel.1有没有建立、有没有UP,然后ping对端flannel.1地址验证隧道,最后才去排查MTU和防火墙。这个顺序遵循的是“从容器到主机再到外部链路”的思路,可以最快定位问题层级。

5. 长期运维建议:让这类问题在这次修复后不再复发

修复完当前故障只是第一步,我更希望帮助你建立一套预防机制,让网卡名不兼容这类问题不再反复咬人。

5.1 把网卡清单写进集群建设checklist

每次部署新集群,或者往现有集群加新节点,先把节点的IP和网卡名记录到统一的文档或CMDB里。建一个简陋的表格都行,列清楚节点名、IP、物理网卡名、默认路由网卡、flannel配置里用的网卡名。这样下次任何一个节点出问题,你都可以对照清单快速判断是配置偏差还是环境变化。这个动作成本很低,但能省下不少排查时间。

我在部署flannel前一定会做一遍网卡信息采集,确认所有节点的默认路由网卡名是不是一致。如果一致,就用网卡名指定;如果不一致,就直接用每台节点的IP指定。这比装完以后逐个节点修flannel高效得多。

5.2 巡检三板斧:日志、接口、跨节点连通测试

集群运行期,维护还是要靠日常巡检。我的习惯是每周或者每次变更之后,快速过三件事。

第一,看flannel Pod的运行状态和日志关键字。执行kubectl -n kube-system get pods -l app=kube-flannel,确保没有CrashLoopBackOff;抽查日志里“Using interface”那行,确认网卡选择和预期一致。

第二,检查flannel.1接口。在每台节点上执行ip a show flannel.1,确认接口存在并拥有正确的子网IP。如果某台节点的flannel.1接口消失了,那多半是flannel又出问题了,需要立刻看日志。

第三,做一次跨节点连通测试。可以用内核自带的ping工具,从一台节点的flannel.1 IP去ping另一台节点的flannel.1 IP。也可以创建两个分布在不同的节点上的测试Pod,从Pod内互ping。这个测试不用太频繁,但每次集群网络变更之后必做。

5.3 一套通用的问题排查逻辑,不止适用于flannel

最后分享一个通用的排查框架,这个框架救过我很多次:遇到容器网络问题,不要一上来就卸载重装,先从日志出发,由近及远定位问题层级。

具体来说,第一层看容器本身的日志,比如flannel的启动日志,它能告诉你是不是配置问题、接口问题还是数据存储连接问题。第二层看宿主机上的路由和接口状态,比如ip route、ip link、ip a,判断网络栈本身是否正常。第三层才去看外部因素,比如防火墙、云平台安全组、物理网络链路。这样逐层排查,每一步都能验证一个假设,不会像无头苍蝇一样乱撞。

关于这类问题,我个人的一个大原则是:任何对网络配置的修改都要留下记录、可回滚、可验证。flannel的配置看起来只是几行args,但它直接影响整个集群的可用性,改之前想清楚为什么改、改成什么、怎么验证,比图一时方便重要得多。

说回这次的主题,网卡名不兼容这个坑,本质上是“环境的多样性”和“配置的硬编码”之间的一次碰撞。解决它既需要理解flannel的工作方式,也需要对节点环境有完整掌握。希望这篇复盘能帮你在下次遇到类似情况时,不再一头雾水。

相关新闻

从40亿美金估值看AI应用层:通用智能体的技术架构与落地实践

从40亿美金估值看AI应用层:通用智能体的技术架构与落地实践

1. 从40亿美金估值说起&#xff1a;AI应用层到底在发生什么AI应用赛道跑出一家估值40亿美金的公司&#xff0c;这个数字放在两年前几乎没人敢想。那会儿大家的共识是&#xff1a;底层模型才是壁垒&#xff0c;应用层不过是套壳&#xff0c;随时可能被模型迭代碾过去。但Manus这…

2026/10/20 7:34:05 阅读更多 →
自研RAG难在哪?拆解六款开源项目提炼可复用架构蓝图

自研RAG难在哪?拆解六款开源项目提炼可复用架构蓝图

这两年我接了不少RAG相关的活儿&#xff0c;发现一个特别有意思的现象&#xff1a;很多人一上来就要"自研RAG"&#xff0c;理由是开源的不够灵活、不够贴合业务。可真把系统搭起来之后&#xff0c;又怨检索不准、解析太弱、评估没抓手&#xff0c;整体体验远不如那些…

2026/10/20 7:34:04 阅读更多 →
OpenCV 3.2.0 + VS2015 + opencv_contrib 编译指南

OpenCV 3.2.0 + VS2015 + opencv_contrib 编译指南

简介&#xff1a;本资源为OpenCV 3.2.0在Visual Studio 2015平台下的完整编译产物包&#xff0c;专为计算机视觉初学者与嵌入式/桌面端C开发者设计&#xff0c;解决OpenCV核心库与contrib扩展模块在VS2015环境下难以一键配置、编译失败、DLL缺失等典型工程化难题。压缩包共456个…

2026/10/20 7:34:04 阅读更多 →

最新新闻

MATLAB小波分析实战手册:EEG/ECG/振动信号降噪与特征提取

MATLAB小波分析实战手册:EEG/ECG/振动信号降噪与特征提取

简介&#xff1a;本资源是《MATLAB小波分析超级学习手册》配套的完整程序代码包&#xff0c;面向信号处理、图像分析及科研工程领域的MATLAB初学者与进阶用户&#xff0c;聚焦小波理论落地与工程实践能力提升。压缩包含119个文件&#xff08;113个.m函数脚本、4个.wav测试音频、…

2026/10/20 12:23:13 阅读更多 →
华为交换机LACP链路聚合配置实战:负载分担与故障排查

华为交换机LACP链路聚合配置实战:负载分担与故障排查

1. 从一个真实故障说起&#xff1a;为什么单根网线永远不够用很多刚入行的网络运维同行都有过这样的经历&#xff1a;机房搬迁&#xff0c;核心交换机到接入交换机的链路只有一根千兆网线&#xff0c;业务高峰期一到&#xff0c;监控大屏上那条链路的使用率直接顶到95%以上&…

2026/10/20 12:23:13 阅读更多 →
数据预处理全攻略:从数据清洗到缺失值处理,打好数据分析地基

数据预处理全攻略:从数据清洗到缺失值处理,打好数据分析地基

做数据分析这几年&#xff0c;我见过太多人把精力全扑在算法调参上&#xff0c;反复调了好几天&#xff0c;模型效果怎么都上不去&#xff0c;最后排查来排查去才发现&#xff0c;问题根本不在模型&#xff0c;而是喂给模型的数据本身就没洗干净。脏数据、缺失值、量纲悬殊、时…

2026/10/20 12:23:13 阅读更多 →
用 LangGraph 搭建带工具调用的多轮智能体:从状态机设计到流式输出实战

用 LangGraph 搭建带工具调用的多轮智能体:从状态机设计到流式输出实战

引言&#xff1a;能调工具的 Chatbot&#xff0c;离"可用"还有多远 过去一年&#xff0c;几乎每个团队都写过类似这样的代码&#xff1a;把工具 schema 丢给 LLM&#xff0c;拿回 tool_calls&#xff0c;for 循环里逐个执行&#xff0c;把结果拼回消息列表&#xff0…

2026/10/20 12:23:13 阅读更多 →
用 LangChain 和 Ollama 搭建本地 RAG 智能体问答系统

用 LangChain 和 Ollama 搭建本地 RAG 智能体问答系统

引言&#xff1a;本地 RAG 的真实驱动力 过去一年&#xff0c;我参与过几个企业内部知识库项目&#xff0c;几乎每一次技术选型会议都会出现同一个分歧&#xff1a;用云端大模型 API&#xff0c;还是全部本地化部署&#xff1f; 云端方案的优势很明确——模型能力强、开箱即用。…

2026/10/20 12:23:13 阅读更多 →
STM32F4实战:EC20 TCP透传模式与AT指令初始化流程详解

STM32F4实战:EC20 TCP透传模式与AT指令初始化流程详解

简介&#xff1a;针对EC20模块在STM32F4系列微控制器上实现TCP透传通信的场景&#xff0c;这份压缩包提供了一套完整的Keil工程源码&#xff0c;适合物联网开发者、嵌入式工程师以及学习STM32通信技术的读者参考。压缩包内共有174个文件&#xff0c;整体大小约4.06MB&#xff0…

2026/10/20 12:22:13 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →