当前位置: 首页 > news >正文

深入 K8s 网络原理(一)- Flannel VXLAN 模式分析

1. 概述

这周集中聊下 K8s 的集群网络原理,我初步考虑分成3个方向:

  1. Pod-to-Pod 通信(同节点 or 跨节点),以 Flannel VXLAN 模式为例;

  1. Pod/External-to-Service 通信,以 iptables 实现为例;

  1. Ingress 原理,以 NGINX Ingress Controller 实现为例;

  1. 其他:(到时候看心情)Flannel host-gw 模式,Calico,……

今天先介绍下 Flannel 实现 Pod 跨节点通信的原理。

2. TL;DR

我知道你们着急,这样吧,先看图:

一图胜千言,下文都不知道咋展开了。哎。

此外,网络这块涉及的概念有点多,逐个细讲感觉不合适。这样,此处默认大家都熟悉 TCP/IP 协议族,下文该偷懒的地方我就偷懒。

3. Pod 间通信问题的由来

容器化以前,当需要将多个应用灵活部署到一些服务器上时,就不可避免地会遇到端口冲突问题,而协调这种冲突是很繁琐的。K8s 体系的处理方式是将每个 Pod 丢到单独的 netns 里,也就是 ip 和 port 都彼此隔离,这样就不需要考虑端口冲突了。

不过这套网络架构应该如何实现呢?整体来由需要解决下面这2个问题(结合上图的 Pod1234):

  1. Pod1 如何和 Pod2 通信(同节点)

  1. Pod1 如何和 Pod3 通信(跨节点)

K8s 的网络模型要求每个 Pod 都有一个唯一的 IP 地址,即使这些 Pod 分布在不同的节点上。为了实现这个网络模型,CoreOS 团队发起了 CNI 项目(后来 CNI 进了 CNCF 孵化)。CNI (Container Network Interface) 定义了实现容器之间网络连通性和释放网络资源等相关操作的接口规范,这套接口进而由具体的 CNI 插件的去实现,CNI 插件负责为 Pod 分配 IP 地址,并处理跨节点的网络路由等具体的工作。

行,接下来具体跟下 CNI 的 Flannel 实现是怎么工作的。

4. 测试环境准备

我在本地通过 Minikube 启动一个3节点的 K8s 集群,3个节点的 IP 和 hostname 分别是:

  • 192.168.49.2 minikube

  • 192.168.49.3 minikube-m02

  • 192.168.49.4 minikube-m03

此外在这个集群内创建了几个 Pod,信息如下(主要留一下 Pod 的 IP 以及所在的节点):

  • kgpoowide

NAME                                READY   STATUS    RESTARTS   AGE    IP           NODE
nginx-deployment-7fbb8f4b4c-89bds   1/1     Running   0          20h    10.244.2.4   minikube-m03
nginx-deployment-7fbb8f4b4c-d29zm   1/1     Running   0          20h    10.244.1.5   minikube-m02
nginx-deployment-7fbb8f4b4c-k5vh4   1/1     Running   0          102s   10.244.2.5   minikube-m03
nginx-deployment-7fbb8f4b4c-m4scr   1/1     Running   0          3s     10.244.1.6   minikube-m02

Pod 用的镜像是带有 ip 等命令的 NGINX,Dockerfile 如下:

