KubeVirt uses custom virtual machines

背景 翻了一下笔记,2023年底接触了kubevirt 这个k8s下的虚拟机项目,当时也只是简单的部署以及使用现有的几个镜像,2024年也断断续续使用过几次,直到今年2025年8月再次接触,制作了自己的镜像才算基本搞通了这个kubevirt 的使用,时间跨度有点大,这里记录一下。 准备工作 kvm 虚拟化 物理机ubuntu 系统 apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -y 虚拟机 ubuntu 系统 apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y 虚拟机 rockylinux 系统 yum install -y qemu-kvm libvirt virt-install bridge-utils 嵌套虚拟化 如果测试机器本身是虚拟机,则还有一个工作,开启嵌套虚拟化。 修改 grub 设置 安装了前面的几个kvm 相关包之后,还需要修改 grub 设置。 vi /etc/default/grub 加上最后1部分 GRUB_CMDLINE_LINUX=”crashkernel=auto Read more…

yq用法

yq介绍 在开始使用yq之前,我们首先需要安装它。当你在谷歌上搜索yq时,你会发现两个项目/存储库。 首先,在https://github.com/kislyuk/yq是jq(JSON处理器)的包装器。如果你已经熟悉jq,你可能想抓住这个,使用你已经知道的语法。 不过,在本文中,我们将使用https://github.com/mikefarah/yq 这个版本,这个版本没有100%匹配jq语法,但它的优点是它没有依赖性(不依赖于jq),有关差异的更多上下文,请参阅下面的GitHub问题。 https://github.com/mikefarah/yq/issues/193 mikefarah版本的yq的具体用法参见文档:https://mikefarah.gitbook.io/yq/ 工作实践 业务需求 由于公司产品需要部署在无网环境,所以需要制作适配各个组件的离线安装源,包括rpm/apt之类的系统相关软件包,以及各个二进制/压缩包之类的离线文件,原来是做法是统一将所有的离线源统一整合到一个yml文件当中去,现在的做法是将一个名为packages.yaml的文件放到各个组件的工程里,通过git下载然后进行聚合生成最后的全量列表。 聚合之前,通过生成一个config.yaml来进行选择哪些组件的聚合,下面是全量的配置:

通过流水线传参,生成以分号为分隔符的参数,来自定义生成config_custom.yaml:

解析: 由于yq的contains不支持多个匹配,所以在这里用到了test来测试是否包含以‘|’分隔的多个字符 del的用法: 用del删除之前,先要能查询打印出需要删除的部分,才能进一步使用del删除,如: 如果选择了只生成middleware和paas-installer, 则先查出不包含middleware和paas-installer的部分:

然后调用del删除:

  如果只选择了paas,nginx和redis,则需再次筛选, 只保留middleware大类下的小类,如’redis, nginx’:  

          osInfo=$(awk ‘BEGIN{split(“‘${os_names}’”, arr, “,”);for(key in arr) if(arr[key] ~ “ubuntu”) print arr[key]”:apt”;else print arr[key]”:yum”}’) 最后生成的格式如下:

需要再次通过yq来进行提取过滤: 提取不需要配repo的以及带arch=amd64/x86_64或不带key为arch的列表: Read more…

Linux自动探测网卡名称

Linux上需要自动探测通信的网卡名称,有时会有多网卡 方案一 通过ip命令提取默认路由,来找到默认通信的网卡 获取IP命令:

  获取网卡名称

  方案二 通过ansible_default_ipv4变量 获取IP:

获取网卡名称:

 

Linux使用safe-rm防止误删系统文件

前言 safe-rm 是一款用来替代不安全 rm 的开源软件,可以在 /etc/safe-rm.conf 文件中配置保护名单,定义哪些文件不能被 rm 删除,可用于防止执行 rm -rf 命令导致文件被误删的发生。 安装 safe-rm 工具 0.x版本的是通过shell脚本来实现的,而1.x版本则通过rust来实现的,需要现编译。 0.12版本下载安装:

创建 safe-rm 配置文件,添加保护名单

测试 save-rm 是否生效

  1.1.0版本下载安装: 1.x版本解决了软链接文件的问题,保护目录下的软链接文件也不会被删除。 官网地址是https://launchpad.net/safe-rm/trunk/1.1.0

 

centos7通过snap安装certbot免费获取并自动续期https证书

