kubeadm构建k8s源码阅读环境
目标
前面看了minikube
的源码了解到其本质是调用了kubeadm
来启动k8s
集群,并没有达到最初看代码的目的。 所以继续看看kubeadm
的代码,看看能否用来方便地构建源码调试环境。
k8s源码编译
kubeadm
源码在k8s
源码库中,所以要先克隆k8s
源码。之前用minikube
创建的k8s
集群是v1.32.0
所以克隆v1.32.0
版本的代码
git clone --branch v1.32.0 --single-branch https://github.com/kubernetes/kubernetes.git
考虑到后续可能要改改源码并保存下来,所以我fork
了master
分支去编译。
在Makefile
中可以看到如何编译
在编译前先修改.go-version
文件中go的版本, 默认里面指定的是1.23.4
。k8s
源码中要求go
版本是1.23.0
以上就可以了,我的是1.23.3
不想重新下载go
压缩包了,所以改了。
修改shell
脚本让其输出编译的命令,看不到命令我不是很放心
通过环境变量指定版本号,修改完版本后执行编译命令编译kubeadm
export KUBE_GIT_VERSION=v1.32.0
export KUBE_GIT_COMMIT=$(git rev-parse --short HEAD)
export KUBE_GIT_TREE_STATE=clean
make all DBG=1 WHAT=cmd/kubelet
可以看到编译的命令已经带上了禁用优化的参数了
kubeadm
在一开始检查的过程中会调用kubelet
获取版本号,所以我把全部二进制文件都编译了
export KUBE_GIT_VERSION=v1.32.0
export KUBE_GIT_COMMIT=$(git rev-parse --short HEAD)
export KUBE_GIT_TREE_STATE=clean
make all DBG=1
调试命令如下
dlv --headless --listen=:8005 --api-version=2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kubeadm -- init --cri-socket unix:///run/containerd/containerd.sock
vscode
配置如下
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "kubeadm","type": "go","request": "attach","mode": "remote","remotePath": "/root/kubernetes","port": 8005,"host": "4c","showLog": true,"trace": "verbose","substitutePath": [{"from": "${workspaceFolder}","to": "/root/kubernetes"},{"from": "/Users/wy/wy/workspace_go/pkg/mod", // 本地路径"to": "/root/go_path/pkg/mod" // 远程路径},]}]
}
调试源码前准备工作
PATH环境变量
将前面编译源码生成二进制文件的目录添加到PATH
环境变量中,因为kubeadm
需要调用kubelet
containerd启用cri插件
kubeadm
中,contianerd
是默认的容器运行时,containerd
需要启动cri
插件,随docker
启动的contianerd
默认是禁用了cri
插件的。
containerd
配置cri
插件官方文档地址:
https://github.com/containerd/containerd/blob/main/docs/cri/config.md
docker version
命令查看docker
版本是27.5.0
, containerd
对应的版本是1.7.25
containerd
配置文件默认位置是/etc/containerd/config.toml
在配置文档中有完整的配置文件样例且有大量的注释,有需要的时候再来看,但这不是我们目前要关注的
使用命令生成默认配置
# 备份旧配置
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
# 生成默认配置
containerd config default > /etc/containerd/config.toml
修改的值如下,v1.32.0
版本k8s
要求是3.10
版本,没有的话会触发下载镜像的操作
SystemdCgroup = true
sandbox_image = "registry.k8s.io/pause:3.10"
需要重启containerd
。由于我docker
服务是apt
安装的,估计是自动装的containerd
,是由systemd
托管的。所以重启命令如下
sudo systemctl restart containerd
下载k8s相关镜像
由于网络问题,你得先下载k8s的镜像
# 查看需要下载的镜像
kubeadm config images list
镜像清单如下
registry.k8s.io/kube-apiserver:v1.32.1
registry.k8s.io/kube-controller-manager:v1.32.1
registry.k8s.io/kube-scheduler:v1.32.1
registry.k8s.io/kube-proxy:v1.32.1
registry.k8s.io/coredns/coredns:v1.12.0
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.17-0
然后用github action
大法下载镜像,下载完成后,检查镜像
ctr --namespace k8s.io images list | awk '{print $1}'
镜像已经拉取成功了
配置kubelet
kubeadm init
命令会使用systemctl
命令重启kubelet
,所以需要编写 /etc/systemd/system/kubelet.service
但是具体怎么写,需要通过官方提供的apt
命令安装kubeadm
后,使用kubeadm
命令安装一次k8s
,然后查看kubelet.service
可以看到具体的脚本是怎么写的
可以看到需要编写两个文件,分别是kubelet.service
以及 10-kubeadm.conf
编写/etc/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
Wants=network-online.target
After=network-online.target[Service]
ExecStart=/root/kubernetes/_output/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
KillMode=process
Delegate=yes[Install]
WantedBy=multi-user.target
编写/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
,可以看到这里指定了config.yaml
文件
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/root/kubernetes/_output/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
然后启用该service
systemctl enable kubelet.service
调试源码
主要是想搞清kubeadm
是怎么部署k8s集群的,看看能不能用来调试代码。
代码入口是/cmd/kubeadm/kubeadm.go
kubeadm源码调试
kebeadm
中将部署集群的每个步骤抽象成phase
组成一个数组,然后遍历这个数组,运行每个phase
对应的函数,当phase
数组遍历完了,kubeadm init
命令就完成了
在cmd
命令初始化的时候,可以看到有哪些phase
其实在磊哥的《深入剖析Kubernetes》中有写了kubeadm
的部署原理,只是有些东西还是得自己看看才知道
很明显,kubelet
的启动对应是NewKubeletStartPhase
,随后的NewWaitControlPlanePhase
中等待apiserver
启动完成。
... 省略
initRunner.AppendPhase(phases.NewKubeletStartPhase())
initRunner.AppendPhase(phases.NewWaitControlPlanePhase())
... 省略
当 Kubelet
运行时,它会持续监视参数staticPodPath
指定的目录,如果有新的 Pod
配置文件加入,Kubelet
会自动创建 Pod
。这种启动Pod的方式叫静态启动,该过程不需要 apiserver
参与调度。
kubeadm
生成的kubelet
的配置文件中有个staticPodPath
选项,值如下
staticPodPath: /etc/kubernetes/manifests
该目录下的yaml
都是kubeadm
生成的,共四个yaml
文件,分别是
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
kubelet源码调试
正常情况下,kubelet
是不会有问题的,如果在kubeadm init
命令执行过程提示 kubelet
失败,得看kubelet
到底报啥错了。查看kubelet
日志
journalctl -u kubelet
如果从日志上没看出是啥问题,可以调试下源码看看。当代码运行到启动kubelet
时,启动所需要的配置文件都已经生成了,所以调试kubelet
的时候,可以先退出kubeadm
的调试。
调试kubelet
需要先把kubeadm init
的代码运行到下图中的位置,然后kill
掉调试kubeadm init
的dlv
进程,然后调试kubelet
进程
调试前需要先停止kubelet
,并禁用自动重启
systemctl disable kubelet.service
systemctl stop kubelet
用下面的命令调试kubelet
源码
KUBELET_CONFIG_ARGS="--config=/var/lib/kubelet/config.yaml"
KUBELET_KUBECONFIG_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.k8s.io/pause:3.10"
dlv --headless --listen=:8005 --api-version=2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kubelet -- $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
变量$KUBELET_EXTRA_ARGS
是由文件/etc/default/kubelet
中定义的,默认是空值,所以我没有赋值。
读取pod
文件的代码位置如下,config.NewSourceFile
中会启动goroutinue
监听/etc/kubernetes/manifests
的文件,如果文件有改动,会往一个 channel
发送数据
最后在kubelet
的主循环中处理channel
中的数据,创建、更新或者删除pod
启动的代码东西太多了,等需要的时候再回来看,此处只是记录下代码的位置
kube-scheduler源码调试
回到主题上,k8s
相关的组件都是通过静态pod
的方式启动的,要了解一个pod
,就得看它的yaml
文件,以kube-scheduler
组件为例
可以看到是使用宿主机的网络命名空间,那么就可以直接使用执行源码编译的二进制文件启动kube-schedualer
代替静态pod
的方式来实现断点调试了。
先用kubeadm init
命令把k8s部署成功,默认情况下,出于安全原因,不会在控制平面节点上调度 Pod。想要在控制平面节点上调度需要执行下面的命令
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
然后删除对应的kube-scheduler.yaml
,由于kubelet
是持续监视着/etc/kubernetes/manifests
的,如果文件有变动,则执行对应的操作,例如我删除了yaml
文件,kubelet
会删除掉对应的pod
删除yaml
文件后已经看不到kube-scheduler
了,coredns是要等到CNI插件安装成功后才会启动,这里先不管
参考yaml
中的启动命令,使用下面的命令调试
dlv --headless --listen=:8005 --api-version=2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kube-scheduler -- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=false
参数说明
--authentication-kubeconfig
负责身份认证,确保kube-scheduler
可以连接 API Server。--authorization-kubeconfig
负责权限授权,确保kube-scheduler
有权限调度 Pod。--leader-elect=false
因为没有多个节点,所以把leader
选举关掉
可以看到已经能够成功断点调试了,SchedulerOne
函数就是对Pod
进行调度的入口函数。
相关文章:
kubeadm构建k8s源码阅读环境
目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…...
Java架构设计亿级流量场景下的本地缓存方案选型
在当今的互联网时代,亿级流量的应用场景已经司空见惯。无论是大型电商平台的促销活动,还是热门社交应用的日常运营,都可能面临每秒数万甚至数十万的请求流量。在这样的高并发、高流量场景下,系统的性能和稳定性面临着巨大的挑战。…...
ChatGPT怎么回事?
纯属发现,调侃一下~ 这段时间deepseek不是特别火吗,尤其是它的推理功能,突发奇想,想用deepseek回答一些问题,回答一个问题之后就回复服务器繁忙(估计还在被攻击吧~_~) 然后就转向了GPT…...
离线安装Appium Server
1、问题概述? 安装Appium通常有两种方式: 第一种:下载exe安装包,这种是Appium Server GUI安装方式,缺点是通过命令启动不方便。 第二种:通过cmd安装appium server,可以通过命令方式启动,比较方便。 问题:在没有外网的情况下,无法通过命令在cmd中安装appium server…...
Jetpack ViewModel
private val deviceViewModel: IDeviceViewModel by viewModels<DeviceViewModel>() 这句代码是 Jetpack ViewModel 在 Fragment 或 Activity 中的标准用法,它的作用是 创建并获取 ViewModel 实例,同时确保 ViewModel 的生命周期与 UI 组件保持一…...
2025年2月9日(数据分析,在最高点和最低点添加注释,添加水印)
要在最高点和最低点添加文本注释,可以使用 plt.annotate() 函数。这个函数允许你在图表中的特定位置添加文本注释,并且可以指定箭头指向特定的数据点。 以下是修改后的代码,添加了在最高点和最低点的文本注释: from matplotlib import pyplot as plt from matplotlib imp…...
如何导入第三方sdk | 引入第三方jar 包
0. 背景1. 上传私有仓库2. 使用本地文件系统 0. 背景 对接一些第三方功能,会拿到第三方的sdk,也就是jar包,如何导入呢 1. 上传私有仓库 最好的方式就是将第三方jar包,上传到私有的仓库,这样直接正常在pom引用即可如果只…...
掌握内容中台与人工智能技术的新闻和应用场景分析
内容概要 在当今数字化快速发展的时代,内容中台与人工智能技术的结合为各行各业带来了新的机遇。这一切都源自于对内容生产和管理能力的需求不断提升,尤其在新闻行业中更是如此。内容中台作为一种集中管理内容资源的平台,能够有效整合与调配…...
c#-枚举
//可空类型:int? num 等价 Nullable<int> num Nullable<int> a null; a 99; Console.WriteLine(a);//合并运算符?? : a有值的话,赋值给b int b a ?? 1; Console.WriteLine(b); 枚举成员不能相同,但枚举的值可…...
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…...
【通俗易懂说模型】反向传播(附多元回归与Softmax函数)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
【人工智能】Python中的深度学习优化器:从SGD到Adam
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在深度学习模型的训练过程中,优化器起着至关重要的作用,它决定了模型的收敛速度以及最终的性能。本文将介绍深度学习中常用的优化器,从传…...
仅128个token达到ImageNet生成SOTA性能!MAETok:有效的扩散模型的关键是什么?(卡内基梅隆港大等)
论文链接:https://arxiv.org/pdf/2502.03444 项目链接:https://github.com/Hhhhhhao/continuous_tokenizer 亮点直击 理论与实验分析:通过实验和理论分析建立了潜空间结构与扩散模型性能之间的联系。揭示了具有更少高斯混合模型(G…...
Listener监听器和Filter过滤器
一.监听器 1.是javaweb的三大组件之一,分别是Servlet程序,Listener监听器,Filter过滤器 2.Listener是JvaEE的规范,就是接口,监听器的作用就是监听某种变化(一般是对象创建/销毁,属性变化),触发对应方法完成相应的任务 3.ServletContextListener:/*当一个类实现了ServletContex…...
我的年度写作计划
目录 计算机经典四件 数据结构 计算机网络体系 经典操作系统与计算机架构 嵌入式领域笔记 其他部分 私货部分 笔者打算在这里理一下今年的写作计划,如下所示: 计算机经典四件 数据结构 笔者因为冲刺面试需要,还是要更加扎实的掌握自…...
kafka专栏解读
kafka专栏文章的编写将根据kafka架构进行编写,即先编辑kafka生产者相关的内容,再编写kafka服务端的内容(这部分是核心,内容较多,包含kafka分区管理、日志存储、延时操作、控制器、可靠性等),最后…...
数据库操作与数据管理——Rust 与 SQLite 的集成
第六章:数据库操作与数据管理 第一节:Rust 与 SQLite 的集成 在本节中,我们将深入探讨如何在 Rust 中使用 SQLite 数据库,涵盖从基本的 CRUD 操作到事务处理、数据模型的构建、性能优化以及安全性考虑等方面。SQLite 是一个轻量…...
Linux文件目录基本操作
目录 目录概述相关操作函数相关数据结构体说明 目录概述 什么是目录? 在linux操作系统中其实目录也是一种文件,相对于普通文件,它的存储内容不同,它的存储内容主要是当前目录下的文件以及子目录文件信息。目录就像是一颗大树&a…...
TaskBuilder项目实战:创建项目
用TaskBuilder开发应用系统的第一步就是创建项目,项目可以是一个简单的功能模块,也可以是很多功能模块的集合,具体怎么划分看各位的实际需要,我们一般会将相互关联比较紧密的一组功能模块放到一个独立的项目内,以便打包…...
使用DeepSeek的技巧笔记
来源:新年逼自己一把,学会使用DeepSeek R1_哔哩哔哩_bilibili 前言 对于DeepSeek而言,我们不再需要那么多的提示词技巧,但还是要有两个注意点:你需要理解大语言模型的工作原理与局限,这能帮助你更好的知道AI可完成任务…...
使用Python实现PDF与SVG相互转换
目录 使用工具 使用Python将SVG转换为PDF 使用Python将SVG添加到现有PDF中 使用Python将PDF转换为SVG 使用Python将PDF的特定页面转换为SVG SVG(可缩放矢量图形)和PDF(便携式文档格式)是两种常见且广泛使用的文件格式。SVG是…...
idea整合deepseek实现AI辅助编程
1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号,DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息,File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…...
java文件上传粗糙版
粗糙版图片上传 1.导入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version> </dependency> 2.配置minio地址跟对应的桶 业务层实现类 import io.minio.MinioClient; /…...
一种基于Leaflet.Legend的图例动态更新方法
目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代,地理信息系统(GIS)技术已经广泛应用于各个领域,…...
Vue Dom截图插件,截图转Base64 html2canvas
安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…...
安宝特方案 | AR眼镜:远程医疗的“时空折叠者”,如何为生命争夺每一分钟?
行业痛点:当“千里求医”遇上“资源鸿沟” 20世纪50年代,远程会诊的诞生曾让医疗界为之一振——患者不必跨越山河,专家无需舟车劳顿,一根电话线、一张传真纸便能架起问诊的桥梁。然而,传统远程医疗的局限也日益凸显&a…...
【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Seq2Seq)模型是自然语言处理(NLP)中一项核心技术,广泛应用于机器翻译、语音识别、文本摘要等任务。本文深入探讨Seq2Seq模…...
【批量获取图片信息】批量获取图片尺寸、海拔、分辨率、GPS经纬度、面积、位深度、等图片属性里的详细信息,提取出来后导出表格,基于WPF的详细解决方案
摄影工作室通常会有大量的图片素材,在进行图片整理和分类时,需要知道每张图片的尺寸、分辨率、GPS 经纬度(如果拍摄时记录了)等信息,以便更好地管理图片资源,比如根据图片尺寸和分辨率决定哪些图片适合用于…...
关于32位和64位程序的传参方法及虚拟机调试工具总结
一、传参方法对比 1. 32位程序 系统调用 (Linux) 使用int 0x80指令触发系统调用 寄存器传参顺序: eax 系统调用号 ebx 第1个参数 ecx 第2个参数 edx 第3个参数 esi 第4个参数 edi 第5个参数 普通函数调用 (C语言) 栈传递参数:参数从右向左压栈…...
【Windows】PowerShell 缓存区大小调节
PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2,修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD(按 Win R,输入 cmd)。右键标题栏 → 选择 属性(Properties)…...
查看云机器的一些常用配置
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…...
约克VRF|冬日舒适新标杆,温暖每一寸空间
冬天来了,谁不想窝在家里,一边温暖舒适,一边畅享清新空气? 约克VRF中央空调——用科技为你打造全方位的冬季理想生活! 地暖空调二合一,暖从足起,养生更健康~ 普通取…...
【AI学习】关于 DeepSeek-R1的几个流程图
遇见关于DeepSeek-R1的几个流程图,清晰易懂形象直观,记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》, 文章链接:https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…...
CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据) 标题:CNN卷积神经网络多变量多步预测,光伏功率预测 一、引言 1.1 研究背景及意义 随着全球能源危机的加剧和环保意识的提升ÿ…...
mapbox进阶,添加绘图扩展插件,绘制圆形
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
学习TCL脚本基础语法的几个步骤?
文章目录 前言1. 命令和参数1.1 Tcl 命令的基本结构1.2 示例1.2.1 puts 命令1.2.2 set 命令1.2.3 if 命令1.2.4 foreach 命令 1.3 参数的类型1.3.1 字符串1.3.2 变量1.3.3 表达式1.3.4 列表1.3.5 字典 1.4 命令的嵌套 二、变量1. 声明变量2. 使用变量3. 变量类型3.1 字符串3.2 …...
move_base全局路径规划震荡之参数调优
在使用 move_base 进行导航时,如果全局路径规划在遇到障碍物时频繁在障碍物左右两侧跳变,导致机器人绕障失败,通常可以通过调整参数优化来解决。以下是具体原因分析和解决方案: 问题原因分析: 全局路径规划的震荡&…...
Could not create task ‘:mainActivity:minifyReleaseWithR8‘.
最近接收了一个老项目,把项目clone下来后,总是报错,无法运行 Build-tool 33.0.1 is missing DX at D:\Android\Sdk\build-tools\33.0.1\dx.batFAILURE: Build failed with an exception.* What went wrong: Could not determine the depende…...
保姆级教程Docker部署Zookeeper官方镜像
目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…...
人工智能-A* 算法与机器学习算法结合
以下将为你展示如何将 A* 算法与机器学习算法(这里以简单的神经网络为例)结合实现路径规划。我们会先使用 A* 算法生成一些路径规划数据,然后用这些数据训练一个简单的神经网络,让神经网络学习如何预测路径。最后,将训…...
如何在Python中使用Requests库?
在Python中,网络请求处理是很多应用开发中的常见需求。Requests库作为Python中最常用的第三方库之一,它能够简化HTTP请求的发送和响应的处理。无论是获取网页内容、与API接口交互,还是提交表单数据,Requests都可以帮助开发者轻松实…...
通过命令行运行py文件与通过ide运行py文件,对文件中模块的引用方式的影响
通过命令行运行 Python 文件和通过 IDE 运行 Python 文件时,模块的引用方式 会受到一些影响,主要体现在 工作目录 和 模块导入路径(sys.path)的设置上。下面详细介绍这两种方式的区别和它们如何影响模块引用。 1. 通过命令行运行…...
如何避免大语言模型中涉及丢番图方程的问题
希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...
重新刷题求职2-DAY7
1.454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&#…...
Day 32 卡玛笔记
这是基于代码随想录的每日打卡 455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸ÿ…...
android studio无痛入门
在Android Studio中创建和管理项目主要涉及以下几个步骤: 1. 创建新项目 打开Android Studio,点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板,例如“Empty Activity”࿰…...
flutter安卓打包签名
flutter安卓打包签名 1.创建签名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一个用于管理密钥和证书的命令行工具,通常与 Java 开发工具包 (JDK) 一起使用。my-release-…...
Windows编程:下载与安装 Visual Studio 2019
本节前言 在写作本节的时候,本来呢,我正在写的专栏,是 MFC 专栏。而 VS2010 和 VS2019,正是 MFC 学习与开发中,可以使用的两款软件。然而呢,如果你去学习 Windows API 知识的话,那么࿰…...
ElementUI的<el-image>组件引用网络图片加载失败
1. 验证图片 URL 是否有效 直接访问图片链接,确保 URL 正确且可公开访问 如果浏览器无法加载图片,可能是图片服务器限制了外链或已失效。 解决方法:更换为可用的图片 URL。 2. 检查浏览器开发者工具 打开浏览器开发者工具(F12…...
GitHub Pages + Jekyll 博客搭建指南(静态网站)
目录 🚀 静态网站及其生成工具指南🌍 什么是静态网站?📌 静态网站的优势⚖️ 静态网站 VS 动态网站 🚀 常见的静态网站生成器对比🛠️ 使用 GitHub Pages Jekyll 搭建个人博客📌 1. 创建 GitHu…...