KubeVirt虚拟化管理架构
目录
一. KubeVirt简介
1.1 KubeVirt的价值
1.2 KubeVirt架构
1.3 KubeVirt组件
1.4 KubeVirt流程管理
KubeVirt实战
2.1 Kubevirt安装
2.1.1节点规划
2.1.2 环境准备
2.1.3 安装KubeVirt
2.1.4 安装CDI
2.1.5 安装virtctl命令工具
2.1.6 生成官方虚拟机
2.1.7 进入虚拟机控制台
2.2 KubeVirt基本命令
2.2.1 创建、列出VM
2.2.2 启动、查看VM
2.2.3 暂停、取消暂停命令
2.2.4 重启、删除VM
2.3 KubeVirt运行策略
2.3.1 容器与虚拟机的统一管理
2.3.2 Kubernetes 与虚拟化的结合
2.4 KubeVirt 存储
2.4.1 KubeVirt 存储类型
2.5 KubeVirt 网络
2.5.1 KubeVirt 网络架构
2.5.2 KubeVirt网络模式
2.5.3 KubeVirt插入方式
2.5.4 KubeVirt卷的类型
一. KubeVirt简介
KubeVirt 是Red-Hat开源的,以容器方式运行的虚拟机项目,旨在将虚拟机(VM)引入 Kubernetes 集群,使用户能够在 Kubernetes 上管理和运行虚拟机,就像管理容器一样。KubeVirt 提供了一种将虚拟机作为 Kubernetes 资源进行管理的方式,从而实现了容器和虚拟机的统一管理
1.1 KubeVirt的价值
什么是kubevirt的价值?就好比说我们为什么需要kubevirt ?
说到这里就不得不说kubernetesl,Kubernetes 是一个强大的容器编排平台,提供了自动化的部署、扩展和管理容器化应用的能力。它的优势包括高可用性、可伸缩性、自我修复能力等,使得越来越多的开发团队选择采用 Kubernetes。
但是,在 Kubernetes 出现之前,虚拟化技术(如 VMware、KVM 等)已经广泛使用。许多关键业务应用和遗留系统都运行在虚拟机上。
虽然 Kubernetes 有许多更好的优势,但并不是所有的应用都能轻松地迁移到容器中。一些复杂的应用、依赖于特定操作系统或硬件的应用、以及需要长期稳定运行的生产系统,可能不适合直接容器化
至此,kubevirt应运而生,kubevirt试图解决有些基于虚拟化的工作负载难以实现容器化的情景
统一管理:KubeVirt 允许用户在同一 Kubernetes 集群中同时管理容器和虚拟机,简化了多工作负载的管理。
兼容 Kubernetes:KubeVirt 完全遵循 Kubernetes 的设计理念,使用相同的 API 和工具链。
灵活的虚拟化:KubeVirt 支持多种虚拟化技术,如 QEMU/KVM,提供了丰富的虚拟机配置选项。
网络和存储集成:KubeVirt 与 Kubernetes 的网络和存储插件无缝集成,支持多种网络和存储方案。
自动化和扩展:KubeVirt 支持自动化部署和扩展虚拟机,可以利用 Kubernetes 的原生功能进行滚动更新和回滚
KubeVirt的应用
Kubecirt是如何应用在kubernetes中?
Kubevirt是通过Kubernetes的自定义资源来定义API资源来扩展的。主要添加了额外的虚拟化资源类型,特别是VMI, VM类型的API资源。然后可以通过kubectl工具去管理这些API资源 (也是说我们通过CRD进行增加关于虚拟机的资源类型,然后通过写YAML的形式来创建虚拟机等一系列的操作)
本身扩展这些资源需要运行额外的控制器和代理,这些控制器和代理都是由Kubevrit来提供。
1.2 KubeVirt架构
KubeVirt 的核心功能是在 Kubernetes 上运行和管理虚拟机。
KubeVirt 定义了一套 Kubernetes 原生的虚拟化 API,让用户可以像使用 Pod 和 Deployment 一样使用 VirtualMachine 和 VirtualMachineInstance 来定义和管理虚拟机。VirtualMachine 是一种声明式的资源类型,表示一个期望的虚拟机状态。VirtualMachineInstance 是一种实时的资源类型,表示一个正在运行的虚拟机实例。用户可以通过 YAML 文件或者 kubectl 命令来创建,更新,删除或者查询这些资源
KubeVirt 实现了一套虚拟化运行时,让用户可以在 Kubernetes 集群中的任何节点上运行和管理虚拟机。
这里还有一个简化版的架构图,Agent就是virt-hander
1.3 KubeVirt组件
通过上一节对kubevirt架构的了解,我们可以发现支撑整个系统架构运行的主要组件有以下几种:
virt-api
kubevirt是以CRD形式去管理vm pod, virt-api就是所有虚拟化操作的入口,包括常规的CRD更新验证以及vm start、stopvirt-controlller
Virt-controller会根据vmi CRD,生成对应的virt-lancher pod,并维护CRD的状态virt-handler
Virt-handler会以Daemonset形式部署在每个节点上,负责监控节点上每个虚拟机实例状态变化,一旦检测到状态变化,会进行响应并确保相应操作能达到所需(理想)状态。Virt-handler保持集群级VMI Spec与相应libvirt域之间的同步;报告Libvirt域状态和集群Spec的变化;调用以节点为中心的插件以满足VMI Spec定义的网络和存储要求。virt-launcher
每个virt-lanuncher pod对应着一个VMI, kubelet只是负责virt-lanuncher pod运行状态,不会去关心VMI创建情况。virt-handler会根据CRD参数配置去通知virt-lanuncher去使用本地libvirtd实例来启动VMI, virt-lanuncher就会如果pid去管理VMI,pod生命周期结束,virt-lanuncher也会去通知VMI去终止。每个virt-lanuncher pod对应一个libvirtd,virt-lanuncher通过libvirtd去管理VM的生命周期,这样做到去中心化,不再是以前虚拟机那套做法,一个libvirtd去管理多个VM。
virtctl
virctl 是kubevirt自带类似kubectl命令,它是越过virt-lancher pod这层去直接管理vm,可以控制vm 的start、stop、restart。
1.4 KubeVirt流程管理
KubeVirt 管理虚拟机的方式基于 Kubernetes 的架构和功能,提供了一套完整的虚拟机生命周期管理解决方案。
自定义资源定义(CRDs)
KubeVirt 使用 Kubernetes 的自定义资源定义(CRDs)来描述虚拟机及其状态。主要的 CRDs 包括:
- VirtualMachine:定义虚拟机的配置,例如 CPU、内存、存储和网络设置。
- VirtualMachineInstance (VMI):表示实际运行的虚拟机实例,包含当前的运行状态和配置信息。
镜像管理
- 虚拟机镜像以容器镜像的形式存放在镜像仓库中,支持多种格式(如
qcow2
、raw
)。 - 用户可以通过 Dockerfile 将虚拟机镜像制作成容器镜像,并推送到不同的 registry。
- 创建虚拟机时,系统根据配置优先级从可用的 registry 中拉取镜像,以确保高可用性。
虚拟机创建流程
- 创建 VMI:用户通过 Kubernetes API 创建
VirtualMachine
资源,这将生成一个 VMI CRD 对象。 - 生成 Pod 规范:KubeVirt 的
virt-controller
监听到 VMI 创建事件,生成相应的virt-launcher
Pod 规范。 - 启动虚拟机实例:
virt-controller
创建virt-launcher
Pod,virt-handler
负责与该 Pod 通信并启动虚拟机。
虚拟机镜像以容器镜像的形式存放在镜像仓库中。
创建过程如下:将 Linux 发行版的镜像文件放置在基础镜像的 /disk
目录下,支持的镜像格式包括 qcow2
、raw
和 img
。通过 Dockerfile 将虚拟机镜像构建为容器镜像,并将其推送到不同的 registry 镜像仓库。在创建虚拟机时,系统根据配置的优先级策略从 registry 中拉取相应的虚拟机容器镜像。如果某个 registry 出现故障,系统会自动从其他健康的 registry 拉取镜像
数据卷管理
- DataVolume:在创建 VMI 之前,通常需要创建
DataVolume
。- CDI(Containerized Data Importer)组件负责创建 PVC,并通过临时 Importer Pod 从镜像仓库拉取镜像,将其绑定到 DataVolume。
- 镜像被转换成
disk.img
文件,存储在 PV 中供虚拟机使用。
生命周期管理
- 状态监控:KubeVirt 监控虚拟机的运行状态,提供以下主要状态:
- 未初始化:VMI 已创建,但尚未启动。
- 初始化中:虚拟机正在启动。
- 运行中:虚拟机成功启动并正常运行。
- 停止:用户停止虚拟机,状态更新。
- 故障:虚拟机发生错误,需要用户介入。
运行时管理
- 虚拟机操作:用户可以通过 kubectl 或 API 进行操作,例如启动、停止、重启、迁移、快照和克隆虚拟机。
- 状态同步:VMI 不断与
virt-launcher
Pod 进行状态同步,确保虚拟机状态与用户操作一致。
监控与日志
- KubeVirt 可以与监控工具(如 Prometheus 和 Grafana)集成,提供实时的虚拟机性能监控和告警功能。
- 日志信息可以通过 Fluentd 等工具集中管理,便于故障排查和审计
KubeVirt实战
2.1 Kubevirt安装
部署所需的yaml包,可自行下载
联合出品合作人:MarkSea
网站:锦梦思隅
2.1.1节点规划
3个kubernetes节点,操作系统为Rocky9.4,kubernetes版本v1.27.1
主机 | 节点 | CPU/内存/磁盘 | IP |
Master | 集群master节点 | 4C/8G/100G | 192.168.2.41 |
Node1 | 集群node1节点 | 4C/8G/100G | 192.168.2.41 |
Node2 | 集群node2节点 | 4C/8G/100G | 192.168.2.41 |
前置要求
在开始之前需要满足一些要求
1. Kubernetes集群或衍生产品(例如OpenShift)基于 KubeVirt 版本发布时发布的最新三个 Kubernetes 版本之一2. Kubernetes apiserver 必须具有--allow-privileged=true才能运行 KubeVirt 的特权 DaemonSet3. kubectl客户端实用程序
版本支持矩阵
kubevirt与kubernetes版本兼容性如下表所示:
注意: EOL表示 Kubernetes 版本受 KubeVirt 支持,但已达到生命周期终点
2.1.2 环境准备
3台节点均要执行以下操作
安装所需的软件包
[root@k8s-master ~]# sudo dnf install -y qemu-kvm libvirt virt-install
在执行这下一步之前,先要确保自己的CPU是否已经打开硬件虚拟化功能(CUP是否支持硬件虚拟化可在电脑官方查询)。
硬件虚拟化打开之后,在vmware中。虚拟机选项卡----设置-----处理器----虚拟化引擎,如图2-1,三个选项均要勾选。
查看是否支持虚拟化功能(三台节点均要支持虚拟化功能)
若硬件不支持则需使用软件模拟虚拟化
[root@k8s-master ~]# virt-host-validate qemu
2.1.3 安装KubeVirt
将准备好的yaml包上传到master节点
应用kubevirt-operator.yaml包
[root@k8s-master ~]# kubectl apply -f kubevirt-operator.yaml
查看pod运行状态
[root@k8s-master ~]# kubectl get pods -n kubevirt
应用kubevirt-cr.yaml包
[root@k8s-master ~]# kubectl apply -f kubevirt-cr.yaml
[root@k8s-master ~]# kubectl get pods -n kubevirt
2.1.4 安装CDI
应用cdi的2个yaml包
[root@k8s-master ~]# kubectl apply -f cdi-operator.yaml
[root@k8s-master ~]# kubectl apply -f cdi-cr.yaml
查看pod状态
[root@k8s-master ~]# kubectl get pods -n cdi
2.1.5 安装virtctl命令工具
为适配K8S版本,此处安装版本为 V1.2.1
[root@k8s-master ~]# export RELEASE=V1.2.1
[root@k8s-master~]# wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/virtctl-${RELEASE}-linux-amd64
将下载好的安装包移动到/usr/local/bin/virtctl目录下,并给予该目录权限
[root@k8s-master~]# mv virtctl-${RELEASE}-linux-amd64 /usr/local/bin/virtctl
[root@k8s-master ~]# chmod +x /usr/local/bin/virtctl
查看virtctl版本,说明安装成功
[root@k8s-master ~]# virtctl version
2.1.6 生成官方虚拟机
下载官方的vm.yaml文件
[root@k8s-master ~]# wget https://kubevirt.io/labs/manifests/vm.yaml
[root@k8s-master ~]# kubectl apply -f vm.yaml
启动虚拟机
[root@k8s-master ~]# kubectl get vm
[root@k8s-master ~]# virtctl start testvm
查看vmi资源 /mnt/nfs_share
[root@k8s-master ~]# kubectl get vmi
2.1.7 进入虚拟机控制台
[root@k8s-master ~]# virtctl console testvm
login as 'cirros' user. default
password: 'gocubsgo'. use 'sudo' for root.
根据上面提供的用户/密码进行登录
Ctrl+ ] 退出此虚拟机
2.2 KubeVirt基本命令
在 KubeVirt 中创建虚拟机(VM)通常需要使用 virtctl 命令行工具。
在上面部署KubeVirt中就已经安装过了,下面简单列出安装命令
[root@k8s-master ~]# export RELEASE=V1.2.1
[root@k8s-master~]# wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/virtctl-${RELEASE}-linux-amd64
查看virtctl版本,说明安装成功
[root@k8s-master ~]# virtctl version
2.2.1 创建、列出VM
方便实验,先创建一个vm-fedora.yaml文件,内容如下
[root@k8s-master ~]# vm-fedora.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:name: my-vmnamespace: default
spec:running: falsetemplate:spec:domain:resources:requests:memory: 1024Mdevices:disks:- name: containerdiskdisk:bus: virtio- name: cloudinitdiskdisk:bus: virtiovolumes:- name: containerdiskcontainerDisk:image: kubevirt/fedora-cloud-container-disk-demo:latest- name: cloudinitdiskcloudInitNoCloud:userDataBase64: SGkuXG4=
创建VM
[root@k8s-master ~]# kubectl apply -f vm-fedora.yaml
列出创建的VM
[root@k8s-master ~]# kubectl get vm
2.2.2 启动、查看VM
启动VM
[root@k8s-master ~]# virtctl start testvm
[root@k8s-master ~]# virtctl start my-vm
查看VM和VMI
[root@k8s-master ~]# kubectl get vm
[root@k8s-master ~]# kubectl get vmi
2.2.3 暂停、取消暂停命令
暂停VM
[root@k8s-master ~]# virtctl pause vm my-vm
或
[root@k8s-master ~]# virtctl pause vmi my-vm
查看暂停后的VMI状态
[root@k8s-master~]# kubectl get vmi
取消暂停VM
[root@k8s-master~]# virtctl unpause vm my-vm
或
[root@k8s-master~]# virtctl unpause vmi my-vm
2.2.4 重启、删除VM
重启VM
[root@k8s-master~]# virtctl restart my-vm
删除VM
[root@k8s-master~]# kubectl delete -f vm-fedora.yaml
2.3 KubeVirt运行策略
KubeVirt 遵循 Kubernetes 的惯例,通常包含 spec
(规范)和 status
(状态)两个部分。spec
是可配置的部分,允许用户以声明式的方式指定集群所需的最终状态。而 status
部分则是不可配置的,它反映了集群中资源的实际状态。简而言之,用户编辑 spec
,控制器则负责更新 status
。
running
字段
在 KubeVirt 中,running
字段位于 VM 的 spec
中,这并不能直接反映 VM 的实际运行状态。因此,即使 spec.running
设置为 true
,也不能保证 VM 实际上正在运行。
runStrategy
如果我们通过客户端关闭 VM,KubeVirt 会重新生成 VM!虽然在高可用性用例中这是合理的,但在大多数情况下,这会导致不必要的混淆。关闭 VM 并不等同于重新启动。
为了解决这些问题,KubeVirt 决定废弃 running
字段,并引入了一个新的字段——runStrategy
。通过使用 runStrategy
,用户状态的变化更大,这与系统实际提供的状态是分离的,因为它们有一些重叠的条件。
目前支持的四种运行策略如下:
Always:如果 VM 因任何原因停止,将生成一个新的实例。
RerunOnFailure:如果 VM 在错误状态下结束执行,将生成一个新的实例。如果用户手动停止 VM,则不会生成新的实例。
Manual:KubeVirt 不会尝试自动启动或停止 VM。用户必须通过 API 调用 start、stop 或 restart 来手动更改 VM 的状态。virtctl 命令行客户端也提供了相应的命令。
Halted:如果 VM 正在运行,它将被停止,并保持关闭状态
为了更直观的感受,我们可以创建一个 Always运行策略的 VM 示例
[root@k8s-master ~]# cat vm-f.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:labels:kubevirt.io/vm: vm-fedoraname: vm-fedora
spec:runStrategy: Alwaystemplate:metadata:labels:kubevirt.io/vm: vm-fedoraspec:domain:resources:requests:memory: 1Gidevices:disks:- name: containerdiskdisk:bus: virtiovolumes:- name: containerdiskcontainerDisk:image: kubevirt/fedora-cloud-container-disk-demo:latest- name: cloudinitdiskcloudInitNoCloud:userDataBase64: SGkuXG4=
创建、查看VM
[root@k8s-master~]# kubectl delete -f vm-fedora.yaml
[root@k8s-master ~]# kubectl get vm
[root@k8s-master ~]# kubectl get vmi
除此之外,virtctl的start、stop和restart方法会调用VM的子资源会对VM的运行策略产生的影响
运行策略 | 方法 | 影响 |
Always | start | 确保 VM 处于运行状态,不会改变现有策略 |
stop | 暂时停止 VM,但 KubeVirt 会立即重新启动它 | |
restart | 重启 VM,不会改变现有策略 | |
RerunOnFailure | start | 确保 VM 处于运行状态,不会改变现有策略 |
stop | 暂时停止 VM,如果 VM 是因为错误状态停止的,KubeVirt 会重新启动它 | |
restart | 重启 VM,不会改变现有策略 | |
Manual | start | 使 VM 进入运行状态,状态仍受手动控制 |
stop | 使 VM 进入停止状态,状态仍受手动控制 | |
restart | 重启 VM,状态仍受手动控制 | |
Halted | start | 临时覆盖 Halted 策略,使 VM 进入运行状态 |
stop | VM 已经处于停止状态,不会改变现有策略 | |
restart | 使 VM 进入运行状态,但不会改变现有策略 |
2.3.1 容器与虚拟机的统一管理
KubeVirt 是一个基于 Kubernetes 的扩展项目,旨在实现对虚拟机(VM)和容器的统一管理。通过将虚拟机作为 Kubernetes 中的原生资源(Custom Resources),KubeVirt 使得虚拟机可以像容器一样进行管理,允许用户在同一平台上运行容器化应用和传统虚拟化工作负载。
传统的虚拟化技术(如 KVM)和容器技术(如 Docker)在管理、调度和操作方式上存在很大差异。KubeVirt 通过 Kubernetes 提供的资源调度、自动化扩展、集群管理等能力,解决了这些差异,并提供了跨虚拟机与容器的统一平台。
2.3.2 Kubernetes 与虚拟化的结合
Kubernetes 是一个开源的容器编排平台,主要用于管理容器化应用的部署、扩展、负载均衡等。它通过一组统一的 API 让开发者和运维人员能够以声明式的方式管理应用。
虚拟化技术(如 QEMU/KVM)则提供了独立的操作系统实例,通常用于运行传统的非容器化应用。虚拟化技术与 Kubernetes 结合时,KubeVirt 充当桥梁,实现容器与虚拟机资源的统一调度。
通过在 Kubernetes 中引入虚拟机,用户能够将现有的虚拟机基础设施与新兴的容器化工作负载无缝集成,从而简化集群管理,提高资源利用率
使用 KubeVirt 管理虚拟机与容器,提供对容器化和虚拟化工作负载的统一管理
我们可以动手感受一下,先创建一个虚拟机以及一个容器
[root@k8s-master ~]# cat vm.gl.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:name: test-vmnamespace: default
spec:running: false # 保持为 false,允许手动启动template:metadata:labels:kubevirt.io/vm: test-vmspec:domain:cpu:cores: 2memory:guest: 2Gi # 设置虚拟机的内存为 2Gidevices:disks:- disk:bus: virtioname: disk0volumes:- name: disk0containerDisk:image: quay.io/kubevirt/cirros-registry-disk-demo
[root@k8s-master ~]# kubectl create -f vm.gl.yaml
查看虚拟机的状态(这里我们可以想想为什么可以用kubectl直接来查看虚拟机)
[root@k8s-master ~]# kubectl get virtualmachines -n default
访问虚拟机控制台
[root@k8s-master ~]# virtctl console test-vm
创建容器应用
[root@k8s-master ~]# cat app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
[root@k8s-master ~]# kubectl create -f app-deployment.yaml
查看容器的运行状态
[root@k8s-master ~]# kubectl get pods -n default
通过上面的示例,我们可以发现,通过 KubeVirt,你可以使用 kubectl
来管理虚拟机和容器资源。虽然 Kubernetes 本身并不支持原生的虚拟机管理,但是 KubeVirt 扩展了 Kubernetes,使其能够像管理容器一样管理虚拟机。
那如果我们没有安装KubeVirt,去查看集群内是否有虚拟机会出现什么
[root@k8s-master ~]# kubectl get virtualmachines -A
系统会提示你,Kubernetes API 服务器没有找到 virtualmachines 资源类型,这就要我们安装KubeVirt服务了
2.4 KubeVirt 存储
KubeVirt 是一个在 Kubernetes 上运行虚拟机的插件,可以使我们在 Kubernetes 环境中管理虚拟机(VM)。在运行虚拟机的过程中,存储是一直是至关重要的组件,它确保了虚拟机数据的持久化与高效管理。KubeVirt 使用 Kubernetes 的持久存储卷(Persistent Volume, PV)和持久卷声明(Persistent Volume Claim, PVC)来管理存储资源,允许用户为虚拟机提供持久存储,以便虚拟机重启或迁移时不会丢失数据。
2.4.1 KubeVirt 存储类型
持久卷(Persistent Volume, PV)
持久卷是一种存储资源的抽象,可以在 Kubernetes 集群中定义、提供,并可以被 Pod 或虚拟机使用。KubeVirt 支持各种类型的 PV,比如 NFS、Ceph、iSCSI、AWS EBS、GCE Persistent Disk 等。
持久卷声明(Persistent Volume Claim, PVC)
PVC 是用户对存储资源的请求,用户可以声明需要的存储大小和访问模式。KubeVirt 可以通过 PVC 绑定到相应的 PV 上,确保虚拟机使用的存储符合需求。
DataVolume
KubeVirt 提供了 DataVolume 资源作为 PVC 的一种抽象层,用来帮助用户更容易管理 VM 的存储数据。DataVolume 可以与外部存储(比如 HTTP、S3、Registry)进行数据导入,实现自动创建和管理 PVC
2.4.2 KubeVirt存储访问模式
KubeVirt 支持三种主要的存储访问模式:
ReadWriteOnce (RWO):单个节点可以读取和写入
ReadOnlyMany (ROX):多个节点可以只读访问
ReadWriteMany (RWX):多个节点可以读写访问
示例:创建本地存储
创建一个本地存储目录
[root@k8s-master ~]# sudo mkdir -p /mnt/local-storage
[root@k8s-master ~]# sudo chmod 777 /mnt/local-storage
创建一个 PersistentVolume (PV) 配置文件 local-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: local-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/local-storagenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- <NODE_NAME>
应用配置
[root@k8s-master ~]# kubectl apply -f local-pv.yaml
创建一个 StorageClass 配置文件 local-storage-class.yaml
[root@k8s-master ~]# vi local-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
应用配置
[root@k8s-master ~]# kubectl apply -f local-storage-class.yaml
创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-pvc
spec:accessModes:- ReadWriteOncestorageClassName: local-storageresources:requests:storage: 5Gi
创建文件后,应用配置
[root@k8s-master ~]# kubectl apply -f pvc.yaml
查看PV和PVC是否绑定成功
如果绑定成功,STATUS
应该显示为 Bound
[root@k8s-master ~]# kubectl get pv my-pv
[root@k8s-master ~]# kubectl get pvc my-vm-pvc
创建虚拟机并绑定PVC
创建vmq.yaml文件定义一个 KubeVirt 虚拟机,并将刚创建的 PVC 挂载为虚拟机的磁盘
[root@k8s-master ~]# vi vmq-yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:name: testvm
spec:running: falsetemplate:spec:domain:resources:requests:memory: 1024Mdevices:disks:- name: containerdiskdisk:bus: virtio- name: datavolumedisk1disk:bus: virtiovolumes:- name: containerdiskcontainerDisk:image: kubevirt/cirros-container-disk-demo:latest- name: datavolumedisk1persistentVolumeClaim:claimName: test-pvc
应用yaml文件并启动虚拟机,验证虚拟机的状态
[root@k8s-master ~]# kubect apply -f vmq-yaml
[root@k8s-master ~]# virtctl start testvmq
进入虚拟机控制台,查看磁盘情况
[root@k8s-master ~]# virtctl console testvm
2.5 KubeVirt 网络
2.5.1 KubeVirt 网络架构
KubeVirt 的网络架构利用 Kubernetes 原生网络模型,并使用虚拟机接口 (VMI) 配置 VM 的网络。KubeVirt 通过 CNI(容器网络接口)插件来实现网络连接,并支持多种网络模式(例如 Pod 网络和多网络)来满足不同需求。
类型 | 描述 |
Pod | 默认 Kubernetes 网络 |
multus | 使用 Multus 提供的辅助网络或当 Multus 定义为默认网络时提供主网络 |
2.5.2 KubeVirt网络模式
KubeVirt 主要支持以下几种网络模式:
Pod 网络(默认模式)
使用 Kubernetes 集群默认的 Pod 网络。
在这种模式下,每个虚拟机(VM)作为一个 Pod 运行,并与 Kubernetes Pod 网络共享 IP 地址。
默认使用 bridge 插入方式,将 VM 接口桥接到 Pod 的虚拟以太网接口上,使其具备 Pod 网络的 IP,且能够与其他 Pod 通信。
多网络模式(Multus CNI 插件)
使用 Multus CNI 插件,可以为每个 VM 配置多个网络接口。
允许 VM 连接到多个网络,实现隔离或独立的网络拓扑。
常用于复杂的网络拓扑设计,比如电信级应用或 NFV(网络功能虚拟化)场景。
SR-IOV 网络
使用 SR-IOV(单根 I/O 虚拟化)直接将物理网卡的虚拟功能分配给 VM,从而实现高性能网络。
适用于对网络性能要求高的场景,如高性能计算、数据密集型应用等。
SR-IOV 需要集群节点和网卡支持 SR-IOV 功能,并使用 SR-IOV CNI 插件。
MACVLAN 网络
MACVLAN 允许多个接口共享一个物理网络接口,但每个接口拥有独立的 MAC 地址和 IP 地址。
在使用 Multus CNI 时,MACVLAN 可以用于将虚拟机直接连接到物理网络。
2.5.3 KubeVirt插入方式
KubeVirt 支持不同的网络接口插入方式,用于将 VM 的网络接口与 Pod 网络接口连接。主要的插入方式包括:
Bridge(桥接)
将 VM 的网络接口桥接到 Pod 的 veth(虚拟以太网)接口上。
适用于默认的 Pod 网络模式,VM 获得 Pod 的 IP 地址,并通过该 IP 与其他资源通信。
Masquerade(伪装)
使用网络地址转换(NAT)将 VM 的私有 IP 地址隐藏在 Pod 的 IP 地址后。
适合需要隔离 VM 网络的场景,通常用于虚拟机作为客户端访问外部服务,而不需要直接被访问的场景。
SR-IOV
直接将 SR-IOV 网卡功能分配给 VM,提供接近物理网络的性能。
2.5.4 KubeVirt卷的类型
cloudInitConfigDrive:在通过给VM挂载一个文件系统,给cloud-init提供meta-data和user-data
cloudInitNoCloud:在通过给VM挂载一个文件系统,给cloud-init提供meta-data和user-data,生成的文件格式与ConfigDrive不同
containerDisk:指定一个包含qcow2或raw格式的Docker镜像,重启VM数据会丢失
dataVolume:动态创建一个PVC,并用指定的磁盘映像填充该PVC,重启vm数据不会丢失。
emptyDisk:从宿主机上分配固定容量的空间,映射到VM中的一块磁盘,与emptyDir一样,emptyDisk的生命周期与VM等同,重启VM数据会丢失。
ephemeral:在VM启动时创建一个临时卷,VM关闭后自动销毁,临时卷在不需要磁盘持久性的任何情况下都很有用。
hostDisk:在宿主机上创建一个img镜像文件给VM使用。重启VM数据不会丢失。
persistentVolumeClaim:指定一个PVC创建一个块设备。重启VM数据不会丢失。
secret:使用Kubernetes的secret来存储和管理一些敏感数据,比如密码,token,密钥等敏感信息,并把这些信息注入给VM,可以动态更新到Pod,但是不能修改Pod中生成的iso文件,更不能更新到VM。要想更新到VM,需重启VM。
configMap:功能类似于secret,把configMap里的信息写入到iso磁盘中,挂给VM。
serviceAccount:功能类似为secret,把serviceAccount里的信息写入到iso磁盘中,挂给VM。
sysprep:以secret或configMap的形式,往VM写入sysprep
示例:创建虚拟机并配置网络
创建一个虚拟机配置文件 vmi.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:name: test-vm
spec:running: falsetemplate:spec:domain:resources:requests:memory: 1024Mdevices:disks:- name: containerdiskdisk:bus: virtiointerfaces:- name: defaultmasquerade: {}networks:- name: defaultpod: {}volumes:- name: containerdiskcontainerDisk:image: kubevirt/cirros-container-disk-demo:latest
创建虚拟机
[root@k8s-master ~]# kubectl apply -f vmi-yaml
启动虚拟机
[root@k8s-master ~]# virtctl start testvm
[root@k8s-master ~]# kubectl get vmi test-vm
验证网络配置
[root@k8s-master~]# kubectl
get vmi test-vm -o jsonpath='{.status.interfaces[0].ipAddress}'
进入虚拟机控制台,验证网络连接
[root@k8s-master ~]# virtctl console test-vm
$ ping -c 3 8.8.8.8
配置多网络接口
安装Multus CNI
[root@k8s-master~]#kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml
[root@k8s-master~]# kubectl get pods -n kube-system | grep multus
创建一个额外的网络配置文件
[root@k8s-master ~]# cat additional-network.yaml
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:name: additional-network
spec:config: '{"cniVersion": "0.3.1","type": "bridge", "bridge": "br0","ipam": {"type": "host-local","subnet": "10.10.0.0/16","rangeStart": "10.10.1.2","rangeEnd": "10.10.3.5","routes": [{ "dst": "0.0.0.0/0" }],"gateway": "10.10.1.1"}}'
应用配置
[root@k8s-master ~]# kubectl apply -f additional-network.yaml
配置虚拟机使用额外网络
修改虚拟机配置文件 vm.yaml
,添加额外网络接口:
[root@k8s-master ~]# cat vmi.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:name: testvm
spec:running: falsetemplate:spec:domain:resources:requests:memory: 1024Mdevices:disks:- name: containerdiskdisk:bus: virtiointerfaces:- name: defaultmasquerade: {}- name: additionalbridge: {}networks:- name: defaultpod: {}- name: additionalmultus:networkName: additional-networkvolumes:- name: containerdiskcontainerDisk:image: kubevirt/cirros-container-disk-demo:latest
重新创建虚拟机
[root@k8s-master ~]# kubectl delete -f vm.yaml
[root@k8s-master ~]# kubectl apply -f vm.yaml
[root@k8s-master ~]# virtctl start testvm
查看虚拟机的运行状态
[root@k8s-master ~]# kubectl get vmi test-vm
验证额外的网络接口
[root@k8s-master~]#kubectl
get vmi testvm -o jsonpath='{.status.interfaces}'
验证虚拟机网络连接
[root@k8s-master ~]# virtctl console test-vm
$ ip addr show
$ ping -c 3 8.8.8.8
相关文章:
KubeVirt虚拟化管理架构
目录 一. KubeVirt简介 1.1 KubeVirt的价值 1.2 KubeVirt架构 1.3 KubeVirt组件 1.4 KubeVirt流程管理 KubeVirt实战 2.1 Kubevirt安装 2.1.1节点规划 2.1.2 环境准备 2.1.3 安装KubeVirt 2.1.4 安装CDI 2.1.5 安装virtctl命令工具 2.1.6 生成官方虚拟机 2.1.7 进…...
游戏引擎学习第202天
调试器:启用“跳转到定义/声明”功能 开始了一个完整游戏的开发过程,并分享了一些实用技巧。首先,讨论了如何在 Visual Studio 中使用“跳转到定义”和“跳转到声明”功能,但当前的项目并未启用这些功能,因为缺少浏览…...
sqlalchemy查询json
第一种:字段op是json格式: {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…...
2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、握手问题-(解析)-简单组合问题(别人叫她 鸽巢定理)😇,感觉叫高级了…...
Linux系统之wc命令的基本使用
Linux系统之wc命令的基本使用 一、命令简介二、基本语法格式三、核心功能选项四、典型使用案例4.1 创建示例文件4.2 基础统计操作4.3 组合选项使用4.4 管道流处理 五、高级应用技巧4.1 递归统计代码行数4.2 统计CSV文件数据量4.3 监控日志增长速率4.4 字符与字节差异说明 七、命…...
SQL Server 2022 脏读问题排查与思考
总结sqlserver的使用,总是会回想起很多开发过程当中加班努(拼)力(命)的场景,今天,就把之前一个由于数据库脏读到这的OA系统员工请假流程状态不一致问题和解决思路分享一下。 业务场景描述 由于…...
Linux系统时间
1. Linux系统时间 jiffies是linux内核中的一个全局变量,用来记录以内核的节拍时间为单位时间长度的一个数值。 jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1。 一个时间节拍的时间取决于操作系统的配置,Linux系统一…...
【Windows批处理】命令入门详解
Windows 批处理(Batch Script)是一种用于在 Windows 操作系统上自动执行命令的脚本语言。它基于 Windows 命令提示符(cmd.exe)并使用 .bat 或 .cmd 文件格式。 一、批处理基础 1. 创建批处理文件 批处理脚本本质上是一组按顺序执…...
fpga系列 HDL:ModelSim 条件断点调试 modelsim支持的tcl语言
条件断点调试配置流程: 触发动作用tcl语言描述,modelsim支持的tcl语言见:https://home.engineering.iastate.edu/~zzhang/courses/cpre581-f08/resources/modelsim_quickguide.pdf 运行效果:...
Linux: network: 两台直连的主机业务不通
前提环境,有一个产品的设定是两个主机之间必须是拿网线直连。但是设备管理者可能误将设置配错,不是直连。 最近遇到一个问题,说一个主机发的包,没有到对端,一开始怀疑设定的bond设备的问题,检查了bond的设置状态,发现没有问题,就感觉非常的奇怪。后来就开始怀疑两个主机…...
虚拟地址空间布局架构
一、内存管理架构 1.Linux内核整体架构以及子系统 内存管理子系统架构分为用户空间、内核空间及硬件部分 3 个层面: 用户空间:应用程序使用malloc()申请内存资源,通过free()释放内存资源。内核空间:内核是操作系统的一部分&…...
在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置
你遇到的大部分ubuntu中配置hadoop的问题这里都有解决方法!!!(近10000字) 概要 在Docker虚拟容器环境下,进行Hadoop-3.2.2分布式集群环境的配置与安装,完成基于Yarn模式的一个Master节点、两个…...
go day 01
go day 01 配置go环境 install go on D:\huang\lang\go\D:\huang\lang\go\bin\go xxx.go # D:\huang\lang\go\bin 设置到环境变量go go version# 创建任意一个目录,创建三个文件夹 # D:\huang\lang\goProject bin、pkg、src # 创建三个系统环境变量 GOROOT GOPATH GOBIN # GOR…...
(二)RestAPI 毛子(Tags)
文章目录 项目地址一、给Habit添加Tags1.1 创建Tags1. 创建一个新的HabitTags实体2. 设置Habit和Tags的关系3. 设置HabitTag表4. 在HabitConfiguration里配置5. 将表添加到EFCore里6. 迁移数据 1.2 给Habit增加/修改标签1. 创建UpsertHabitTagsDto2. 创建查询HabitWithTagsDto3…...
Elasticsearch:使用机器学习生成筛选器和分类标签
作者:来自 Elastic Andre Luiz 探索使用机器学习模型与传统硬编码方法在搜索体验中自动创建筛选器和分类标签的优缺点 筛选器和分类标签是用来优化搜索结果的机制,帮助用户更快速地找到相关内容或产品。在传统方法中,规则是手动定义的。例如…...
Python接口自动化测试之UnitTest详解
↵ 基本概念 UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分test fixture、Te…...
《概率论与数理统计》期末复习笔记_上
目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…...
工程师 - Doxygen介绍
Code Documentation. Automated. Free, open source, cross-platform. Version 1.12.0 is now available! Release date: 7 August 2024 官方网址: Doxygen homepage 文档: Doxygen: Overview Github网址: https://github.com/doxygen/…...
开源且完全没有审核限制的大型语言模型的概述
开源且完全没有审核限制的大型语言模型的概述 关键要点 研究表明,存在多个开源的大型语言模型(LLM)完全没有审核限制,适合开放对话。包括基于 Llama、Mixtral、Phi-2 和 StableLM 的模型,参数范围从 2.78 亿到 4050 亿…...
Qt QTableView QAbstractTableModel实现复选框+代理实现单元格编辑
话不多说,直接看代码 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…...
2025.3.19
1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...
GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议
蓝牙的 GATT(Generic Attribute Profile) 是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议,用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT(Attribute Proto…...
打造下一代智能体验:交互型 AI 的崛起与实践
在人工智能技术不断飞跃的今天,我们正迎来一个从"一问一答"向"多轮交互、智能反馈"转变的新时代——交互型 AI(Interactive AI)。 什么是交互型 AI? 交互型 AI 指的是具备多轮对话能力、状态记忆、工具调用…...
关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析
一、类型定义与字节大小 uint8_t、uint16_t、uint32_t、uint64_t 是 C/C 中定义的无符号整数类型,通过 typedef 对基础类型起别名实现。位宽(bit)和字节数严格固定: uint8_t:8 位,占用 1 字节ÿ…...
19685 握手问题
19685 握手问题 ⭐️难度:简单 🌟考点:2024、省赛、数学 📖 📚 package test ;import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);…...
react redux的学习,单个reducer
redux系列文章目录 一 什么redux? redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。集中式管理react应用中多个组件共享的状 简单来说,就是存储页面的状态值的一个库…...
CCF GESP C++编程 二级认证真题 2025年3月
C 二级 2025 年 03 月 CCF GESP C编程 二级认证真题 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C A A D A D A C B C D B C C 1 单选题 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人&#…...
Lua函数与表+Lua子文件加载与元表
Lua函数相关示例代码 --脚本型语言,不能先调用,再定义,因为代码是从上往下执行的 --第一种声明函数 function func1()print("这是func1") end--先定义,再调用,没有问题 func1() -------------------------…...
Linux systemd 服务全面详解
一、systemd 是什么? systemd 是 Linux 系统的现代初始化系统(init)和服务管理器,替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”,还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...
Linux系统调用编程
目录 1.Linux下进程和线程进程线程区别查看进程pid终止进程pid 2.Linux虚拟内存管理与stm32内存映射设计目标与架构差异地址空间管理机制对比内存使用与性能特性 3.Linux系统调用函数fork()wait()exec() 4.树莓派环境下练习创建账号1创建用户账号2.配置用户权限3.查看用户 登录…...
AWS Langfuse AI用Bedrock模型使用完全教程
AWS Langfuse AI使用完全教程 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 AWS Langfuse AI使用完全教程Langfuse是什么?准备工作创建Langfuse账户1.创建LLM应用程序启用Bedrock…...
【Docker项目实战】使用Docker部署MediaCMS内容管理系统
【Docker项目实战】使用Docker部署MediaCMS内容管理系统 前言一、MediaCMS介绍1.1 MediaCMS 简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载Med…...
OpenHarmony子系统开发 - DFX(一)
OpenHarmony子系统开发 - DFX(一) 一、DFX概述 简介 在OpenHarmony中,DFX(Design for X)是为了提升质量属性的软件设计,目前包含的内容主要有:DFR(Design for Reliability,可靠性)…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
详解数据结构线性表 c++实现
线性表 线性表是一种非常基础且重要的数据结构,它是具有相同数据类型的 n(n≥0)个数据元素的有限序列。这里的 “有限” 意味着元素的数量是确定的,“序列” 则表示元素之间存在着顺序关系。 顺序表 顺序表是线性表的一种顺序存…...
Prolog语言的网络协议栈
Prolog语言的网络协议栈 引言 网络协议栈是现代计算机网络的重要组成部分,它负责在网络中的各个节点之间以标准化的方式传输数据。在这一体系中,不同层次的协议相互协作,以实现从物理传输到应用层数据处理的功能。Prolog是一种以符号逻辑为…...
音视频基础(音频常用概念)
文章目录 **1. 比特率(Bitrate)****概念****影响****音频比特率****视频比特率** **2. 码率(Bitrate)****3. 帧(Frame)****概念****视频帧****音频帧** **4. 帧长(Frame Length)****…...
洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构
题目描述 模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。 输入格式 输入矩阵的规模,不超过 9 9 9。 输出格式 输出矩形和正方形 输入输出样例 输入 4输出 01020304 05060708 09101112 13141516010203040506 …...
【数据结构】邻接表 vs 邻接矩阵:5大核心优势解析与稀疏图存储优化指南
邻接表法 导读一、邻接矩阵的不足邻接表二、存储结构三、算法评价3.1 时间复杂度3.2 空间复杂度 四、邻接表特点4.1 特点解读特点3特点4特点5 结语 导读 大家好,很高兴又和大家见面啦!!! 图作为一种复杂的数据结构,其…...
编程能力的跃迁时刻:技术革命与认知重构的交响曲
在软件开发领域,从业者常将"一万小时定律"视为能力增长的圭臬,但真正的能力跃迁往往发生在特定技术范式转换的临界点。当开发者首次理解递归算法的本质,当面向对象编程替代过程式思维,当自动化工具链重塑开发流程,这些认知地震时刻往往成为技术生涯的分水岭。 …...
PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐
PostIn是一款国产开源免费的接口管理工具,包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块,支持常见的HTTP协议、websocket协议等,支持免登陆本地接口调试,同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…...
删除Linux服务器上多余的系统启动项,并重装Ubuntu系统
问题描述 2024年6月,Centos团队终止维护Centos7系统,Ubuntu成了我的替换方案。正好有一台闲置的服务器,于是我临危受命给这台服务器重装系统。 经过我一番研究,Ubuntu系统初步安装成功了,但是存在一大堆问题ÿ…...
在亚马逊云科技上使用n8n快速构建个人AI NEWS助理
前言: N8n 是一个强大的工作流自动化工具,它允许您连接不同的应用程序、服务和系统,以创建自动化工作流程,并且采用了开源MIT协议,可以放心使用,他的官方网站也提供了很多的工作流,大家有兴趣的…...
JSON介绍及使用
1.JSON 1.JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据序列化协议,基于文本,完全独立于语言。 JSON由键值对组成,支持以下几种数据类型: 字符串:用双引号括起来的文本。 数…...
AOP 的织入过程是怎样的?
AOP(面向切面编程)的织入(Weaving)是将切面(Aspect)应用到目标对象(Target Object)并创建代理对象(Proxy Object)的过程。这个过程可以发生在不同的阶段&…...
链路聚合配置命令
技术信息 加入捆绑组,加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1,不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...
为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?
在机器学习和深度学习中,数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分:训练集、验证集、测试集 目的 训练集(Training Set):用于模型参数的直接训练。验证集(Validati…...
【读书笔记·VLSI电路设计方法解密】问题61:扫描插入的目的是什么
如问题60所述,要构建可测试电路,必须确保电路中每个节点都具有可控性和可观测性。但对于包含时序元件(如触发器、锁存器等存储元件)的电路,若不采取特殊设计则难以实现这两项特性。这是因为时序元件关联节点的逻辑状态不仅取决于当前输入,还受其先前存储状态影响——它们…...
通信数据记录仪-产品概念ID
总结: 1、支持高速CAN、支持容错CAN、支持单线CAN(理解是支持不同的协议,CANFD、CAN2.0和LIN?) 2、 通过上位机设计时间...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...