之前一直使用certbot-auto来获取https证书,后来更换了新域名, 重新生成证书时,报:“Your system is not supported by certbot-auto anymore.”, 查了一下是因为certbot-auto团队没有精力为所有操作系统进行维护,所以包括centos7在内的许多系统已不被支持,目前certbot不推荐在centos7上使用仓库安装,官方建议使用snap进行certbot的安装和更新。官方原文如下: While the Certbot team tries to keep the Certbot packages offered by various operating systems working in the most basic sense, due to distribution policies and/or the limited resources of distribution maintainers, Certbot OS packages often have problems that other Read more…

挂载nfs目录导致 df 命令卡死问题解决

问题: linux服务器挂载了一个含有海量文件的 nfs 目录,当使用 df命令时卡住了? 先确认下是不是这个 nfs 目录的原因,使用strace df -h跟踪一下是哪个系统调用有问题。遇到卡住的地方就会停住

nfsstat -m命令定位一下挂载的目录 结果发现, 服务器是挂载了一台不存在的nfs server导致的 处理: 先查看目录 mount -l 列出挂载的目录 强制卸载目录 umount -f -l 挂载的目录,如:umount -f  -l /data/nfs

mysql 备份和修改表

mysql 备份和修改表

 

使用 GitHub Actions 编译 kubernetes 组件

在使用 kubernetes 过程中由于某些需求往往要修改一下 k8s 官方的源码,然后重新编译才行。本文就以修改 kubeadm 生成证书为默认 100 年为例,来讲解如何使用 GitHub Actions 来编译和发布生成的二进制文件。 构建 clone repo 将 kubernetes 官方源码 fork 到自己的 repo 中

注:如果github上没有相关branch,也需要基于upstream来首先creat一个分支(比如release-1.32) workflow .github/workflows/kubeadm.yaml

build/run.sh : Run a command in a build docker container. Common invocations: build/run.sh make: Build just linux binaries in the container. Pass options Read more…

github的token使用方法

github的token使用方法 今天从本地向github push代码发,失败了。错误消息如下: remote: Support for password authentication was remove on August 123, 2021. Please use a personal access token instead. 原因是github不再使用密码方式验证身份,现在使用个人token。 本文记录, 如何生成token 在命令行下怎样使用token github如何生成token github的官方有给出如何生成个人token的文档。参考github官网生成token文档   命令行如何使用token 之前,github使用用户名和密码作为身份验证,现在使用用户名和token作为验证。 比如,github官网给出的示例。克隆一个仓库,提示输入用户名和密码,此处就可以使用上面生成的token作为密码使用。

但是有一个问题,我们总不能记住那么长的一串token吧 为了解决这个问题,github提供了gh工具,通过gh登录验证身份后,之后再不需要验证身份。 此处只演示ubuntu安装gh工具。

然后使用gh进行认证

如下图所示:使用键盘上下键选择对应项,回车键确认。 依次选择Github.com, HTTPS(如果使用的https协议), 选择使用网页浏览器认证或者粘贴token认证,二者选择一个即可。如果是ssh远程登录,命令行中无法打开远程的浏览器,那么只能选择token验证了。选择使用网页认证:先复制命令行中生成的一次性验证码,比如我这里本次是5C38-D954。然后回车,自动打开网页浏览器,输入一次性验证码,授权即可完成认证。如果上面选择使用token认证,那么输入你的token即可。 如果换了一台机器,那么重新生成一个新的token,然后gh auth login即可。

解决ansible mitogen 0.3.0+ 插件未渲染ansible_ssh_common_args模板变量问题

问题 使用ansible mitogen 0.3.4插件进行kubespray安装时,报错: EOF on stream; last 100 lines received:\nssh: Could not resolve hostname {%: Name or service not known 分析 经过debug分析,kubespray-default默认定义了如下变量模板:

但是通过ansible role去执行后,通过mitogen进行ssh并没有渲染出来变量:

可以看到,mitogen的ssh将ansible_ssh_common_args原封不动地输出来了 修改源码验证: 修改transport_config.py, 增加debug信息:

  下面是输出:

  可以看到ssh_common_args变量没有渲染 解决 将_task_vars.get(“vars”, {}) 改为 _task_vars.get(“hostvars”, {}), 从hostvars取值 搜索官方issures: https://github.com/mitogen-hq/mitogen/pull/956 commit ac34252bcccb60b50e6a8ed3a3b2f42d256d62e0 https://github.com/mitogen-hq/mitogen/pull/956/commits/ac34252bcccb60b50e6a8ed3a3b2f42d256d62e0 总结 Read more…