FROM nginx:latestRUN apt-get update && \apt-get install -y iproute2 && \rm -rf /var/lib/apt/lists/*

相应的 Deployment YAML 如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 4selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:test1ports:- containerPort: 80

5. 从 veth 设备聊起

不得不先提一句 veth(Virtual Ethernet Device)。veth 是一种在 Linux 中用于网络虚拟化的技术,常用于容器网络中。veth pair 可以看作是一对虚拟网络接口设备,它们像管道的两端一样相连。在一个 veth 对中,数据从一端发送出去,可以在另一端被接收到,就像它们是通过一根以太网线连接的两个独立设备一样。

在容器网络中,veth 对经常被用来连接容器和主机。具体来说,veth 对的一个端点(通常称为 veth 接口)位于容器的网络命名空间内,好像是容器的网络接口卡,而另一个端点位于主机的全局网络命名空间内,通常会连接到一个 Linux 桥接或者其他网络设备。

这种设置允许容器内的网络流量通过 veth 接口流出容器,进入主机的网络命名空间,并通过主机的网络路由和策略进行进一步的处理或转发。

如图所示,Pod 内的 eth0 和 host 上的 veth1 其实就是一个 veth pair,Pod 和 host 在2个不同的网络命名空间内,通过 veth 设备实现了2个 netns 之间的网络互通。

而 veth-n 又会桥接到 cni0 这个网桥上,进而实现流量在主机上的路由过程。接下来我们具体看下 Pod 内外的网络设备和路由规则等。

6. 网桥 cni0

接着来看网桥 cni0。

6.1 在 Pod 内看网卡信息

Pod 10.244.1.6 内的网卡信息如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000link/tunnel6 :: brd :: permaddr 1622:c323:de90::
4: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue state UP group defaultlink/ether 4a:2c:84:bb:56:5e brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.244.1.6/24 brd 10.244.1.255 scope global eth0valid_lft forever preferred_lft forever

可以看到 eth0@f11 设备,对应 IP 10.244.1.6/24,这里看着和一个普通的 vm 没有大差别。此外留一下这里的 if11,这个 11 对应这个 veth pair 在主机上的另外一端的序号。

6.2 在 host 上看网卡信息

节点 minikube-m02 上的网卡信息如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue state UNKNOWN group defaultlink/ether 62:07:aa:05:13:c4 brd ff:ff:ff:ff:ff:ffinet 10.244.1.0/32 scope global flannel.1valid_lft forever preferred_lft forever
6: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue state UP group default qlen 1000link/ether de:07:f7:20:e0:70 brd ff:ff:ff:ff:ff:ffinet 10.244.1.1/24 brd 10.244.1.255 scope global cni0valid_lft forever preferred_lft forever
7: vetha7eec1e2@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP group defaultlink/ether da:ab:17:55:be:50 brd ff:ff:ff:ff:ff:ff link-netnsid 1
10: vethc9667243@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP group defaultlink/ether ce:dd:d3:ec:5e:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 2
11: vethd26e8b95@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP group defaultlink/ether b2:64:95:13:2a:de brd ff:ff:ff:ff:ff:ff link-netnsid 3
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc noqueue state UP group defaultlink/ether 02:42:c0:a8:31:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 192.168.49.3/24 brd 192.168.49.255 scope global eth0valid_lft forever preferred_lft forever

前面 Pod 内看到的 eth0@if11 对应这里的11号 vethd26e8b95@if4。别管这里的 if4,如果你是在 vm 里直接跑 Pod 就看不到 ifn 了。我这里因为用了 Docker Desktop 跑 K8s,所以 K8s 所在的 nodes 本质也是容器,这里多套了一层网络嵌套而已。

先看下 cni0:

  • ip link show master cni0

7: vetha7eec1e2@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP mode DEFAULT group defaultlink/ether da:ab:17:55:be:50 brd ff:ff:ff:ff:ff:ff link-netnsid 1
10: vethc9667243@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP mode DEFAULT group defaultlink/ether ce:dd:d3:ec:5e:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 2
11: vethd26e8b95@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue master cni0 state UP mode DEFAULT group defaultlink/ether b2:64:95:13:2a:de brd ff:ff:ff:ff:ff:ff link-netnsid 3

可以看到前面提到的 veth vethd26e8b95 被桥接到了 cni0 上。

继续看 host 的路由表:

default via 192.168.49.1 dev eth0
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.49.0/24 dev eth0 proto kernel scope link src 192.168.49.3

留意这里的 10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1

cni0 的信息是:

6: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65485 qdisc noqueue state UP group default qlen 1000link/ether de:07:f7:20:e0:70 brd ff:ff:ff:ff:ff:ffinet 10.244.1.1/24 brd 10.244.1.255 scope global cni0valid_lft forever preferred_lft forever

结合起来看,也就是所有发往 10.244.1.0/24 段的数据包都会通过 cni0 传输,10.244.1.0/24 也就是 Flannel 分配给当前节点的 Pod IP 段。

7. VTEP flannel.1

上述路由表中还有这样2条记录:

10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink

当前集群是3个节点,也就是目的地址是当前节点内的 pods IP 段 10.244.1.0/24,流量交给 cni0 处理;而其他节点的 pods IP 段 10.244.0.0/24 和 10.244.2.0/24 则交给 flannel.1 来处理。

flannel.1 是 VXLAN 网络的 VTEP 设备。简单介绍下 VXLAN 和 VTEP:

VXLAN (Virtual Extensible LAN) 是一种覆盖网络技术,允许在现有的物理网络基础设施之上创建大量虚拟化的局域网(LAN)。它主要用于解决传统 VLAN 技术的一些限制,如 VLAN ID 数量限制(只有4096个)。VXLAN 可以支持高达1600万个虚拟网络,极大地扩展了网络的规模和灵活性。

VXLAN 相关的一些概念与原理:

  • 封装与隧道技术:VXLAN 通过封装原始的以太网帧(Layer 2)到 UDP 数据包(Layer 3)中来工作。这意味着它可以跨越不同的网络和子网,实现跨网络边界的通信。

  • VXLAN 网络标识符 (VNI):每个 VXLAN 网络都有一个唯一的标识符,称为 VNI(VXLAN Network Identifier),它提供了地址隔离,确保各个 VXLAN 网络之间的数据包不会互相干扰。

  • VTEP(VXLAN Tunnel Endpoint):VTEP 是 VXLAN 架构中的端点设备,负责封装和解封装数据包。每个通过 VXLAN 通信的网络设备都有一个或多个 VTEP。当数据包从虚拟网络出发时,VTEP 会捕获这些数据包,将它们封装在 VXLAN 格式中(即加入 VNI 和 UDP 头),然后通过物理网络发送。当 VXLAN 数据包到达目的地的 VTEP 时,该 VTEP 将对数据包进行解封装,移除 VXLAN 头部,然后将原始的以太网帧转发到目标虚拟网络中。VTEP 通常部署在数据中心的交换机(物理或虚拟)上,但也可以部署在其他网络设备或服务器上。在容器化环境(如 Kubernetes 使用 Flannel 等 CNI)中,VTEP 可以作为软件组件运行,处理容器或 Pod 之间的 VXLAN 通信。

所以当数据包到达 flannel.1 的时候,就开始了 VXLAN 封包(MAC in UDP)过程,一个以太网帧被依次加上了 VXLAN 头(VNI 信息)、UDP 头、外部 IP 头和 MAC 头等。外部 IP 头里包含了 VXLAN 隧道的源地址和目的地址(VTEP 地址),外部 MAC 头则包含了以太网帧到达下一跳所需的 MAC 地址。

8. 最后看下 Flannel 的配置

在 minikube 环境中,Flannel 会被默认部署到 kube-flannel namespace 下。在这个 namespace 里有一个 ConfigMap 叫做 kube-flannel-cfg,里面包含这样2个配置文件:

  • cni-conf.json

{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]
}

  • net-conf.json

{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}
}

如果需要修改网络模式或者 pods 网段,就可以在 net-conf.json 中灵活调整。早几年用 Flannel 的时候,我就习惯将 10.244.0.0/16 改成 10.100.0.0/16。此外 vxlan 改成 host-gw 可以提高网络传输性能,如果你的集群规模不是大几百好几千个节点,也可以考虑用 host-gw 模式。

9. 总结

从来不总结,下班。

算了,补张图吧,前文提到的 Pod1 到 Pod2/Pod3 的流量怎么走:

文章转载自:胡说云原生

原文链接:https://www.cnblogs.com/daniel-hutao/p/17914378.html

体验地址: 引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

深入 K8s 网络原理(一)- Flannel VXLAN 模式分析

1. 概述 这周集中聊下 K8s 的集群网络原理&#xff0c;我初步考虑分成3个方向&#xff1a; Pod-to-Pod 通信&#xff08;同节点 or 跨节点&#xff09;&#xff0c;以 Flannel VXLAN 模式为例&#xff1b; Pod/External-to-Service 通信&#xff0c;以 iptables 实现为例&…...

fpga 8段4位数码管verilator模拟

8段4位数码管verilator模拟 seg.v module seg(input wire clk,input wire rst_n,output wire[7:0] SEG,output wire[3:0] SEL );reg[7:0] digit[0:15] {8h3f, 8h06, 8h5b, 8h4f, 8h66, 8h6d, 8h7d,8h07,8h7f,8h6f, 8h77, 8h7c, 8h39, 8h5e, 8h79, 8h71};reg[31:0] cnt 32…...

HttpURLConnection发送各种内容格式

通过java.net.HttpURLConnection类实现http post发送Content-Type为multipart/form-data的请求。 json处理使用com.fasterxml.jackson 图片压缩使用net.coobird.thumbnailator log使用org.slf4j 一些静态变量 private static final Charset charset StandardCharsets.UTF_8;…...

摇杆控制人物移动

摇杆控制人物移动 一、UI搭建二、3d模型搭建三、脚本JoyStickBar.csPlayerController.cs 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm1001.2014.3001.5503) 一、UI搭建 JoyStickBar是图片背景 JoySt…...

Jenkins自动化部署之后端

准备工作参考本人另外几篇Jenkins相关的文章 新建任务 添加参数配置 字符串参数&#xff1a;分支名称 多选框&#xff1a;项目名称&#xff08;Extended Choice Parameter插件必备&#xff0c;插件安装参考我另外的文章&#xff09; 这个分割规则自定义。只要根据Jenkins…...

Could not resolve com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28.

1、首先进入阿里云maven仓库&#xff0c;在搜索栏输入无法下载的依赖名称&#xff0c;查询现有版本号&#xff0c;可以看到这里有2.9.34。 2、在build.gradle(Project)的buildscript闭包下替换为阿里云maven仓库&#xff1a; maven { url https://www.jitpack.io } maven { u…...

RK3588平台开发系列讲解(AI 篇)RKNN rknn_query函数详细说明

文章目录 一、查询 SDK 版本二、查询输入输出 tensor 个数三、查询输入 tensor 属性(用于通用 API 接口)四、查询输出 tensor 属性(用于通用 API 接口)五、查询模型推理的逐层耗时六、查询模型推理的总耗时七、查询模型的内存占用情况八、查询模型里用户自定义字符串九、查询原…...

15个主流设计灵感网站,激发你的创作灵感!

即时设计 即时设计是一种强大的云设计工具&#xff0c;已成为许多设计师、产品经理和开发人员的首选工具之一。即时设计用户可以使用内置的工具和功能快速创建和编辑设计&#xff0c;或与其他用户共享和合作。此外&#xff0c;即时设计还有一个丰富的资源社区&#xff0c;为用…...

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例&#xff1a; xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…...

面向 AI,重塑云基础设施、存储、芯片、Serverless……2023亚马逊云科技re:Invent中国行

一年一度亚马逊云科技重要的技术盛会 re:Invent 刚落下帷幕&#xff0c;2023 亚马逊云科技 re:Invent 中国行就将其中重要的信息与内容带给了中国市场和用户。作为全球的云计算巨头&#xff0c;今年亚马逊云科技可以说全面加码 AI&#xff0c;例如发布完整的端到端生成式 AI 技…...

【JDK新特性】JDK和Springboot各版本新特性介绍

目录 参考资料 以下是一些较新版本的JDK的主要新特性介绍&#xff1a; JDK 8&#xff1a; Lambda 表达式&#xff1a;引入了函数式编程的概念&#xff0c;使得代码更简洁、可读性更强。Stream API&#xff1a;提供了一种高效处理集合数据的方式&#xff0c;支持并行处理。默认…...

tomcat剖析:开篇

一、简介 本专栏为解析tomcat的专栏&#xff0c;用于一步步的从构建到执行&#xff0c;再到剖析tomcat的内部构造&#xff0c;然后再加上自己的理解&#xff0c;从0到1去认识我们日常开发中不可或缺的web容器&#xff0c;希望对之后的软件设计能够有所启示。 二、步骤 2.1构…...

华为路由器:DHCP配置

在大型企业网络中&#xff0c;会有大量的主机获取IP地址等网络参数。如果采用手工配置&#xff0c;则工作量大不好管理&#xff0c;若用户擅自更改网络参数&#xff0c;则容易导致IP冲突。 因此使用动态主机配置协议&#xff08;DHCP&#xff09;可以减少管理员的工作量&#x…...

(企业 / 公司项目)微服务OpenFeign怎么实现服务间调用?(含面试题)

Feign: 远程调用组件使用步骤&#xff0c;理解上面的图  后台系统中, 微服务和微服务之间的调用可以通过Feign组件来完成.  Feign组件集成了Ribbon负载均衡策略(默认开启的, 使用轮询机制),Hystrix熔断器 (默认关闭的, 需要通过配置文件进行设置开启)  被调用的微服务…...

数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历 后序遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它由节点和边组成。树的每个节点可以有零个或多个子节点…...

DM工作笔记-在windows下对DM7进行库还原恢复

提供了这些备份数据 在windows平台上&#xff0c;将这些备份数据还原到新库中。 首先实例得先停掉&#xff1a; 使用的软件console.exe&#xff1a; 重要步骤&#xff1a;①获取备份&#xff1b;②还原&#xff1b;③恢复 记住DMAP方式这个不要勾选&#xff0c;然后再获取备份…...

STM32软硬件CRC测速对比

硬件CRC配置 以及软硬件CRC速度对比 使用CUBEMX配置默认使用的是CRC32&#xff0c;从库中可以看出这一点 HAL库提供了以下两个计算函数 HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength); 这个函数用于在已有的CRC校验结果的基础上累积…...

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示&#xff0c;求 A, A2, A3, A4&#xff0c;并回答诸问题&#xff1a; 中间有几章这里没有写&#xff0c;感兴趣可以自己去学&#xff0c;组合数学跟高中差不多&#xff0c…...

如何用java实现对java虚拟机的性能监控?

要使用Java实现对Java虚拟机&#xff08;JVM&#xff09;的性能监控&#xff0c;可以使用Java Management Extensions&#xff08;JMX&#xff09;来获取和监控JVM的各种指标。以下是一个简单的示例代码&#xff0c;演示如何使用JMX监控JVM的内存使用情况&#xff1a; import …...

电路设计(7)——窗口比较器的multism仿真

1.功能设计 构建一个窗口比较器的电路&#xff0c;在输入电压大于3.5v&#xff0c;小于0.8v时&#xff0c;蜂鸣器报警&#xff0c;输入电压在0.8v到3.5v之间时&#xff0c;不报警。 整体电路如下&#xff1a; 2.设计思路 在输入端&#xff0c;采取电阻分压的方式&#xff0c;输…...

AI净界RMBG-1.4快速上手指南:小白也能轻松搞定透明素材

AI净界RMBG-1.4快速上手指南&#xff1a;小白也能轻松搞定透明素材 1. 为什么你需要这个工具 如果你曾经尝试过用传统软件抠图&#xff0c;一定遇到过这些烦恼&#xff1a;发丝边缘总是有残留背景色、半透明物体抠出来像蒙了一层雾、宠物毛发看起来像被啃过一样参差不齐。AI净…...

如何实现百度网盘下载加速?KinhDown让大文件传输效率倍增

如何实现百度网盘下载加速&#xff1f;KinhDown让大文件传输效率倍增 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在忍受百度网盘的龟速下载吗&#xff1f;当你急需工作文件却被限制在几十KB/s的速度时&#xff0c;当重…...

多模态融合避坑手册:为什么你的跨模态模型总掉进‘语义鸿沟’?

多模态融合避坑手册&#xff1a;为什么你的跨模态模型总掉进‘语义鸿沟’&#xff1f; 当你兴奋地将精心设计的跨模态模型投入训练&#xff0c;却发现验证集指标像过山车一样剧烈波动时&#xff0c;问题往往出在那些容易被忽视的工程细节里。上周有位工程师向我展示了他的视频…...

Blender 5.0 插件生态实战指南:从建模到渲染的流程效率革命

1. Blender 5.0插件生态的核心价值 如果你用过Blender&#xff0c;一定遇到过这样的场景&#xff1a;建模时反复手动倒角、UV展开时对着乱七八糟的贴图发呆、渲染时发现场景灯光怎么调都不自然。这些问题在Blender 5.0的插件生态中都能找到优雅的解决方案。 我做了10年三维设计…...

应对维普AIGC史诗级升级:2026降重急救包!5款工具基准测试 x 4大手改重构技巧

论文初稿快要交了&#xff0c;维普却突然搞了个大动作&#xff0c;把系统给升级了。说实话&#xff0c;这事真挺让人头疼的&#xff0c;有人前两天查还是绿的&#xff0c;以为稳了&#xff0c;结果升级完再一测&#xff0c;AI率直接飙红。 但别慌&#xff0c;也别怀疑自己是不…...

为什么你的Java车载模块在-40℃冷启动失败?温度敏感型JIT编译失效分析与AOT预编译加固方案(ISO 26262 Part 6实证)

第一章&#xff1a;Java车载系统实时性优化技巧在车载嵌入式环境中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;的默认行为往往难以满足毫秒级响应、确定性调度与低抖动等硬实时需求。尽管Java并非传统实时语言&#xff0c;但通过深度配置与架构约束&#xff0c;可显著提…...

H3C F1070防火墙console密码恢复实战指南

1. 当console密码成为拦路虎时 刚接手公司网络设备那会儿&#xff0c;我就被H3C F1070防火墙来了个下马威。那天机房搬迁后需要调试设备&#xff0c;结果发现前任管理员留下的console密码早已失效。这种场景就像你拿着钥匙回老家&#xff0c;却发现锁芯被换了一样尴尬。作为网络…...

告别手动重标:基于Python脚本的Labelme数据集增强与JSON同步更新实战

1. 为什么我们需要自动化处理Labelme标注数据 做计算机视觉项目的朋友都知道&#xff0c;数据标注是个体力活。特别是使用Labelme这类工具进行语义分割标注时&#xff0c;每张图片都要手动勾勒物体轮廓&#xff0c;工作量巨大。更让人头疼的是&#xff0c;当我们对原始图片进行…...

别再让WIFI信号‘水土不服’!Android 13高通平台国家码配置保姆级教程

Android 13高通平台WIFI国家码配置实战指南 当你的设备跨越国界&#xff0c;WIFI信号却开始"水土不服"——连接不稳定、速度骤降甚至完全无法使用。这背后往往不是硬件问题&#xff0c;而是国家码配置这个隐形门槛在作祟。作为深耕Android系统开发多年的技术专家&am…...

给SAP财务新人的年结实操笔记:从FAGLGVTR总账结转到F.07往来结转,一次讲清

SAP财务年结实战指南&#xff1a;从总账到往来的完整逻辑解析 刚接触SAP财务模块的新人面对年结时&#xff0c;往往会被一连串的事务代码和操作步骤弄得晕头转向。FAGLGVTR、AJRW、F.07这些看似冰冷的代码背后&#xff0c;其实蕴含着清晰的财务逻辑。本文将带你穿透操作表象&am…...