Kubevirt实战:把Windows/Legacy应用‘装进’K8s Pod里运行,我是怎么做到的?
Kubevirt实战:将Windows/Legacy应用无缝集成到K8s生态的完整指南
当企业技术栈中同时存在现代化微服务和传统单体应用时,基础设施团队常常面临两难选择。我们最近帮助一家金融机构将核心交易系统迁移到Kubernetes时,就遇到了一个典型场景:他们的风险计算模块仍运行在Windows Server 2008 R2上,依赖特定的COM组件和注册表配置,而周边服务已经全部容器化。通过Kubevirt,我们最终实现了整个系统的统一编排,以下是实战经验的全记录。
1. 理解Kubevirt的核心价值与架构原理
Kubevirt本质上是在Kubernetes的抽象层之上构建了虚拟机管理能力,其架构设计充分复用了K8s的原生组件。与常见误解不同,它并非简单地在Pod里运行虚拟机,而是通过一系列精心设计的控制器实现虚拟化资源与容器资源的统一调度。
核心组件协同工作原理:
- virt-api:作为Kubernetes API的扩展,处理
VirtualMachineInstance(VMI)等自定义资源的CRUD操作 - virt-controller:监控VMI资源状态,确保实际运行状态与声明式配置保持一致
- virt-handler(DaemonSet):每个节点运行一个实例,负责本节点虚拟机的生命周期管理
- virt-launcher:每个VMI对应一个Pod,内部运行libvirtd管理具体的QEMU-KVM进程
关键设计哲学:利用Kubernetes已有的调度、网络、存储能力,仅补充虚拟机特有的管理功能,避免重复造轮子。
传统虚拟化与Kubevirt架构对比:
| 特性 | 传统虚拟化方案 | Kubevirt方案 |
|---|---|---|
| 调度单元 | 虚拟机 | Pod(内含虚拟机) |
| 网络模型 | 自定义SDN | K8s Service/CNI |
| 存储管理 | 独立存储系统 | PVC/PV |
| 监控体系 | 专用监控代理 | Prometheus Operator |
| 资源隔离 | 强隔离 | 依赖K8s命名空间隔离 |
2. 生产级Kubevirt环境部署要点
在CentOS 8.4上的实测部署中,我们发现以下几个配置项对稳定性影响最大:
# 节点预检(所有计算节点执行) sudo yum install -y qemu-kvm libvirt virt-install bridge-utils sudo systemctl enable --now libvirtd virt-host-validate qemu # 必须通过所有检查项 # 当硬件不支持VT-x时(常见于云主机) kubectl edit kubevirt kubevirt -n kubevirt添加以下配置:
spec: configuration: developerConfiguration: useEmulation: true # 启用软件模拟 network: permitSlirpInterface: true # 允许Windows虚拟机网络高可用部署方案:
- 使用KubeVirt Operator管理核心组件
export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | jq -r .tag_name) kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml- 必须配套部署CDI(Containerized Data Importer)用于虚拟机镜像管理
export CDI_VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*") kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-operator.yaml kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-cr.yaml3. Windows虚拟机在K8s中的实战配置
以Windows Server 2019为例,以下是经过生产验证的配置模板:
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: win2019-sql spec: running: false # 保持关机状态便于配置 template: metadata: labels: kubevirt.io/domain: win2019-sql spec: domain: cpu: cores: 4 sockets: 1 threads: 1 devices: disks: - disk: bus: sata name: system - disk: bus: sata name: data interfaces: - name: default masquerade: {} # 使用K8s网络 machine: type: q35 resources: requests: memory: 8Gi networks: - name: default pod: {} # 使用Pod网络 volumes: - name: system persistentVolumeClaim: claimName: win2019-system - name: data persistentVolumeClaim: claimName: sql-data-disk关键优化参数说明:
- cpu模型:对于Windows虚拟机,建议显式指定
cpu.model: host-passthrough以获得最佳性能 - 磁盘总线类型:Windows对virtio驱动支持有限,建议使用
sata或scsi - QEMU代理:安装qemu-ga可增强管理能力
# 在Windows虚拟机内执行: Add-WindowsFeature -Name "QEMU-GA" -IncludeAllSubFeature4. 混合编排下的运维实践
服务暴露方案对比:
| 暴露方式 | 适用场景 | 配置示例 | 优缺点 |
|---|---|---|---|
| ClusterIP | 集群内部服务调用 | 自动创建 | 简单但无法外部访问 |
| NodePort | 开发测试环境 | virtctl expose vmi --type=NodePort | 需要维护端口映射表 |
| LoadBalancer | 生产环境外部访问 | 配合Ingress Controller | 需要云提供商支持 |
| Ingress | 基于路径/域名的访问控制 | 需额外部署Ingress资源 | 最灵活但配置复杂 |
性能监控方案:
- 部署KubeVirt监控组件
kubectl apply -f https://github.com/kubevirt/monitoring/releases/download/v0.1.0/kubevirt-prometheus-metrics.yaml- 示例Grafana监控指标:
kubevirt_vmi_memory_used_bytes:虚拟机内存使用量kubevirt_vmi_cpu_usage_seconds:CPU累计使用时间kubevirt_vmi_network_traffic_bytes_total:网络流量
迁移实战案例: 某ERP系统从VMware迁移到Kubevirt的步骤:
- 使用
qemu-img convert将VDI镜像转为qcow2格式 - 通过CDI上传到K8s集群:
apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: erp-system-disk spec: source: registry: url: "docker://kubevirt/registry-disk-v1alpha" pvc: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi5. 关键决策点与技术权衡
何时选择Kubevirt而非传统容器化:
必须使用场景:
- 依赖特定内核版本或内核模块
- 需要Windows GUI应用
- 使用硬件直通设备(如GPU、加密卡)
不建议使用场景:
- 无状态Web应用
- 可轻松重构的轻量级服务
- 对启动时间敏感(<5s)的业务
性能优化检查清单:
- 确保节点开启KVM加速:
grep -E '(vmx|svm)' /proc/cpuinfo- 为关键虚拟机启用巨页:
domain: memory: hugepages: pageSize: "1Gi"- 配置CPU绑核避免上下文切换:
cpu: dedicatedCpuPlacement: true在金融行业的实际落地中,我们总结出最佳实践是:将Kubevirt虚拟机作为过渡方案,同时制定3年内的应用现代化路线图。某客户的生产数据显示,混合部署后运维效率提升40%,但虚拟机Pod的冷启动时间仍比原生容器长8-12秒,这在设计自动扩缩容策略时需要特别注意。
