总篇210篇 2023年第23篇1. 为什么用Kubevirt?随着k8s容器技术的容错性、高可用性、开放性和可扩展性,目前之家核心且重要的业务已全面容器化,然而,在某些场景下,对于一些历史较久改造成本较高的Windows场景,无法满足现有环境迁移,通过技术调研,社区活跃性,以及各大厂的背书,目前采用kubevirt 实现之家业务全面容器化的最后一公里。2. 什么是Kubevirt?2.1概念Kubevirt: 是一个在Kubernetes集群中运行和管理的(RedHat)开源项目,他可以帮助用户在k8s中轻松创建,启动和管理虚拟机,从而实现了之家业务全面容器化和统一管理及运维2.2架构设计该方案设计思想源自于现有openstack 资源快速交付,OS系统盘基于external-snapshotter实现快照克隆,做到系统秒级交付,DATA盘采用PV/PVC 形式通过ceph-csi 管理(创建,扩容,删除),接合现有云主机资源交付流程,通过FSM 状态机实现k8s API与kubevirt CRUD操作,实现资源快速交付。2.3组件说明Virt-api:是一个 RESTful API 服务器,提供了一系列的 API 接口来管理和操作 KubeVirt 中的虚拟机资源,virt-api 支持多种虚拟机资源类型,基于API 进行管理和操作Virt-controller: 负责监控 k8s集群中的虚拟机资源,并根据用户定义的规则自动调整资源分配,负责管理虚拟机生命周期管理,它通过自动化资源分配、弹性扩展、监控和报警等功能Virt-handler: 是 KubeVirt 的一个核心组件,它运行在 k8s 集群中每个节点上,并负责管理和监控节点上的虚拟机资源,监控虚拟机事件,维护节点状态,实现自动化管理和部署Virt-launcher: 负责在 k8s集群中启动和管理虚拟机实例, 通过管理虚拟机生命周期、支持多种虚拟化技术、提供安全性和高可用性等功能Virt-vnc: 是 KubeVirt的一个核心组件,它提供了一种 VNC 远程访问虚拟机的方式,使得用户可以通过 VNC 客户端远程访问和操作虚拟机, 支持多种虚拟化技术、提供安全性和高可用性等功能CDI: (Containerized Data Importer)是 KubeVirt 的一个组件,它提供了一种在 k8s 集群中导入、管理和使用虚拟机镜像的方式Ceph-csi: 是k8s存储插件,它可以将 Ceph 存储集成到 k8s 集群中,并提供了一系列的 API 接口来管理和操作 Ceph 存储并集成到k8s集群中,实现了高效、可靠的存储服务。External-snapshotter:是 k8s 的一个存储插件,它可以将外部存储系统的快照(Snapshot)集成到 k8s 集群中,并通过 API 接口提供了快照管理和操作功能。FSM: 自研分布式状态机,在任意可用区实现资源的创建,调度、打通内部系统,实现多种(虚拟机、实体机,公有云)资源交付。3.如何落地Kubevirt3.1业务需求1.第三方私有化服务,针对特殊license业务迁移2.历史较久改造成本较高的Windows场景3.特定网络专项对接的私有服务4.特定场景的第三方机器学习服务3.2接入流程化?用户->服务器申请工单->隔级审批->资源确认(管理员审批)->资源调度(创建)->完成交付镜像定制化(1)采用kvm相关命令实现基础镜像制作? ? ? ? ? ? 创建基础镜像virt-install?-n?windows2012?-f?/data/centos74.img?-s?120?-r?16384?-v?--vcpus=16?--vnc?---cdrom=/mnt/windows2012?(2)镜像启动virt-install?-n?windows2012?-f?/data/centos74.img?-s?120?-r?16384?-v?--vcpus=16?--vnc?---cdrom=/mnt/windows2012(3)系统标准化完善系统基础服务安装包定制、系统分区、系统安全、内核参数等标准化定制开机启动(init)脚本:实现系统启动后网络配置自动生成,Salt Agent网络可达数据盘格式化:虚拟机交付后可实现PVC 卷格式化并自动挂载/data目录组件标准化因kubevirt 采用组件较多,验证较稳定版本,可上传至内部镜像(harbor)仓库,实现组件版本统一,避免线上自动更新最新版本引起不可逆问题?标准化部署选择版本是需经过多维度测试,建议选择较新且稳定版,避免出现未知问题影响生产业务(1)CDI 部署(采用v1.55.0版本)下载cdi yaml文件
https://github.com/kubevirt/containerized-data-importer/releases/download/v1.55.0/cdi-cr.yamlhttps://github.com/kubevirt/containerized-data-importer/releases/download/v1.55.0/cdi-operator.yaml核心cdi-cry配置针对CDI 核心POD 在Master上运行(占用资源较少且需稳定)spec:imagePullPolicy:?IfNotPresentinfra:nodeSelector:node-role.kubernetes.io/control-plane:?""tolerations:-?key:?CriticalAddonsOnlyoperator:?Exists-?effect:?NoSchedulekey:?node-role.kubernetes.io/master-?effect:?NoSchedulekey:?node-role.kubernetes.io/control-planeworkload:nodeSelector:node-role.kubernetes.io/control-plane:?""tolerations:-?key:?CriticalAddonsOnlyoperator:?Exists-?effect:?NoSchedulekey:?node-role.kubernetes.io/master-?effect:?NoSchedulekey:?node-role.kubernetes.io/control-planecdi-operator.yaml 修改namespace 为kubevirtcdi-operator镜像地址设置为私有镜像仓库地址? ? ? 创建服务Kubectl?apply?-f?cdi-operator.yamlKubectl?apply?-f?cdi-cr.yaml? ? ? 检查服务Kubevirt 部署? ? ? ?下载yaml文件
https://github.com/kubevirt/kubevirt/releases/download/v0.55.2/kubevirt-cr.yamlhttps://github.com/kubevirt/kubevirt/releases/download/v0.55.2/kubevirt-operator.yaml ? ? ?修改kubevirt-cr 配置(核心POD 在master运行,Workloads运行独立BIZ-kubevirt标签)spec:certificateRotateStrategy:?{}configuration:developerConfiguration:featureGates:?[]customizeComponents:?{}imagePullPolicy:?IfNotPresentimageregistry: ts3.harbor.com.cn/kubernetes/kubevirtinfra:nodePlacement:nodeSelector:node-role.kubernetes.io/control-plane:?""workloads:nodePlacement:nodeSelector:node-role.kubernetes.io/BIZ-Kubevirt:?"true"?workloadUpdateStrategy:?{}? ? ? ? ?修改kubevirt-operator 私有镜像地址? ? ? ? ?创建服务Kubectl?apply?-f?kubevirt-operator.yamlKubectl?apply?-f?kubevirt-cr.yaml? ? ? ? ?检查服务Ceph-csi 部署Ceph RBD 集群环境部署暂且不在论述,通过ceph csi实现Ceph 存储并集成到k8s集群,管理 pod/vmi pvc存储应用? ? ?Kubevirt pool 创建ceph?osd?pool?create?kubevirt?1024? ? ?创建Ceph rbd Key 实现k8s对RBD 管理ceph?auth?get-or-create?client.kubevirt?mon?'profile?rbd'?osd?'profile?rbd?pool=kubevirt'?mgr?'profile?rbd?pool=kubevirt'? ? ?获取kubevirt keyceph?auth?ls?|grep?kubevirt?-A?1ceph csi 相关配置? 下载ceph-csi包wget?
https://github.com/ceph/ceph-csi/archive/refs/tags/v3.7.2.tar.gz?tar?-xzvf?v3.7.2.tar.gz?cd?./ceph-csi-3.7.2/deploy/rbd/kubernetes? ? ?配置csi-config-map.yamlapiVersion:?v1kind:?ConfigMapdata:config.json:?|-[{"clusterID":?"ceph?集群ID","monitors":?["ceph?集群Mon服务端口"]}]metadata:name:?ceph-csi-config?namespace:?csi? ? ? ? ? ? ?Csi-rbd-sc配置apiVersion:?storage.k8s.io/v1kind:?StorageClassmetadata:?name:?csi-rbd-scprovisioner:?rbd.csi.ceph.comparameters:?clusterID:?Ceph集群ID?pool:?kubevirt?imageFeatures:?layering?csi.storage.k8s.io/provisioner-secret-name:?csi-rbd-secret?csi.storage.k8s.io/provisioner-secret-namespace:?csi?csi.storage.k8s.io/controller-expand-secret-name:csi-rbd-secret?csi.storage.k8s.io/controller-expand-secret-namespace:?csi?csi.storage.k8s.io/node-stage-secret-name:?csi-rbd-secret?csi.storage.k8s.io/node-stage-secret-namespace:?csi?csi.storage.k8s.io/fstype:?xfsreclaimPolicy:?DeleteallowVolumeExpansion:?truemountOptions:?-?discard ? ? ? ? ? ? Csi rbd secret 配置,userKey 可通过ceph auth获取apiVersion:?v1kind:?Secretmetadata:name:?csi-rbd-secretnamespace:?csistringData:userID:?kubevirt?userKey:?xx-xxx-xxx?#通过命令获取:ceph auth ls |grep kubevirt -A 1"? ? ? ? ? ? ?Csi-rbdplugin kms 配置去除#-?name:?ceph-csi-encryption-kms-config#configMap:#name:?ceph-csi-encryption-kms-config? ? ? ? ? ? 启动服务kubectl?apply?-f?cm-ceph-config.yamlkubectl?apply?-f?csi-config-map.yamlkubectl?apply?-f?csi-rbd-sc.yamlkubectl?apply?-f?secret-csi-rbd.yamlkubectl?apply?-f?csi-nodeplugin-rbac.yamlkubectl?apply?-f?csi-provisioner-rbac.yamlkubectl?apply?-f?csi-rbdplugin-provisioner.yamlkubectl?apply?-f?csi-rbdplugin.yaml?服务检查External-snapshotter 部署? 下载yaml文件wget?1.?
https://github.com/kubernetes-csi/external-snapshotter/archive/refs/tags/v6.1.0.tar.gztar?-xzvf?v6.1.0.tar.gz? 启动服务cd?./external-snapshotter-6.1.0/client/config/crdkubectl?apply?-f?snapshot.storage.k8s.io_volumesnapshotcontents.yamlkubectl?apply?-f?snapshot.storage.k8s.io_volumesnapshots.yamlkubectl?apply?-f?snapshot.storage.k8s.io_volumesnapshotclasses.yamlcd?./kubevirt/external-snapshotter-6.1.0/deploy/Kubernetes/kubectlcreate-f?csi-snapshotter/kubectlcreate-f?snapshot-controller/? ?检查服务
https://github.com/kubevirt/kubevirt/releases/download/v0.55.2/virtctl-v0.55.2-linux-amd64?cp?-frvirtctl-v0.55.2-linux-amd64?/usr/bin//virtctl ? ? ? ? ? 获取cdi upload proxy 地址kubectlget?all?-n?kubevirt?|grep?'cdi-uploadproxy'|grep?'ClusterIP'|awk?'{print?$3}'? ? ? ? ? ? 上传镜像virtctl?image-upload--namespace=vm-windows-12?--pvc-size=129G?--storage-class=csi-rbd-sc--pvc-name=windows2012?--image-path=/data/windows2012.qcow2--uploadproxy-url=https://uploadproxy:ip?–insecure创建系统镜像snapshot? ? ? ?构建 snapshotclass.yamlapiVersion:?snapshot.storage.k8s.io/v1kind:?VolumeSnapshotClassmetadata:name:?ceph-rbd-classnamespace:?csidriver:?rbd.csi.ceph.comparameters:?clusterID:?ceph?集群ID?csi.storage.k8s.io/snapshotter-secret-name:?csi-rbd-secret?csi.storage.k8s.io/snapshotter-secret-namespace:?csi?deletionPolicy:?Delete? ? ? ? ? ? ? ? 构建 windows-snapshot.yamlapiVersion:?snapshot.storage.k8s.io/v1kind:?VolumeSnapshotmetadata:name:?windows2012-snapnamespace:?vm-windows-12spec:volumeSnapshotClassName:?ceph-rbd-classsource:persistentVolumeClaimName:?windows2012? ? ? ? ? ? ? ?创建volumesnaptkubectl?apply?-f?snapshotclass.yamlkubectl?apply?-f?windows-snapshot.yaml? ? ? 获取volumesnapshot 状态Kubectl get volumesnapshot -n vm-windows创建VM? ? ? 创建数据磁盘DATA(win12-snap2-data.yaml)apiVersion:?v1kind:?PersistentVolumeClaimmetadata:name:?win12-snap2-datanamespace:?vm-windows-12spec:accessModes:-?ReadWriteOncevolumeMode:?Blockresources:requests:storage:?200GistorageClassName:?csi-rbd-sc? ? ? ? ? ? ? ?创建系统镜像OS(win12-snap2-os.yaml)apiVersion:?v1kind:?PersistentVolumeClaimmetadata:name:?win12-snap2-osnamespace:?vm-windows-12spec:storageClassName:?csi-rbd-scdataSource:name:?windows2012-snapkind:?VolumeSnapshotapiGroup:?snapshot.storage.k8s.ioaccessModes:-?ReadWriteOnceresources:requests:storage:?129Gi? ? ? ? ? ?构建VM模板(win12-snap2.yaml)apiVersion:?kubevirt.io/v1kind:?VirtualMachinemetadata:name:?win12-snap2namespace:?vm-windows-12labels:?network:?fixedip?#vm?设置固定IP,基于calico二次开发spec:running:?truetemplate:metadata:labels:kubevirt.io/vm:?win12-snap2ccnetwork:?fixedipspec:terminationGracePeriodSeconds:?30domain:resources:requests:memory:?24Gicpu:?cores:?16?sockets:?1?threads:?1devices:networkInterfaceMultiqueue:?true?#开启网卡多队列模式blockMultiQueue:?true?#开启磁盘多队列模式disks:-?disk:bus:?virtioname:?win12-snap2-os?#定义基于snap快速构建OS镜像-?disk:bus:?virtioname:?win12-snap2-data?#定义RBD?数据盘interfaces:-?bridge:?{}name:?defaultnetworks:-?name:?defaultpod:?{}nodeSelector:node-role.kubernetes.io/BIZ-Kubevirt:?"true"volumes:-?name:?win12-snap2-ospersistentVolumeClaim:claimName:?win12-snap2-os-?name:?win12-snap2-datapersistentVolumeClaim:claimName:?win12-snap2-data? ? ? ? ? ? ? ? 启动VMkubectl?apply?-f?win12-snap2-data.yamlkubectl?apply?-f?win12-snap2-os.yamlkubectl?apply?-f?win12-snap2.yaml?VNC 部署(暴漏VM控制台)?wget?
https://github.com/wavezhang/virtVNC/raw/master/k8s/virtvnc.yaml设置virtvnc namespace kubevirt? ?启动vnc服务? ?Kubectl apply -f virtvnc.yaml针对测试环境POD为暴漏,可通过ingress 提供服务apiVersion:?networking.k8s.io/v1kind:?Ingressmetadata:name:?virtvncnamespace:?kubevirtspec:ingressClassName:?nginxrules:-?host:?kubevnc.xxx.xxx.comhttp:paths:-?path:?/pathType:?Prefixbackend:service:name:?virtvncport:number:?80014.未来展望深入k8s技术探索,推进kubevirt在非典型的容器化场景中解决用户棘手问题,帮助业务全面容器化,实现虚拟化技术栈统一,实现之家技术全面容器化最后一公里。作者简介盛旺强云平台部-技术保障团队-系统运维组。2014年加入汽车之家,任职与云平台部技术保障团队,主要负责虚拟化,容器化及运维相关工作阅读更多:多模态算法在AIGC视频生成中的应用MetrAutoAPI系统架构设计汽车之家敏感数据治理实践