cilium路由模式和aws-eni模式下的IPAM
来看Cilium路由的几种核心模式。
封装模式(overlay)
首先是最基础的封装模式。这是默认情况下,如果你没有特别配置,Cilium会自动运行的模式。它的最大特点就是对底层网络环境的要求非常低,可以说是开箱即用。具体怎么实现呢?就是通过UDP协议,比如VXLAN或Geneve,把所有节点都连接起来,形成一个隧道网。
简单来说,节点之间互相通信,数据包都被包了一层壳。这个封装模式对网络环境的要求其实不高。
- 首先,只要你的节点本身能互相Ping通,那基本上就满足了路由的基本要求。
- 其次,它目前依赖IPv4,虽然社区也在努力推进IPv6隧道的支持,但目前还不是主流。
- 最关键的一点,就是你的网络防火墙和底层网络必须允许这些封装协议的流量通过。VXLAN默认是8472端口,Geneve是6081端口,这两个端口必须是开放的,否则封装就无法进行。
封装模式的好处是显而易见的。
- 首先,简洁性极强。你的底层网络,比如交换机、路由器,完全不需要关心Pod的网络地址,也就是Pod CIDR。无论你的网络拓扑多么复杂,只要节点能互相通信,封装模式就能搞定。
- 其次,地址空间非常大。因为不依赖于底层网络的限制,理论上你可以给每个节点分配非常大的Pod CIDR,轻松运行成千上万个Pod。
- 再者它能和Kubernetes这样的编排系统无缝集成,新节点加入集群后,它能自动发现并把自己纳入到这个隧道网络里。
- 最后它还能利用封装协议本身携带的元数据,比如源安全身份,这在性能优化上很有用,可以减少一次远程节点的身份验证。
当然,凡事都有两面性。封装模式最大的缺点就是性能开销。由于给数据包加了额外的头,比如VXLAN头就有50个字节,这会直接减少有效载荷的大小,导致网络传输的吞吐量下降。想象一下,本来能跑1500字节的数据,现在因为封装头占了50字节,实际传输效率就打了折扣。不过,这个影响可以通过启用巨帧来缓解。巨帧就是把数据包做得更大,比如从1500字节提高到9000字节,这样封装头的相对比例就小了,性能损失自然就小了。所以,对于对性能要求不极致的场景,封装模式是个不错的选择。
原生路由模式
接下来我们看第二种模式:原生路由。要启用这个模式,你需要在配置里明确指定 routing-mode: native。
和封装模式不同,原生路由模式下,Cilium会尽量少干预,它把数据包转发给Linux内核的路由子系统去处理。这意味着,如果一个数据包不是发给本地的Pod,Cilium就直接把它交给内核,让它像普通本地进程发的数据包一样去路由。这种模式的好处是,理论上可以达到更高的网络性能,因为它避免了封装和解封装的开销。但代价是,它对网络环境的要求更高了。原生路由模式对网络环境的要求主要体现在两个方面。
- 第一,连接你这些Cilium节点的网络本身,必须能够转发Pod IP地址的流量。
- 第二,每个节点的Linux内核路由表,必须知道怎么把数据包路由到其他所有节点的Pod。
这怎么实现呢?有两种主流方式。
- 每个节点不知道所有Pod的路由,但有一个中心路由器知道所有Pod的路由,节点就配置一个默认路由指向这个路由器。这种方式在很多云平台集成中很常见,比如后面会讲的GKE和AWS ENI。
- 每个节点都手动配置所有其他节点的Pod IP路由,这通常需要借助BGP等协议来实现路由通告,比如以前的Kube-Router项目,虽然现在有些过时了。
如果你的网络是二层网络,也可以通过配置 auto-direct-node-routes: true 来简化路由配置。配置原生路由模式,核心就是设置这两个选项。routing-mode: native 是必须的,告诉Cilium你要用原生路由。ipv4-native-routing-cidr 则指定了哪些CIDR范围内的流量可以走原生路由,超出这个范围的流量可能需要走其他路径,比如封装。这是个关键的配置,决定了你的网络策略范围。还有一个可选的参数 direct-routing-skip-unreachable,这个比较高级,如果你在用BGP并且集群网络有多个子网,开启这个选项可以让节点在同一个区域内有二层连通性,即使某些路由暂时不可达,也能避免流量被BGP路由器强制转发,提高效率。
AWS ENI模式
现在我们来看看专门为AWS环境设计的AWS ENI模式。这个模式需要在启动时通过 --ipam=eni 或者在ConfigMap里设置 ipam: eni 来启用。它的核心优势在于,Pod可以直接使用AWS弹性网络接口ENI上的IP地址,这些IP地址在AWS VPC内部是天然路由的,这意味着Pod之间的通信非常简单,甚至不需要像传统方式那样做SNAT。
而且,每个Pod的IP都可以独立配置安全组,这对于精细化的网络隔离非常有帮助。
当然,它也有缺点。
- 首先,每个实例上的ENI数量是有限制的,取决于你的EC2实例类型,如果你要在小实例上跑很多Pod,可能会遇到限制。
- 其次,分配ENI和IP需要调用EC2 API,这个API是有调用频率限制的,所以Operator设计需要考虑这个问题。
我们来看看这个模式的入口流量是怎么走的。
- 首先,流量从实例的ENI接口,比如ethN进来。
- 然后,内核会根据路由规则,比如上面这个例子,把发往本地Pod的流量导向主路由表。主路由表里会有一个精确匹配路由,比如这个例子,把目标地址是192.168.105.44的流量,通过设备1xc5a4def8d96c5转发。这个设备1xc5a4def8d96c5实际上是一个veth对的一端,它连接着Pod的网络命名空间。
- 在数据包真正进入Pod之前,它会经过eBPF程序的处理,进行安全策略检查、负载均衡、流量控制等等。整个过程非常高效。
再来看出口流量,也就是Pod要出去访问外部网络的情况。
30: from 192.168.105.44 to 192.168.0.0/16 lookup 92default via 192.168.0.1 dev eth2
192.168.0.1 dev eth2
- Pod内部的网络命名空间里,有一个默认路由,指向的是一个路由器IP地址,这个路由器IP实际上是在ENI上分配的一个IP地址。Pod发出的数据包,先经过veth对,同样会被eBPF处理。
- 然后,内核会根据路由规则,比如这个例子,把源地址是192.168.105.44的流量,通过路由表92查找。这个路由表92是专门为这个Pod的ENI创建的。
- 这个ENI路由表里,通常会有一个默认路由,指向VPC的路由器,通过ENI接口eth2出去。这样,Pod的流量就被正确地路由到VPC内部的网络了。
配置AWS ENI模式,除了核心的 ipam等于eni,还需要几个关键的选项。
- enable-endpoint-routes等于true 是必须的,它告诉Cilium可以直接路由到ENI的veth对,而不是通过cilium_host接口。
- auto-create-cilium-node-resource等于true 也很有用,它可以让Cilium Agent自动创建一个名为ciliumnodes.cilium.io的Custom Resource Definition,Operator会监听这个CRD来管理IPAM。
- 另外,如果你的集群需要做NAT,可以使用 egress-masquerade-interfaces 来指定哪些接口需要进行伪装,或者干脆 disable-ipv4-masquerade等于false 来禁用伪装。
对于在Google Cloud上运行Cilium,无论是GKE还是自建集群,都可以利用Google Cloud强大的网络基础设施,配合Cilium的原生路由模式。这种方式的好处是,既能享受Google Cloud网络的高性能,又能获得Cilium提供的各种高级功能,比如精细的网络策略、高效的负载均衡、NodePort、ExternalIP等。具体来说
- Pod的IP会从节点的Pod CIDR里分配,但这些IP会通过Alias IP的方式在Google Cloud网络里路由,所以不需要额外的封装或路由配置。
- 对于离开集群的流量,如果不在指定的原生路由CIDR内,会被伪装成节点的IP。
- 负载均衡方面,ClusterIP是基于eBPF实现的,而NodePort、ExternalIP、HostPort等,在GKE 1.15版本以上或者Linux内核4.19以上版本,也都是基于eBPF来实现的,性能非常出色。
- 所有策略的执行和监控,也都是通过eBPF来完成的。
要在GKE上配置Cilium,核心就是启用 gke.enabled: true。这个选项会自动帮你设置好一系列相关的配置,包括启用 Kubernetes Host Scope IPAM,也就是让Kubernetes负责分配IP;启用原生路由模式;以及启用节点端点路由,这会自动禁用本地节点的路由。当然,你还需要手动设置 ipv4-native-routing-cidr,告诉Cilium哪些网络是原生路由的范围。
具体的安装指南,可以参考官方文档里的Cilium Quick Installation for GKE。
IPAM
现在我们来聊聊IP地址管理,也就是IPAM。简单来说,IPAM就是负责给Cilium管理的网络端点比如容器分配IP地址的。它有很多种模式,每种模式都有自己的特点和适用场景。这张表总结了不同IPAM模式在支持隧道路由、直接路由、CIDR配置方式、是否支持多CIDR集群或节点、以及是否支持动态分配IP等方面的能力。
比如,Kubernetes Host Scope模式依赖Kubernetes配置,而Cluster Scope模式则由Cilium自己配置。AWS ENI和Azure IPAM是针对特定云平台的,GKE模式则是在原生路由基础上进行优化。理解这些模式的区别,有助于我们根据实际需求选择合适的配置。
这里要特别强调一点:在生产环境中,绝对不要轻易更改正在运行的集群的IPAM模式!这绝对是一个非常危险的操作。因为IPAM模式直接决定了Pod的网络地址和路由策略,贸然修改可能会导致集群内大量工作负载的网络连接永久中断,后果不堪设想。所以,如果你确实需要切换IPAM模式,最稳妥的做法是,先搭建一个全新的Kubernetes集群,然后在这个新集群上使用新的IPAM配置。
如果你想让Cilium支持在线迁移IPAM模式,可以关注一下GitHub上的这个Issue 27164,社区也在努力解决这个问题。
集群范围模式
我们先来看集群范围模式,这也是Cilium默认的IPAM模式。它的核心思想是,每个节点都会被分配一个独立的Pod CIDR,然后在这个节点上,使用一个主机作用域的分配器来管理Pod的IP地址。这个模式有点像Kubernetes里的v1.Node资源,但Cilium通过它自己的v2.CiliumNode CRD来管理这些节点的Pod CIDR。
它的最大优势在于,它不依赖于Kubernetes是否配置了Pod CIDR,即使Kubernetes不支持,Cilium也能通过Operator来管理。在这个模式下,Cilium Agent启动时会等待Operator通过v2.CiliumNode对象把这个节点的Pod CIDR信息下发下来,Agent拿到这个信息后,就可以开始在节点内部分配IP地址了。
要启用集群范围模式,具体的配置方法可以参考文档里的CRD-Backed by Cilium教程。这里有个重要的实践点:当你需要扩展集群的IP池时,比如发现Pod CIDR快用完了,正确的做法是增加一个新的CIDR范围到 clusterPoolIPv4PodCIDRList 列表里,而不是去修改已经存在的CIDR。这是因为分配器内部会预留每个CIDR块的前两个IP地址用于网络和广播地址,所以最小掩码长度是斜杠30,推荐使用斜杠29。而且,你不能修改 clusterPoolIPv4MaskSize 这个参数,也不能修改已有的列表元素。总之,扩展时只添加新元素,不修改旧元素。如果遇到集群范围模式的问题,怎么排查呢?首先,可以检查CiliumNode的状态,特别是 status.ipam.operator-status 字段里的 Error 字段,看看有没有错误信息。其次,要特别注意节点网络的CIDR范围。默认情况下,Pod的CIDR是 10.0.0.0/8。如果你的节点网络本身也用了这个范围,那就会出问题,因为Pod发出的流量会被错误地认为是发给本地节点上的其他Pod,而不是发给其他节点的。解决方法很简单,要么显式地把集群的Pod CIDR设置成一个不冲突的范围,比如 192.168.0.0/12,要么就把你的节点网络换到一个不冲突的CIDR范围。
AWS ENI模式
我们再来看AWS ENI模式下的IPAM。这个模式是专门为AWS云环境设计的,它直接利用AWS的弹性网络接口ENI来分配IP地址。它的架构设计得很巧妙,只有一个Operator负责和EC2 API交互,这样可以避免在大型集群中遇到API调用的速率限制。它还引入了预分配水位的概念,Operator会提前预留一些IP地址,确保在Pod调度时,Agent能立刻拿到可用的IP,而不需要每次都去调用EC2 API。不过,目前这个模式还不支持IPv6-only的ENI,相关的支持工作正在追踪中。
AWS ENI模式的IPAM架构是基于CRD-Backed Allocator的。当一个节点上的Cilium Agent第一次启动时,它会创建一个名为ciliumnodes.cilium.io的Custom Resource,里面包含了这个节点的实例ID、实例类型、VPC信息等。Operator会监听这个CRD,一旦发现新的节点,就自动开始管理这个节点的IPAM。
Operator会去扫描EC2实例,找出已有的ENI和它们关联的IP地址,然后把这些可用的IP地址发布到CiliumNode的spec.ipam.available字段里。同时,它还会监控节点上已使用的IP地址,一旦发现IP不足,就会自动创建新的ENI,或者从已有ENI上分配更多的IP地址,以满足预分配水位的需求。更棒的是,你可以为每个节点单独配置不同的子网和安全组,实现精细化的网络隔离。
配置AWS ENI模式的IPAM,核心就是启用 ipam等于eni。
- 然后,为了方便,通常会设置 auto-create-cilium-node-resource等于true,让Agent自动创建CRD。
- 如果你的集群IP资源比较紧张,可以考虑开启 aws-release-excess-ips等于true,这样Operator会定期检查ENI上的IP是否过剩,如果有,就会尝试释放。
- 启用 Operator Metrics 也是个好主意,方便你监控和调试。
- Operator默认会给ENI打上集群名称的标签,方便后续清理。如果你想自定义垃圾回收的标签,可以使用 eni-gc-tags 参数。
除了使用默认的配置,你还可以通过自定义CNI配置文件来精细控制AWS ENI的IPAM行为。你需要创建一个ConfigMap,里面包含一个名为cni-config的键,其值是一个JSON字符串,描述了CNI的配置。在这个JSON里,你可以找到eni字段,里面可以设置各种参数,比如subnet-tags,用于筛选子网。
创建好ConfigMap后,用 kubectl apply -f cni-config.yaml 部署。
在Helm安装Cilium时,需要加上 --set cni.customConf=true 和 --set cni.configMap=cni-configuration 这两个参数。这样,Cilium就会加载你自定义的配置了。在自定义的CNI配置文件里,你可以设置很多ENI相关的参数。比如
- spec.eni.InstanceType、vpc-id、availability-zone、node-subnet-id 这些参数通常由Operator自动填充,但你也可以手动指定。
- spec.ipam.min-allocate、max-allocate、pre-allocate、max-above-watermark 这些参数控制了IP的预分配和水位管理。spec.eni-first-interface-index 可以让你指定从哪个ENI开始分配IP。
- spec.eni.security-group-tags 和 security-groups 控制了新创建的ENI会附加哪些安全组。spec.eni.subnet-ids 和 subnet-tags 用于筛选分配IP的子网。
- spec.eni.exclude-interface-tags 可以用来排除某些特定的ENI接口,不参与Pod IP分配。spec.eni.delete-on-termination 默认是true,表示实例终止时自动删除ENI。
最后,我们快速过一下AWS ENI模式IPAM的运行细节。Operator会维护一个缓存,里面记录了整个AWS账户下的所有ENI、VPC和子网信息。它会定期比如每分钟或者在IP分配或ENI创建后触发去调用 DescribeNetworkInterfaces, DescribeSubnets, DescribeVpcs 这三个API来更新这个缓存。
缓存更新后,Operator会扫描所有节点的ENI,找出可用的IP地址,然后更新到对应的CiliumNode CRD里。Operator还会持续监控所有节点的IP使用情况,一旦发现某个节点的可用IP低于预设的水位,就会自动创建新的ENI或分配IP。如果开启了 aws-release-excess-ips,Operator还会定期检查是否有多余的IP,尝试释放掉。整个过程自动化程度很高,能很好地适应AWS环境的动态变化。
相关文章:
cilium路由模式和aws-eni模式下的IPAM
来看Cilium路由的几种核心模式。 封装模式(overlay) 首先是最基础的封装模式。这是默认情况下,如果你没有特别配置,Cilium会自动运行的模式。它的最大特点就是对底层网络环境的要求非常低,可以说是开箱即用。具体怎么…...
深入理解 Java 代理模式:从基础到实战
在软件开发的世界里,设计模式是程序员智慧的结晶,它们为解决常见问题提供了经过验证的最佳实践。代理模式作为一种常用的结构型设计模式,在 Java 开发中有着广泛的应用。本文将深入探讨 Java 代理模式,从基本概念、分类、实现原理…...
Python毕业设计219—基于python+Django+vue的房屋租赁系统(源代码+数据库+万字论文)
毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于pythonDjangovue的房屋租赁系统(源代码数据库万字论文)219 一、系统介绍 本项目前后端分离,分为租客、房东、管理员三种角色 1、租客: 注册、登录、公…...
Spring Boot 框架概述
1. 简介 Spring Boot 是由 Pivotal 团队开发的一个用于简化 Spring 应用开发的框架。它通过提供默认配置、嵌入式服务器和自动配置等特性,让开发者能够更快速地构建独立的、生产级别的 Spring 应用。 Spring Boot 的主要特点包括: 快速创建独立的 Spri…...
MySQL 8.0(主从复制)
MySQL 8.0 的 主从复制(Master-Slave Replication) 是一种数据库高可用和数据备份的核心技术,下面用 一、什么是主从复制? 就像公司的「领导-秘书」分工: 主库(Master):负责处理所…...
探索大型语言模型的 LLM 安全风险和 OWASP 十大漏洞
大型语言模型 (LLM) 引领着技术进步,推动着包括医疗保健在内的各个领域的自动化进程。在 Halodoc,我们通过 AI 驱动技术的运用直接见证了这一变化。然而,强大的功能伴随着同样重大的责任——保障这些系统的安全对于保护敏感信息和维护信任至关重要。本博客探讨了与 LLM 相关…...
算法与数据结构 - 二叉树结构入门
目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…...
基于AQS实现Reentrantlcok
好久没有更新了 这次来补充上一次AQS还没有实现的可重入锁部分! 我们知道ReentrantLock是可重入的锁,主要的核心是state,他是一个原子性的整数,我们只需要将获取锁的代码boolean由false到true变成0->1即可完成。在完成删除逻辑…...
TiDB预研-分页查询、连接查询、执行计划
目录 分页查询原理连接查询原理查询计划分析 https://docs.pingcap.com/zh/tidb/stable/dev-guide-join-tables/ https://cn.pingcap.com/blog/tidb-query-optimization-and-tuning-1/ https://github.com/pingcap/blog-cn/blob/master/how-to-use-tidb.md 分页查询 深分…...
五、【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践
【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践 一、引言 在大模型应用落地过程中,从实验室研究到生产环境部署存在巨大挑战。本文基于LLaMA-Factory框架,详细介绍大模型部署与监控的完整流程,包含推理优化、…...
Unity 点击按钮,打开 Windows 文件选择框,并加载图片
代码如下: using System; using System.Collections; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI;/// <summary> /// 文件日志类 /// </summary> // […...
深入解析磁盘 I/O 与零拷贝技术:从传统读取到高效传输
深入解析磁盘 I/O 与零拷贝技术:从传统读取到高效传输 在现代计算机系统中,磁盘 I/O 操作是数据处理的核心环节之一。无论是读取文件、写入数据,还是进行网络传输,磁盘 I/O 的效率直接影响到系统的整体性能。本文将深入探讨磁盘 I…...
第十六章,网络型攻击防范技术
网络攻击介绍 网络攻击 --- 指的是入侵或破坏网络上的服务器 ( 主机 ) ,盗取服务器的敏感数据或占用网络带宽。 网络攻击分类: 流量型攻击 网络层攻击 应用层攻击 单包攻击 畸形报文攻击 --- 向目标主机发送有缺陷的IP报文,使得目标在…...
线程的生命周期·
知识点详细说明 Java线程的生命周期由Thread.State枚举明确定义,包含以下6种状态: 1. 新建状态(NEW) 定义:线程对象被创建后,但未调用start()方法。特点: 未分配系统资源(如CPU时间片)。可通过Thread.getState()获取状态为NEW。示例:Thread t = new Thread(); // 状…...
kafka 面试总结
Kafka的幂等性是一种机制,确保生产者发送的每条消息在Broker端只被持久化一次,即使生产者因网络问题等原因重试发送,也不会导致消息重复。 实现原理 生产者ID(PID) 每个生产者实例在初始化时,会被分配一个…...
Webpack基本用法学习总结
Webpack 基本使用核心概念处理样式资源步骤: 处理图片资源修改图片输出文件目录 自动清空上次打包的内容EslintBabel处理HTML资源搭建开发服务器生产模式提取css文件为单独文件问题: Css压缩HTML压缩 小结1高级SourceMap开发模式生产模式 HMROneOfInclud…...
5月9日复盘-混合注意力机制
5月9日复盘 四、混合注意力 混合注意力机制(Hybrid Attention Mechanism)是一种结合空间和通道注意力的策略,旨在提高神经网络的特征提取能力。 1. CBAM Convolution Block Attention Module ,卷积块注意力模块 论文地址&…...
YOLOv8 优化:基于 Damo-YOLO 与 DyHead 检测头融合的创新研究
文章目录 YOLOv8 的背景与发展Damo-YOLO 的优势与特点DyHead 检测头的创新之处融合 Damo-YOLO 与 DyHead 检测头的思路融合后的模型架构融合模型的代码实现导入必要的库定义 Damo-YOLO 的主干网络定义特征金字塔网络(FPN)定义 DyHead 检测头定义融合后的…...
【网安播报】Meta 推出 LlamaFirewall开源框架以阻止 AI 越狱、注入和不安全代码
1、Meta 推出 LlamaFirewall 框架以阻止 AI 越狱、注入和不安全代码 Meta 宣布推出 LlamaFirewall,这是一个开源框架,旨在保护人工智能 (AI) 系统免受新出现的网络风险,例如提示词注入、越狱和不安全代码等。除了 Llam…...
QT 解决msvc fatal error C1060: 编译器的堆空间不足
一.物理内存太小,代码又比较复杂,递归嵌套之类的。 1.修改虚拟内存的大小,一般设置为物理内存的1.5倍。 二.msvc工程的编译默认开启的是多线程编译,所以电脑内存确实不够,采用如下设置。 QMAKE_CXXFLAGS -j1 三.ms…...
PX4开始之旅(一)自动调参
核心知识点:无人机震动与滤波参数 1. 通俗易懂的解释 想象一下,你的无人机就像一个非常敏感的“听众”,它的“耳朵”就是陀螺仪和加速度计这些传感器,用来感知自己是如何移动和旋转的。理想情况下,它应该只“听”到你…...
C++ 中 lower_bound 与 upper_bound 函数详解
C 中 lower_bound 与 upper_bound 函数详解 文章目录 C 中 lower_bound 与 upper_bound 函数详解**一、核心定义与区别****二、使用条件与时间复杂度****三、实际应用场景****四、注意事项与常见误区****五、代码示例****六、总结** 一、核心定义与区别 lower_bound 作用&#…...
minio数据迁移(两台服务器没法相互通信)
场景描述: A服务器 无法访问 B服务器,B服务器 也无法访问 A(即双方都不能通过公网或内网直连对方) MinIO 官方提供了 mc(MinIO Client)命令行工具,可以直接实现 Bucket 之间的数据迁移: 安装 …...
O2OA(翱途)开发平台系统安全-用户登录IP限制
O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址,以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件: 以拥有管理员权限的用户账号登录O2OA(翱途)开发平…...
CSS flex:1
在 CSS 中,flex: 1 是一个用于弹性布局(Flexbox)的简写属性,主要用于控制 flex 项目(子元素)如何分配父容器的剩余空间。以下是其核心作用和用法: 核心作用 等分剩余空间:让 flex …...
OpenHarmony平台驱动开发(十一),PIN
OpenHarmony平台驱动开发(十一) PIN 概述 功能简介 PIN即管脚控制器,用于统一管理各SoC的管脚资源,对外提供管脚复用功能。 基本概念 PIN是一个软件层面的概念,目的是为了统一对各SoC的PIN管脚进行管理࿰…...
.NET高频技术点(持续更新中)
1. .NET 框架概述 .NET 框架的发展历程.NET Core 与 .NET Framework 的区别.NET 5 及后续版本的统一平台 2. C# 语言特性 异步编程(async/await)LINQ(Language Integrated Query)泛型与集合委托与事件属性与索引器 3. ASP.NET…...
Spring Cloud - 2( 12000 字详解 Spring Cloud)
一:服务注册和服务发现 - Eureka 1.1 背景 在上一章节的例子中,我们可以看到远程调用时 URL 被硬编码,这导致在更换机器或新增机器时,相关的 URL 需要进行相应的变更。这就需要让所有相关服务去修改 URL,随之而来的就…...
解决Win11下MySQL服务无法开机自启动问题
问题描述 在win11系统中,明明将MySQL服务设置成了自动启动,但在重启电脑后MySQL服务还是无法自动启动,每次都要重新到计算机管理的服务中找到服务再手动启动。 解决方式 首先确保mysql服务的启动类型为自动。 设置方法:找到此电…...
RGB矩阵照明系统详解及WS2812配置指南
RGB矩阵照明系统详解及WS2812配置指南 一、RGB矩阵照明简介 RGB矩阵照明是一种强大的功能,允许使用外部驱动器驱动的RGB LED矩阵为键盘增添绚丽的灯光效果。该系统与RGBLIGHT功能无缝集成,因此您可以使用与RGBLIGHT相同的键码来控制它,操作…...
全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!
一、简介 SkyReels-V2 模型集成了多模态大语言模型(MLLM)、多阶段预训练、强化学习以及创新的扩散强迫(Diffusion-forcing)框架,实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框…...
代理ARP与传统ARP在网络通信中的应用及区别研究
一些问题 路由器隔离广播域,每个接口/网段都是独立的广播域ARP请求是二层广播包,广播包没法通过路由器ARP请求没法穿越互联网到达目标主服务器 一些思考 电脑访问互联网服务器的时候,ARP询问的内容,真的是访问服务器么…...
理解 Envoy 的架构
理解 Envoy 的架构对于深入理解 Istio 至关重要,因为 Envoy 是 Istio 数据平面的核心。Envoy 是一个高性能的 C 分布式代理,设计为云原生应用和大规模微服务架构的网络基础。 以下是 Envoy 架构的关键组成部分和核心理念: 核心设计理念&…...
使用Kotlin Flow实现Android应用的响应式编程
在Android应用中使用Kotlin Flow实现响应式编程可以分为以下步骤,结合最佳实践和生命周期管理: 1. 添加依赖 在build.gradle中确保包含协程和生命周期相关依赖: dependencies {implementation("org.jetbrains.kotlinx:kotlinx-corouti…...
【AI提示词】蝴蝶效应专家
提示说明 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级影响的研究者。 提示词 # Role: 蝴蝶效应专家## Profile - language: 中文 - description: 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级…...
StreamRL:弹性、可扩展、异构的RLHF架构
StreamRL:弹性、可扩展、异构的RLHF架构 大语言模型(LLMs)的强化学习(RL)训练正处于快速发展阶段,但现有架构存在诸多问题。本文介绍的StreamRL框架为解决这些难题而来,它通过独特设计提升了训…...
架构进阶:大型制造业企业数据架构顶层设计总体规划方案【附全文阅读】
本文概述了一个大型企业数据架构设计的总体规划方案,针对当前数据架构与管理中存在的诸多问题,如缺乏统一数据模型、数据分析应用体系不健全、主数据管理体系不完善、数据治理体系缺失等,提出了明确的改进目标与实施路径。 数据架构设计思路聚焦于明确数据分布和流向…...
前端指南——项目代码结构解析(React为例)
文件结构 文件项目 ├── doc │ ├── technology.md ├── node_modules ├── public ├── shell ├── src │ ├── auto-generated │ │ ├── apis │ │ ├── models │ ├── components │ │ ├── 组件A │ │ ├── 组件B …...
Redis-数据一致性问题与解决方案
Redis-数据一致性问题与解决方案 引言 Redis 是一个高性能的内存数据库,广泛应用于缓存、会话存储、实时分析等场景。作为一个 NoSQL 数据库,它的高性能和丰富的数据结构使其成为现代微服务架构中不可或缺的组件。然而,在高并发的环境下&am…...
【数据结构】算法的复杂度
前言:经过了C语言的学习,紧接着就步入到数据结构的学习了。在C语言阶段我们在写大多数的oj题的时候会遇到一些问题,就是算法的效率低使用的时间较多,占用的空间也多,数据结构就是来优化算法的。 文章目录 一ÿ…...
Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
目录 (一)反转字符串Ⅱ的C实现 写法一(s.begin()遍历字符) (二)复杂度分析 时间复杂度 空间复杂度 (三)总结 【题目链接】541. 反转字符串Ⅱ - 力扣&am…...
制造单元智能化改造与集成技术平台成套实训设备
制造单元智能化改造与集成技术平台成套实训设备 一、概述: 本设备以汽车行业的轮毂为产品对象,实现了仓库取料、制造加工、打磨抛光、检测识别、分拣入位等生产工艺环节,以未来智能制造工厂的定位和需求为参考,通过工业以太网完成…...
Vscode 顶部Menu(菜单)栏消失如何恢复
Vscode 顶部Menu(菜单)栏消失如何恢复 https://blog.csdn.net/m0_62964247/article/details/135759655 Vscode 顶部Menu(菜单)栏消失如何恢复? 首先按一下 Alt按键,看一下是否恢复了菜单栏 如果恢复了想了解更进一步的设置,或是没能恢复菜单…...
苍穹外卖--公共字段自动填充
1.问题分析 业务表中的公共字段: 问题:代码冗余、不便于后期维护 2.实现思路 自定义注解AutoFill,用于标识需要进行公共字段填充的方法 自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公…...
行业 |四大痛点待破:“拆解”DeepSeek一体机
繁荣DeepSeek一体机市场。 2025年开年,DeepSeek大模型掀起的一体机热潮席卷中国AI市场。这款一体机凭借其“开箱即用”的便利性和极低的门槛,吸引了大量企业关注,尤其是在中小企业和行业创新者中,更是成为了新晋“顶流”。 无论…...
革新锅炉厂智能控制——Ethernet IP转CANopen协议网关的工业互联新方案
锅炉厂智能化转型的必经之路 在工业4.0时代,锅炉厂作为能源供应的核心环节,正面临智能化升级的迫切需求。传统锅炉控制系统往往因协议不兼容、数据孤岛问题导致效率低下、维护成本高昂。如何实现设备间高效协同?如何让老旧设备融入智能网络&…...
基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述 猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间…...
Baklib知识中台引领服务智能跃迁
智能架构重构服务范式 Baklib 知识中台通过全量数据融合与多模态处理能力,重塑企业服务底层逻辑。基于分布式架构设计,平台将分散在业务系统、文档库及外部渠道的非结构化数据进行智能清洗与语义解析,形成标准化的知识元数据池。通过四库体系…...
【Python】超全常用 conda 命令整理
Conda命令整理文档,结合官方指南与高频使用场景分类说明,每个命令都有对应的解释 一、环境管理 1. 创建环境 基本创建conda create --name my_env # 创建名为my_env的空环境 conda create -n my_env python3.11 # 指定Python版本 conda creat…...
FreeRTOS菜鸟入门(十四)·事件
目录 1. 基本概念 2. 应用场景 3. 运作机制 4. 控制块 5. 事件函数接口 5.1 事件创建函数 xEventGroupCreate() 5.2 事件删除函数 vEventGroupDelete() 5.3 事件组置位函数 xEventGroupSetBits()(非中断) 5.4 事件组置位函数 xEventGr…...